명시적인 프로그램에 의해서가 아니라, 주어진 데이터를 통해 규칙을 찾는 것
꽃잎(petal), 꽃받침(sepal)의 길이/너비 정보를 이용해서 이 3종의 품종을 구분할 수 있을것인가?
# sklearn에서 제공하는 iris 데이터
from sklearn.datasets import load_iris
iris = load_iris()
iris
iris.keys()
print(iris['DESCR'])
print(iris['target_names'])
print(iris['target'])
'setosa' - 0, 'versicolor'- 1, 'virginica' - 2 (각 50개)
import pandas as pd
iris_pd = pd.DataFrame(iris.data, columns=iris.feature_names)
iris_pd.head()
species
컬럼 추가하기iris_pd['species'] = iris.target
iris_pd.head()
iris_pd.tail()
import matplotlib.pyplot as plt
import seaborn as sns
sns.boxplot(x='sepal length (cm)', y='species', data=iris_pd, orient='h');
# plt.figure(figsize=(12, 6))
sns.boxplot(x='sepal width (cm)', y='species', data=iris_pd, orient='h');
sns.boxplot(x='petal length (cm)', y='species', data=iris_pd, orient='h');
sns.boxplot(x='petal width (cm)', y='species', data=iris_pd, orient='h');
-> petal length, petal width로 구분했을때 setosa(0번)
은 비교적 구분이 잘 되는 것을 확인 할 수 있다. 하지만 sepal length, sepal width, petal length, petal width 모두 versicolor(1번)
, virginica(2번)
은 구분이 쉽지 않다는 것이 그래프로 확인 된다.
sns.pairplot(iris_pd, hue='species')
sns.scatterplot(x='petal length (cm)', y='petal width (cm)', data=iris_pd, hue='species', palette='Set2');
위 두 데이터로 봐도 0번은 구분이 잘 되는 반면 1, 2는 겹쳐진 부분들이 있다는 것이 확인된다. 하지만 구분이 가능 할 것 같다는 생각이 든다.
이렇게 규칙을 생각해볼 수 있겠다.
하지만 근거가 있는가? 저렇게 결론을 내도 되는 것인가?에 대한 답변은 알 수 없다.
so, 알고리즘 등장!
경계선이 어디에 있는 것이 최선일까?
(Split Criterion)
import numpy as np
# 0.001부터 1까지 0.001 간격으로
p = np.arange(0.001, 1, 0.001)
plt.grid()
plt.title('$-p \log_{2}{p}$') # $ - 수학 표현법으로 출력
plt.plot(p, -p*np.log2(p));
그렇다면 다시 iris로 돌아와서
iris12 = iris_pd[iris_pd['species']!=0]
iris12
_clf
(Classifier 약자)가 사용될 때가 있음 지금은 그냥 tree라고 저장하자#DecisionTree로 된 분류기
from sklearn.tree import DecisionTreeClassifier
iris_tree = DecisionTreeClassifier()
iris.data[:, 2:]
fit
: 데이터와 정답을 줄테니 학습해!iris_tree.fit(iris.data[:, 2:], iris.target)
여기까지 학습 완료
from sklearn.metrics import accuracy_score
# iris_tree -> 학습이 완료된 상태
# iris.data[:, 2:] 데이터를 줄테니 맞춰봐(predict) -> 지금은 정답을 주지 않음
y_pred_tr = iris_tree.predict(iris.data[:, 2:])
y_pred_tr
iris.target
accuracy_score(iris.target, y_pred_tr)
from sklearn.tree import plot_tree
# iris_tree -> 학습된 모델
# 학습된 모델의 구조 구현
plot_tree(iris_tree);
#!pip install mlxtend
from mlxtend.plotting import plot_decision_regions
plt.figure(figsize=(12,6))
plot_decision_regions(X=iris.data[:,2:], y=iris.target, clf=iris_tree, legend=2)
plt.show()
그럼 accuracy가 99.3%라고 해서 다 믿을 수 있을 것인가!!? nope!
150개 데이터가 모든 세상의 iris 데이터를 대변할 수 있을까? -> 문제점 -> outlier 인것은 아닐까?
저 튀어나온 데이터가 돌연변이 같은 것일 수도 있다.
원래는 저렇게 튀어나올 확률이 굉장히 적은데 하필 저 데이터가 돌연변이로 튀어나온 데이터 일 수 있다!! (일반화 할 수 없다.)
내가 가진 150개 데이터로는 확인할 방법이 없다.
너무 accuracy가 99% 를 가지도록 만드는 것(복잡한 경계면을 가지게 하는 것)이 올바르지 않을 수도 있다고 생각해야함
"이 글은 제로베이스 데이터 취업 스쿨 강의를 듣고 작성한 내용으로 제로베이스 데이터 취업 스쿨 강의 자료 일부를 발췌한 내용이 포함되어 있습니다."