Iris 품종 분류

LEEEEE·2022년 1월 6일
0

Iris 품종 분류하기

사이킷런(scikit-learn)에서 제공하는 데이터이다. scikit-learn이 제공하는 데이터는 아래 링크에서 확인할 수 있다.

Scikit-learn 데이터셋

데이터 확인하기

scikit-learn의 예제 데이터셋은 sklearn 라이브러리에 datasets패키지 안에 있다.

from sklearn.datasets import load_iris

iris = load_iris()
iris.keys()
/------------------------------------/
# 출력
dict_keys(['data', 'target', 'frame', 'target_names', 'DESCR', 'feature_names', 'filename', 'data_module'])

iris에는 data, target, frame, target_names, DESCR, feature_names, filename 까지 총 7개의 정보가 담겨 있는 것을 확인할 수 있다.

데이터의 크기를 확인하려면 .shape을 이용하면 된다.

iris_data = iris.data

print(iris_data.shape) 
/--------------------/
# 출력
(150, 4)

총 150개의 데이터가 각각 4개의 정보를 담고 있는 것을 확인할 수 있다.

iris_data[100]
/------------/
# 출력
array([6.3, 3.3, 6. , 2.5])

각 데이터는 순서대로 sepal length, sepal width, petal length, petal width를 나타낸다. 이 정보를 이용해 머신러닝 모델에게 꽃잎, 꽃받침의 길이와 폭 정보를 입력했을 때, 붓꽃의 품종을 출력하도록 학습할 예정이다.

여기서 모델이 출력해야 하는 정답을 라벨(label) 또는 타겟(target) 이라고 한다.

붓꽃 데이터에서 타겟 정보는 다음과 같이 target으로 볼 수 있다.

iris_label = iris.target
print(iris_label.shape)
iris_label
/----------------------/
# 출력
(150,)
array([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])

라벨 이름은 target_names로 확인할 수 있다.

iris.target_names
/---------------/
# 출력
array(['setosa', 'versicolor', 'virginica'], dtype='<U10')

데이터 준비하기

iris데이터는 2차원 데이터이므로 pandas를 활용해 데이터를 준비해보자.

import pandas as pd
iris_df = pd.DataFrame(data=iris_data, columns=iris.feature_names)
iris_df
/----------------------------------------------------------------/
# 출력
	sepal length (cm)	sepal width (cm)	petal length (cm)	petal width (cm)
0	5.1			3.5			1.4			0.2
1	4.9			3.0			1.4			0.2
2	4.7			3.2			1.3			0.2
3	4.6			3.1			1.5			0.2
4	5.0			3.6			1.4			0.2
...	...			...			...			...
145	6.7			3.0			5.2			2.3
146	6.3			2.5			5.0			1.9
147	6.5			3.0			5.2			2.0
148	6.2			3.4			5.4			2.3
149	5.9			3.0			5.1			1.8

150 rows × 4 columns

DataFrame 을 만들면서 data에는 iris_data를 넣어주고, 각 컬럼에는 feature_names로 이름을 붙여준다.
추가로 정답 데이터도 함께 있다면 데이터를 다루기 더 편하니 label이라는 컬럼을 추가해준다.

iris_df["label"] = iris.target
iris_df.head()
/----------------------------/
# 출력
	sepal length (cm)	sepal width (cm)	petal length (cm)	petal width (cm)	label
0	5.1			3.5			1.4			0.2			0
1	4.9			3.0			1.4			0.2			0
2	4.7			3.2			1.3			0.2			0
3	4.6			3.1			1.5			0.2			0
4	5.0			3.6			1.4			0.2			0
  • 문제지 : 머신러닝 모델에게 입력되는 데이터. feature라고 부르기도 한다. 변수 이름으로는 X를 많이 사용한다.
  • 정답지 : 머신러닝 모델이 맞혀야 하는 데이터. label 또는 target이라고 부르기도 한다. 변수 이름으로는 y를 많이 사용한다.

이제 학습에 필요한 training dataset과 성능 평가에 필요한 test dataset을 나눠보자.

scikit-learn은 train_test_split을 통해 간단하게 분리할 수 있다.

from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(iris_data, 
                                                    iris_label, 
                                                    test_size=0.2, 
                                                    random_state=7)

print('X_train 개수: ', len(X_train),', X_test 개수: ', len(X_test))
/-----------------------------------------------------------------/
# 출력
X_train 개수:  120 , X_test 개수:  30

random_statetraintest를 분리할 때 적용되는 랜덤성을 결정한다. 기존 데이터 그대로 분리하면 라벨이 순서대로 적용되어 있어 학습이 정상적으로 이뤄지지 않기 때문에 데이터를 분리할 때 랜덤으로 섞는 과정이 필요하다.

분리한 데이터를 출력해보자.

y_train, y_test
/-------------/
# 출력
(array([2, 1, 0, 2, 1, 0, 0, 0, 0, 2, 2, 1, 2, 2, 1, 0, 1, 1, 2, 0, 0, 0,
        2, 0, 2, 1, 1, 1, 0, 0, 0, 1, 2, 1, 1, 0, 2, 0, 0, 2, 2, 0, 2, 0,
        1, 2, 1, 0, 1, 0, 2, 2, 1, 0, 0, 1, 2, 0, 2, 2, 1, 0, 1, 0, 2, 2,
        0, 0, 2, 1, 2, 2, 1, 0, 0, 2, 0, 0, 1, 2, 2, 1, 1, 0, 2, 0, 0, 1,
        1, 2, 0, 1, 1, 2, 2, 1, 2, 0, 1, 1, 0, 0, 0, 1, 1, 0, 2, 2, 1, 2,
        0, 2, 1, 1, 0, 2, 1, 2, 1, 0]),
 array([2, 1, 0, 1, 2, 0, 1, 1, 0, 1, 1, 1, 0, 2, 0, 1, 2, 2, 0, 0, 1, 2,
        1, 2, 2, 2, 1, 1, 2, 2]))

label이 무작위로 섞여 있는 것을 확인할 수 있다.


모델 학습하기

분류 모델 중 기본적인 Decision Tree를 사용해보자.

from sklearn.tree import DecisionTreeClassifier

decision_tree = DecisionTreeClassifier(random_state=32)

decision_tree.fit(X_train, y_train)
/-----------------------------------------------------/
# 출력
DecisionTreeClassifier(random_state=32)

모델 평가

y_pred = decision_tree.predict(X_test)
y_pred
/------------------------------------/
# 출력
array([2, 1, 0, 1, 2, 0, 1, 1, 0, 1, 2, 1, 0, 2, 0, 2, 2, 2, 0, 0, 1, 2,
       1, 1, 2, 2, 1, 1, 2, 2])

예측 데이터와 정답 데이터와 비교해 정확도를 측정해보자.

from sklearn.metrics import accuracy_score

accuracy = accuracy_score(y_test, y_pred)
accuracy
/----------------------------------------/
# 출력
0.9

정확도는 전체 개수 중 맞은 것의 개수의 수치를 나타낸다.


0개의 댓글