1. 머신러닝
1.1 지도학습이란
- 학습 대상이 되는 데이터에 정답(label)을 붙여서 학습 시키고
- 모델을 얻어서 완전히 새로운 데이터에 모델을 사용해서 ‘답’을 얻고자 하는것
1.2 데이터의 분리 (훈련(train)/ 검증(validation)/ 평가(test))
- 전체 데이터에서 train / test 로 데이터를 분리하고
- train 데이터를 validation 데이터로 또다시 분리하는 것
- 과적합을 피하기 위해 실행
1.3 과적합이란
- 모델이 train데이터에 너무 맞춰저서 학습하게 되는것
- 머신러닝 기초 - 의사결정나무(1)에서 결정 경계의 선이 복잡했던것을 떠올리면 된다.
2. iris data로 실습
2.1 데이터 로드 후 분리
1
2
3
4
5
6
7
8
from sklearn.datasets import load_iris
iris = load_iris()
from sklearn.model_selection import train_test_split
features = iris.data[:, 2:]
labels = iris.target
X_train, X_test, y_train, y_test = train_test_split(features, labels, test_size = 0.2, random_state = 13, stratify = labels)
- 종속변수(y, target)값의 비율이 동일하게 하기 위해서는 stratify 옵션을 주면 됨
- 위의 코드는 8:2로 train, test 데이터가 분리됨
2.2 train으로만 Decssion Tree Model 생성
1
2
3
4
from sklearn.tree import DecisionTreeClassifier
iris_tree = DecisionTreeClassifier(max_depth=2, random_state=13)
iris_tree.fit(X_train, y_train)
- 학습할 때 마다 일관성을 위해 random_state만 고정
- 모델을 단순화시키기 위해 max_depth를 조정
2.3 train data 의 Accuracy 확인
1
2
3
4
from sklearn.metrics import accuracy_score
y_pred_tr = iris_tree.predict(X_train)
accuracy_score(y_train, y_pred_tr)
1
0.95
- iris데이터는 단순해서 acc가 높게 나타남
2.4 모델 확인 with Graphviz
1
2
3
4
5
6
from graphviz import Source
from sklearn.tree import export_graphviz
Source(export_graphviz(iris_tree, feature_names=['length', 'width'],
class_names=iris.target_names,
rounded=True, filled=True))
2.5 훈련 데이터에 대한 결정경계 확인
1
2
3
4
5
6
import matplotlib.pyplot as plt
from mlxtend.plotting import plot_decision_regions
plt.figure(figsize = (12, 8))
plot_decision_regions(X= X_train, y= y_train, clf = iris_tree, legend= 2)
plt.show()
2.6 테스트 데이터에 대한 accuracy
1
2
y_pred_test = iris_tree.predict(X_test)
accuracy_score(y_test, y_pred_test)
1
0.9666666666666667
2.7 테스트 데이터에 대한 경계
1
2
3
4
5
6
import matplotlib.pyplot as plt
from mlxtend.plotting import plot_decision_regions
plt.figure(figsize = (12, 8))
plot_decision_regions(X= X_test, y= y_test, clf = iris_tree, legend= 2)
plt.show()
2.8 전체 데이터에서 관찰하기
1
2
3
4
5
6
7
8
9
scatter_highlight_kwargs = {'s': 150, 'label': 'Test data', 'alpha': 0.9}
scatter_kwargs = {'s' : 120, 'edgecolor': None, 'alpha': 0.7}
plt.figure(figsize=(12, 8))
plot_decision_regions(X=features, 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()
2.9 feature를 네 개
1
2
3
4
5
6
7
8
9
10
11
12
13
features = iris.data
labels = iris.target
X_train, X_test, y_train, y_test = train_test_split(features, labels,
test_size=0.2,
stratify=labels,
random_state=13)
iris_tree = DecisionTreeClassifier(max_depth=2, random_state=13)
iris_tree.fit(X_train, y_train)
Source(export_graphviz(iris_tree, feature_names=iris.feature_names, class_names=iris.target_names,
rounded=True, filled=True))
2.10 모델 사용법
1
2
3
# 길가다가 주운 iris가 sepal과 petal의 length, width가 각각 [4.3, 2. , 1.2, 1.0]이라면
test_data = [[4.3, 2.0, 1.2, 1.0]]
iris_tree.predict_proba(test_data)
1
array([[0. , 0.97222222, 0.02777778]])
1
2
# 각 클래스별 확률이 아니라 범주값을 바로 알고 싶다면
iris.target_names
1
array(['setosa', 'versicolor', 'virginica'], dtype='<U10')
1
2
test_data = [[4.3, 2.0, 1.2, 1.0]]
iris.target_names[iris_tree.predict(test_data)]
1
array(['versicolor'], dtype='<U10')
2.11 주요특성 확인하기
- Black box / White box 모델
- Tree계열 알고리즘은 특성을 파악하는데 장점을 가진다
1
iris_tree.feature_importances_
1
array([0. , 0. , 0.42189781, 0.57810219])
1
2
iris_clf_model = dict(zip(iris.feature_names, iris_tree.feature_importances_))
iris_clf_model
1
2
3
4
{'sepal length (cm)': 0.0,
'sepal width (cm)': 0.0,
'petal length (cm)': 0.421897810218978,
'petal width (cm)': 0.578102189781022}