(ML)붓꽃 품종 분류하기

지며리·2023년 2월 3일
0
post-custom-banner


1. 머신러닝의 정의

  • 명시적인 프로그램에 의해서가 아니라, 주어진 데이터를 통해 규칙을 찾는 것

붓꽃의 3가지 품종 versicolor, virginica, setosa를 꽃잎(petal), 꽃받침(sepal)의 길이, 너비로 구분해보자

2. 붓꽃 데이터 EDA

  • 붓꽃은 프랑스 국화로 그리스 신화의 무지개의 여신인 Iris에서 꽃명이 유래

데이터 로드 후 데이터 프레임 변환

from sklearn.datasets import load_iris

iris = load_iris()
iris.keys()

  • iris데이터는 dict와 유사한 형태로 구성되어 있다.
iris.feature_names

iris_pd = pd.DataFrame(iris.data, columns = iris.feature_names)
iris_pd.head()

#iris.target은 붓꽃 품종에 따라 0, 1, 2로 분류해놓은 값
iris_pd['species'] = iris.target
iris_pd.head()


데이터 탐색

import seaborn as sns
import matplotlib.pyplot as plt

sns.pairplot(iris_pd, hue = 'species' )

  • 품종 별로 petal length, petal width, sepal length, sepal width 분포가 분리되는 경향이 있음을 알 수 있다.
  • 그래프로 확인하기 용이하게 petal length, petal width 2가지 차원만 써서(iris.data[:,2:]) 머신러닝 모델을 적용해보자.

3. 머신러닝 적용

DecisionTreeClassifier 활용

from sklearn.tree import DecisionTreeClassifier
from sklearm.metrics import accuracy_score

iris_tree = DecisionTreeClassifier()

## 학습
iris_tree.fit(iris.data[:, 2:], iris.target)

## 예측
y_pred_tr = iris_tree.predict(iris.data[:, 2:])

accuracy_score(iris.target, y_pred_tr)

위 성능은 이미 답을 알려준 상태에서 문제를 풀어보고 테스트한 성능이므로 신뢰도가 제한적이다. 성능에 대한 평가가 유효하기 위해서는 학습용과 테스트용 데이터 셋을 분리할 필요가 있다.

학습용, 테스트용 데이터 셋 분리

from sklearn.model_selection import train_test_split

feature = iris.data[:, 2:]
labels = iris.target

# test_size= 0.2 -> 8:2 비율로 학습용과 테스트용 데이터 셋 분리
# stratify = labels -> labels 기준으로 분포 고르게 분리
X_train, X_test, y_train, y_test = train_test_split(feature, labels,\
													test_size = 0.2,\
												random_state = 13, stratify= labels)
                                                
X_train.shape, X_test.shape

  • 8:2로 데이터셋이 분리되어 있음을 알 수 있다.
import numpy as np
np.unique(y_test, return_counts= True)

  • label(붓꽃 품종 별로 0, 1, 2 값을 나타냄)이 고르게 분포되어 있음을 알 수 있다.

학습용 데이터 셋으로 학습, 데이터 셋으로 예측, 정확도 평가

## DecisionTreeClassifier의 몇가지 옵션(하이퍼파라미터)을 다르게 설정
iris_tree = DecisionTreeClassifier(max_depth = 2, random_state = 13)
iris_tree.fit(X_train, y_train)

y_pred_tr = iris_tree.predict(iris.data[:, 2:])
y_pred_test = iris_tree.predict(X_test)

accuracy_score(iris.target, y_pred_tr)
accuracy_score(y_test, y_pred_test)


4. 결과 데이터 시각화

#!pip install mlxtend
from mlxtend.plotting import plot_decision_regions

# 각각 사이즈, 라벨, 투명도
scatter_highlight_kwargs = {'s': 150, 'label': 'Test data', 'alpha' :0.9}

scatter_kwargs = {'s': 120, 'edgecolor': None, 'alpha' :0.9}

plt.figure(figsize = (12,8))

plot_decision_regions\
(X=feature, y= labels, X_highlight = X_test, clf = iris_tree, \
legend = 2, scatter_highlight_kwargs = scatter_highlight_kwargs, \

scatter_kwargs = scatter_kwargs, contourf_kwargs = {'alpha':0.2})
plt.show()

from sklearn.tree import plot_tree
plt.figure(figsize=(12, 8))
plot_tree(iris_tree);

  • max_depth를 2로 설정했기 때문에 가지가 2개까지만 내려온다.

5. DecisionTreeClassifier의 원리

정보획득

  • 어떤 속성을 선택함으로 인해서 데이터를 잘 구분하게 되는 것

엔트로피

  • 열역학의 용어로 물질의 열적 상태를 나타내는 물리량의 단위중 하나. 무질서의 정도
  • 엔트로피가 높으면 무질서도, 불확실성이 높고 적은 정보를 담고 있음.

  • plog2p-plog_{2}p는 다음과 같은 특성을 가지고 있음.

엔트로피 연습

  • 분할하기 전

  • 분할 후

  • 엔트로피가 내려갔으므로 분할하는 것이 나음.

지니계수

  • 엔트로피는 컴퓨터가 계산하기 용이하지 않아 대체 지표로 지니계수를 사용함.
profile
쉽고 유익하게 널리널리
post-custom-banner

0개의 댓글