๋ฌ๋์คํผ์ฆ ์์ ์ ๋ฆฌ
< ์ด์ ๊ธ >
https://silvercoding.tistory.com/64
[IRIS ๋ฐ์ดํฐ ๋ถ์] 1. Python KNN ๋ถ๋ฅ
๋ฌ๋์คํผ์ฆ ์์ ์ ๋ฆฌ < ์ด์ ๊ธ > https://silvercoding.tistory.com/63?category=967543 https://silvercoding.tistory.com/62 [boston ๋ฐ์ดํฐ ๋ถ์] 1. ์ฐจ์์ถ์ (PCA) ํ์ด์ฌ ์์ ๋ฌ๋์คํผ์ฆ ์์ ์ ๋ฆฌ ๋ผ..
silvercoding.tistory.com
๋ฐ์ดํฐ ๋ถ๋ฌ์ค๊ธฐ
์ด์ ๊ธ๊ณผ ๋์ผํ Iris Flower Dataset ์ ์ด์ฉํ์ฌ ์ค์ต์ ์งํํ๋ค.
< Iris Flower Dataset >
https://www.kaggle.com/arshid/iris-flower-dataset
Iris Flower Dataset
Iris flower data set used for multi-class classification.
www.kaggle.com
import pandas as pd
import os
os.chdir('../data') # ๋ฐ์ดํฐ์
์ด ์๋ ๋ณธ์ธ ํด๋ ๊ฒฝ๋ก
iris = pd.read_csv("IRIS.csv")
iris.head()
iris['species'].value_counts()
๊ฐ ์ข ๋ฅ๋ง๋ค 50๊ฐ์ ๋ฐ์ดํฐ๊ฐ ์กด์ฌํ๋ค.
์์ฌ๊ฒฐ์ ๋๋ฌด ์ฌ์ฉ
train & Test ๋ฐ์ดํฐ์ ๋ถ๋ฆฌ
iris['id'] = range(len(iris))
์ฐ์ ๋ฐ์ดํฐ๋ฅผ ๊ตฌ๋ถํ๊ธฐ ์ํด ์์๋๋ก ๊ฐ์ ๋ฃ์ด์ค id ์ปฌ๋ผ์ ์์ฑํ๋ค.
iris = iris[['id','sepal_length','sepal_width','petal_length','petal_width','species']]
id ์ปฌ๋ผ์ด ๊ฐ์ฅ ์์ ์ค๋๋ก ์ ๋ ฌํด์ค๋ค.
train = iris.sample(100,replace=False,random_state=7).reset_index().drop(['index'],axis=1)
๋๋ค์ผ๋ก 100๊ฐ์ ์ํ์ ์ถ์ถํ์ฌ train ์ ์ ์ฅํด ์ค๋ค.
test = iris.loc[ ~iris['id'].isin(train['id']) ]
test = test.reset_index().drop(['index'],axis=1)
train์ id๊ฐ์ด ์กด์ฌํ์ง ์๋ iris ๋ฐ์ดํฐ๋ค์ test์ ๋ฃ์ด์ค๋ค.
์์ฌ๊ฒฐ์ ๋๋ฌด ํ์ต
DecisionTreeClassifier(min_samples_split = n)
---> ํน์ง : ํด์์ด ์ฝ๊ณ ๋น ๋ฅด๋ค.
---> min_samples_split : ์์ฌ๊ฒฐ์ ๋๋ฌด์์ ์ต์ข ๋ ธ๋์ ์ต์ ์ํ ์
from sklearn.tree import DecisionTreeClassifier
dt = DecisionTreeClassifier(min_samples_split = 10)
min_samples_split ์ 10์ผ๋ก ์ค์ ํด์ฃผ์ด ์ต์ข ๋ ธ๋์ ์ํ์๊ฐ 10๋ฏธ๋ง์ด ๋์ง ์๋๋ก ์กฐ์ ํ๋ค.
dt.fit(train[['sepal_length','sepal_width','petal_length','petal_width']],train['species'])
์์ฑํด ๋์ dt ๊ฐ์ฒด๋ก ํ์ต์ ์์ผ์ค๋ค.
predictions = dt.predict(test[['sepal_length','sepal_width','petal_length','petal_width']])
์์ธก๊ฐ์ prediction์ ๋ฃ์ด์ค๋ค.
test['pred'] = predictions
์์ธก๊ฐ prediction์ test์ pred ์ปฌ๋ผ์ ์ ์ฅํ๋ค.
test.head()
(pd.Series(predictions)==test['species']).mean()
์์ธก๊ฐ๊ณผ ์ ๋ต์ ๋น๊ตํ์ฌ ์ ํ๋๋ฅผ ๊ตฌํด๋ณด๋ 0.98์ด ๋์๋ค.
์์ ์ ํ๋ ์ธก์ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ฉด ์ ๋ขฐ์ฑ์ด ํ๋ฝํ ์ ์๋ค. train, test ๋ฐ์ดํฐ๋ฅผ ์ด๋ป๊ฒ ๋๋๋์ง์ ๋ฐ๋ผ ๊ฒฐ๊ณผ๊ฐ ํฌ๊ฒ ๋ฌ๋ผ์ง ์๋ ์๊ธฐ ๋๋ฌธ์ด๋ค. ๋ฐ๋ผ์ cross validation์ ์ด์ฉํ์ฌ ์ ํ๋๋ฅผ ๊ตฌํด๋ณผ ์ ์๋ค.
from sklearn.model_selection import cross_val_score
import numpy as np
dt = DecisionTreeClassifier(min_samples_split = 10)
scores = cross_val_score(dt, iris[['sepal_length','sepal_width','petal_length','petal_width']], iris['species'], cv=5, scoring="accuracy")
np.mean(scores)
์ด๋ฒ ์์์ฒ๋ผ ๋ฐ์ดํฐ ์๊ฐ ์ ์ ๊ฒฝ์ฐ์๋ ์์ ๊ฐ์ด ์ ์ฒด ๋ฐ์ดํฐ๋ก cross validation์ ์ํํ๋ ๊ฒ์ด ์ ๋ขฐ์ฑ์ด ๋๋ค. 5 fold cross validation์ ์ํํ ๊ฒฐ๊ณผ , ์ ํ๋๊ฐ ์ฝ 0.97์ด ๋์จ ๊ฒ์ ๋ณผ ์ ์๋ค.
์์ฌ๊ฒฐ์ ๋๋ฌด ์๊ฐํ
from sklearn import tree
import matplotlib.pyplot as plt
from matplotlib.pylab import rcParams
rcParams['figure.figsize'] = 16,10
a=tree.plot_tree(dt,feature_names = ['sepal_length','sepal_width','petal_length','petal_width'],impurity=False, max_depth=2, fontsize=10, proportion=True)
plt.show(a)
max_depth๋ฅผ ์ด์ฉํ์ฌ ๊น์ด๋ฅผ ์กฐ์ ํ ์ ์๋ค. 2๊ฐ ์ดํ๋ก๋ (...) ์ผ๋ก ์๋ต๋ ๊ฒ์ ๋ณผ ์ ์๋ค. ์์ ๊ฐ์ด ์์ฌ๊ฒฐ์ ๋๋ฌด๋ฅผ ์ฌ์ฉํ๊ณ , ์๊ฐํ ํด๋ณด๋ฉด ํด์์ ์ฝ๊ณ ๊ฐํธํ๊ฒ ํด๋ผ ์ ์๋ค.