파이썬 싸이킷런의 의사 결정 나무를 사용해서 붓꽃(iris)를 분류해봅시다.
# 데이터프레임을 사용해 데이터를 보기위해 판다스를 사용합니다.
import pandas as pd
# 사이킷런에 내장되어 있는 붓꽃 데이터를 가져옵니다.
from sklearn.datasets import load_iris
# 사이킷런의 의사결정나무 모델을 가져옵니다.
from sklearn.tree import DecisionTreeClassifier
# 데이터를 1) 훈련, 2) 검증 데이터셋으로 분리하기 위해 사용합니다.
from sklearn.model_selection import train_test_split
# 모델의 성능을 평가하기 위해 사용합니다.
from sklearn.metrics import accuracy_score
# 사이킷런의 버전 확인 - 저는 0.21.3 입니다.
import sklearn
print(sklearn.__version__)
load_iris 설명 을 보면 load_iris는 함수
이고 1) 붗꽃 데이터를 반환, 2) 데이터의 자료형은 파이썬의 딕셔너리
와 유사하다고 합니다.
# type 함수를 통해 자료형을 확인할 수 있습니다.
print("load_iris의 자료형: ", type(load_iris))
# 딕셔너리 형태의 붓꽃 데이터를 iris 변수에 넣어줍니다.
iris = load_iris()
# 붓꽃 데이터 출력
print(iris)
딕셔너리는 1. 키, 2. 값으로 이루어져있습니다.
keys() 함수 또는 반복문을 사용해서 키를 확인할 수 있습니다.
# 1) keys() 함수를 이용한 키 확인
print("파이썬 딕셔너리 키: ", iris.keys(), "\n")
# 2) for문을 이용한 키 확인
for item in iris:
print(item)
값은 data.key
형식을 사용해서 확인할 수 있습니다.
# 붓꽃
iris.data
# 붗꽃 라벨
iris.target
# 붗꽃의 타겟 이름
iris.target_names
...
이렇게 확인하면 힘들기 때문에 pandas의 dataframe을 사용해서 확인해봅시다.
# 1) 데이터, 2) 칼럼이름을 넣어서 데이터프레임 생성
df = pd.DataFrame(data=iris.data, columns=iris.feature_names)
# 2) 생성된 데이터프레임에 label이라는 시리즈 생성
df["label"] = iris.target
# 3) 확인
df.head()
생성된 모델의 성능을 평가하기 위해서는 검증용 데이터
가 필요합니다. 그렇기 때문에 모델 생성전 미리 1) 훈련, 2) 검증 데이터를 분리합니다.
즉, 훈련 데이터로 학습하고, 검증 데이터로 모델의 성능을 평가합니다
# 데이터프렘의 데이터를 분리합니다.
# x는 훈련을 위한 feature 이고
x = df.drop(columns=["label"], axis=1)
# y는 모델을 사용해 분류할 타켓입니다.
y = df["label"]
train_test_split 함수를 사용해서 훈련, 검증 데이터를 분리합니다.
train_test_split의 인자값을 살펴보면
train_test_split의 반환값은 리스트
입니다.
# 다음 4개가 순서대로 할당됩니다.
# 1. 훈련 feature, 2. 훈련 target, 3. 검증 feature, 4. 검증 target
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=1)
왜 리스트가 4개의 변수에 할당
되는지 궁금해하실 수 있습니다.
원래, train_test_split는 다음과 같이 길이가 4인 리스트를 반환합니다.
[ [], [], [], [] ]
다음 순서로 데이터가 할당된다는 것만 알고 계시면 됩니다.
1. 훈련 feature, 2. 훈련 target, 3. 검증 feature, 4. 검증 target
# 구조분해 할당으로 4개의 변수에 순서대로 할당됩니다.
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=1)
# random_state는 난수 생성을 위한 seed입니다. 신경안쓰셔도 괜찮습니다.
dt = DecisionTreeClassifier(random_state=1)
# .fit() 함수를 통해 쉽게 모델을 학습시킬 수 있습니다.
# 1. 첫번째 인자는 feature, 2. 두번째인자는 target입니다.
dt.fit(x_train, y_train)
# predict() 함수를 통해 분류할 수 있습니다. 인자값은 feature입니다.
result = dt.predict(x_test)
accuracy_score를 사용해서 얼마나 정확한지 평가할 수 있습니다.
print("테스트 정확도: {0: .4f}".format(accuracy_score(y_test, result)))