사이킷런(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
X
를 많이 사용한다.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_state
는 train
과 test
를 분리할 때 적용되는 랜덤성을 결정한다. 기존 데이터 그대로 분리하면 라벨이 순서대로 적용되어 있어 학습이 정상적으로 이뤄지지 않기 때문에 데이터를 분리할 때 랜덤으로 섞는 과정이 필요하다.
분리한 데이터를 출력해보자.
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
정확도는 전체 개수 중 맞은 것의 개수의 수치를 나타낸다.