[ML] Intro - iris 품종 예측하기 - 최소한의 머신러닝

강주형·2022년 6월 30일
0

여기서는 최소한의 코드만 사용해서 파이썬에서 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

Feature와 Label 변수 설정

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)))
profile
Statistics & Data Science

0개의 댓글