여기서는 최소한의 코드만 사용해서 파이썬에서 scikit-learn으로 iris 품종을 어떻게 예측하는지를 본다.
sklearn은 iris 데이터세트를 내장하고 있다.
from sklearn.datasets import load_iris
여기서 사용할 모델은 DecisionTreeClassifier이다.
from sklearn.tree import DecisionTreeClassifier
train/test 데이터를 나누는 기능을 하는 train_test_split
from sklearn.model_selection import train_test_split
import pandas as pd
# 붓꽃 데이터 세트를 로딩
iris = load_iris()
# iris.data는 Iris 데이터 세트에서 피처(feature)만으로 된 데이터를 numpy로 가짐
iris_data = iris.data
# iris.target은 붓꽃 데이터 세트에서 레이블(결정 값) 데이터를 numpy로 가짐
iris_label = iris.target
print('iris target값:', iris_label)
print('iris target명:', iris.target_names)
iris target값: [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2]
iris target명: ['setosa' 'versicolor' 'virginica']
iris_df = pd.DataFrame(data=iris_data, columns=iris.feature_names)
iris_df['label'] = iris.target
iris_df.head(3)
X_train, X_test, y_train, y_test = train_test_split(iris_data, iris_label,
test_size=0.2, random_state=11)
train_test_split(Feature, Label) 순으로 넣어주면 됨
test_size: test 데이터세트 사이즈를 몇으로 할 건지? 여기서는 20%
random_state: seed로 생각하면 됨, random_state를 넣어주면 여러번 코드를 돌려도 똑같이 분리가 되어서 동일한 결과가 나옴
X_train: train 데이터의 Feature
X_test: test 데이터의 Feature
y_train: train 데이터의 Label
y_test: test 데이터의 Label
여기서는 DecisionTreeClassifier
모델을 사용함
# DecisionTreeClassifier 객체 생성
dt_clf = DecisionTreeClassifier(random_state=11)
# 학습 수행
dt_clf.fit(X_train, y_train)
학습(fit)은 반드시 train 데이터로만 해야한다.
실전 데이터에서는 Feature에 대한 Label(정답)이 없겠지?
test 데이터로 학습(fit)을 하는 것은 정답지를 보고서 문제를 푸는 것과 같다!
train 데이터로 학습이 끝났으면, 그 학습된 모델을 사용해서 X_test의 정답(y_test)
을 예측하는 것임
pred = dt_clf.predict(X_test)
평가 지표로는 여러가지가 있는데 여기서는 accuracy_score
를 사용함
from sklearn.metrics import accuracy_score
print('예측 정확도: {0:.4f}'.format(accuracy_score(y_test,pred)))
예측 정확도: 0.9333
정답(y_test)
과우리가 X_train으로 학습해서 X_test에 대해 예측한 예측 정답(pred)
이 얼마나 비슷한지를 확인하는 것임
93.33% 비슷하다고 결과가 나온 것!
실전에서 사용하는 데이터에는 Feature에 대한 Label(정답)이 없다는 것을 생각하기
from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split
import pandas as pd
# 붓꽃 데이터 세트를 로딩
iris = load_iris()
# iris.data는 Iris 데이터 세트에서 피처(feature)만으로 된 데이터를 numpy로 가짐
iris_data = iris.data
# iris.target은 붓꽃 데이터 세트에서 레이블(결정 값) 데이터를 numpy로 가짐
iris_label = iris.target
print('iris target값:', iris_label)
print('iris target명:', iris.target_names)
# 붓꽃 데이터 세트를 자세히 보기 위해 DataFrame으로 변환
iris_df = pd.DataFrame(data=iris_data, columns=iris.feature_names)
iris_df['label'] = iris.target
iris_df.head(3)
X_train, X_test, y_train, y_test = train_test_split(iris_data, iris_label, test_size=0.2, random_state=11)
# DecisionTreeClassifier 객체 생성
dt_clf = DecisionTreeClassifier(random_state=11)
# 학습 수행
dt_clf.fit(X_train, y_train)
# 학습이 완료된 DecisionTreeClassifier 객체에서 테스트 데이터 세트로 예측 수행
pred = dt_clf.predict(X_test)
from sklearn.metrics import accuracy_score
print('예측 정확도: {0:.4f}'.format(accuracy_score(y_test,pred)))