๋ฌ๋์คํผ์ฆ ์์ ์ ๋ฆฌ
< ์ด์ ๊ธ >
https://silvercoding.tistory.com/63?category=967543
[boston ๋ฐ์ดํฐ ๋ถ์] 2. PCA, ๊ตฐ์งํ๋ฅผ ์ฌ์ฉํ ์ง๊ฐ ๋ถ์
๋ฌ๋์คํผ์ฆ ์์ ์ ๋ฆฌ < ์ด์ ๊ธ > https://silvercoding.tistory.com/62 [boston ๋ฐ์ดํฐ ๋ถ์] 1. ์ฐจ์์ถ์ (PCA) ํ์ด์ฌ ์์ ๋ฌ๋์คํผ์ฆ ์์ ์ ๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ & ๋ฐ์ดํฐ ๋ถ๋ฌ์ค๊ธฐ - ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ถ๋ฌ์ค๊ธฐ impo..
silvercoding.tistory.com
KNN ๊ฐ๋ ์ ๋ฆฌ
* 1๊ทธ๋ฃน vs 2๊ทธ๋ฃน KNN ๋ถ๋ฅ ๊ณผ์
1. k ์ค์ : ๊ฐ์ฅ ๊ฐ๊น์ด k๊ฐ์ ์ ์ ์ ํ
2. k ๊ฐ์ ์ ์ค 1๊ทธ๋ฃน์ด ๋ง์์ง 2๊ทธ๋ฃน์ด ๋ง์์ง ํ์ธ
3. ๋ ๋ง์ ๊ทธ๋ฃน์ ๋ฒ์ฃผ๋ก ๋ถ๋ฅํ๋ค.
* K๋ฅผ ์ฐพ์๋ด๋ ๊ณผ์
1. ํ์ต๋ฐ์ดํฐ๋ฅผ ์ด์ฉํ์ฌ ๊ฐ K๋ณ๋ก KNN ๋ชจ๋ธ ํ์ต
2. ๋ง๋ค์ด์ง ๋ชจ๋ธ์ ์ด์ฉํด ๊ฒ์ฆ ๋ฐ์ดํฐ(ํ ์คํธ ๋ฐ์ดํฐ) ์์์ ์๋ฌ์จ ์ธก์
3. ์๋ฌ์จ์ด ๊ฐ์ฅ ์์ k ์ ํ
* ์ ์ ํ k๋ฅผ ์ฐพ์๋ด์ด์ผ ํ๋ค!
- k๊ฐ ๋งค์ฐ ์์ผ๋ฉด ๋ ธ์ด์ฆ์ ๋ฏผ๊ฐํ ๊ณผ์ ํฉ ์ฐ๋ ค
- k๊ฐ ๋งค์ฐ ํฌ๋ฉด ์ง์ญ์ ๊ตฌ์กฐ๋ฅผ ํ์ ํ ์ ์๋ ๋ฅ๋ ฅ์ ์๊ฒ ๋จ
๋ฐ์ดํฐ ์ดํด๋ณด๊ธฐ
๋ณธ ํฌ์คํ ์์ ์ฌ์ฉํ ๋ฐ์ดํฐ์ ์ ์บ๊ธ์ ๋ค์๋งํฌ์์ ๋ค์ด๋ฐ์ ์ ์๋ค.
< 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()
(์ฐธ๊ณ ) sepal : ๊ฝ๋ฐ์นจ / petal : ๊ฝ์
๊ฝ๋ฐ์นจ์ ํฌ๊ธฐ์ ๊ฝ์์ ํฌ๊ธฐ๋ฅผ ๊ทผ๊ฑฐ๋ก setosa, versicolor, virginica ์ด 3์ข ๋ฅ๋ฅผ ๊ตฌ๋ถํด ๋ด๋ ๋ถ๋ฅ๋ชจ๋ธ์ ๋ง๋ค ๊ฒ์ด๋ค.
iris.info()
์ด 150๊ฐ์ ๋ฐ์ดํฐ๊ฐ ๋ค์ด ๊ฐ ์๊ณ , ๊ฒฐ์ธก๊ฐ์ ์กด์ฌํ์ง ์๋๋ค.
iris['species'].value_counts()
value_counts() ํจ์๋ฅผ ์ด์ฉํ์ฌ ๊ฐ ์ข ๋ฅ๊ฐ ๋ช๊ฐ์ง์ฉ ์๋์ง ํ์ธํด๋ณผ ์ ์๋ค. ๊ฐ ์ข ๋ฅ๋ง๋ค ๋์ผํ๊ฒ 50๊ฐ์ฉ ์กด์ฌํ๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
KNN ์ค์ต - ๋ถ๋ฅ
(ex) KNeighborsClassifier(n_neighbors=n)
---> ๋ฐ์ดํฐ๊ฐ ๋ง์ผ๋ฉด ๋๋ฆผ
---> n_neighbors=n : k์ ๊ฐ์ ์ง์ (๊ฐ์ฅ ๊ฐ๊น์ด K๊ฐ๋ฅผ ๋ณผ๊ฒ์ด๋ผ๋ ์๋ฏธ)
iris['id'] = range(len(iris))
๋ฐ์ดํฐ๋ฅผ ์๋ณํ๊ธฐ ์ํ์ฌ ์์๋๋ก ๊ฐ์ ๋ถ์ฌํ์ฌ id ์ปฌ๋ผ์ ๋ฃ์ด์ค๋ค.
iris = iris[['id','sepal_length','sepal_width','petal_length','petal_width','species']]
id ์ปฌ๋ผ์ด ๊ฐ์ฅ ์ฒซ๋ฒ์งธ์ ์ค๋๋ก ์ ๋ ฌ ํด ์ค๋ค.
iris.head()
train & test data ๋ถ๋ฆฌ
train = iris.sample(100, replace=False, random_state=7).reset_index(drop=True)
train
ํ์ต ๋ฐ์ดํฐ์ ์ ๋๋ค์ผ๋ก 100๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ถ์ถํ๋ค. ๋น๋ณต์์ถ์ถ์ด๊ณ , ๋ค์ฃฝ๋ฐ์ฃฝ๋ ์ธ๋ฑ์ค๋ฅผ ์ด๊ธฐํ ์์ผ์ค๋ค.
test = iris.loc[ ~iris['id'].isin(train['id']) ]
# test = test.reset_index().drop(['index'],axis=1) # ๋ฐ๊ณผ ๊ฐ์ ์ฝ๋
test = test.reset_index(drop=True)
ํ ์คํธ ๋ฐ์ดํฐ์ ์๋ ํ์ต๋ฐ์ดํฐ์ ์ ์๋ id๊ฐ์ด ์กด์ฌํ๋ row๋ง ์ถ์ถํ์ฌ ๊ตฌ์ฑํ๋ค. ๋ง์ฐฌ๊ฐ์ง๋ก ์ธ๋ฑ์ค๋ฅผ ์ด๊ธฐํ ํด์ค๋ค.
KNN ํ์ต (k=3 ์ผ ๋ ํ์ตํด๋ณด๊ธฐ)
from sklearn.neighbors import KNeighborsClassifier
knn = KNeighborsClassifier(n_neighbors=3) # ๋ชจ๋ธ ์ ์
k=3์ผ๋ก ์ค์ ํ KNN ๋ถ๋ฅ๊ธฐ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ค.
knn.fit( train[['sepal_length','sepal_width','petal_length','petal_width']] , train['species'] )
knn.fit(train_X, train_y) ์ ๊ฐ์ด ์ฌ์ฉํ๋ค.
predictions = knn.predict( test[['sepal_length','sepal_width','petal_length','petal_width']] )
knn.predict(test_X) ์ ๊ฐ์ด ์ฌ์ฉํ๋ค. test ๋ฐ์ดํฐ๋ฅผ ์ด์ฉํ์ฌ ์์ธก์ ํ๊ณ , predictions์ ์ ์ฅํด ์ค๋ค.
test['pred'] = predictions
test.head()
pred ์ปฌ๋ผ์ ์์ธก ๊ฒฐ๊ณผ์ธ predictions๋ฅผ ์ถ๊ฐํด ์ฃผ์๋ค. ์์ 5๊ฐ๋ฅผ ๋ณด๋ ๋ชจ๋ ์ ๋ต์ ๋ง์ถ ๊ฒ์ ๋ณผ ์ ์๋ค.
(test['pred'] == test['species']).mean()
์ ๋ต๊ณผ ์์ธก์ ๋น๊ตํ์ฌ ์ ํ๋๋ฅผ ๊ตฌํด๋ณด๋ 0.94๊ฐ ๋์๋ค. ์ด์ ์ฌ๋ฌ k๊ฐ์ ์ ํ๋๋ฅผ ๊ตฌํ์ฌ ์ต์ ์ k๋ฅผ ๊ฒฐ์ ํด ๋ณธ๋ค.
์ต์ K ์ฐพ๊ธฐ
- train & test ๋ฐ์ดํฐ ์ฌ์ฉ
for k in range(1,30):
knn = KNeighborsClassifier(n_neighbors=k)
knn.fit( train[['sepal_length','sepal_width','petal_length','petal_width']] , train['species'] )
predictions = knn.predict( test[['sepal_length','sepal_width','petal_length','petal_width']] )
print((pd.Series(predictions) == test['species']).mean())
1๋ถํฐ 29๊น์ง์ k ์ ํ์ต์ ์งํํ์ฌ ์ป์ ์ ํ๋์ด๋ค. ๋์ ๊ฐ ์ค์์ ๊ฐ์ฅ ์ฒซ๋ฒ์งธ๋ฅผ ๊ณ ๋ฅด๋ฉด k=5 (์ ํ๋ 0.98) ์ด๋ค.
---> ์ต์ ์ K : 5
ํ์ง๋ง ์์ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ฉด ์ ๋ขฐ์ฑ์ด ํ๋ฝํ ์ ์๋ค. train, test ๋ฐ์ดํฐ๋ฅผ ์ด๋ป๊ฒ ๋๋๋์ง์ ๋ฐ๋ผ ๊ฒฐ๊ณผ๊ฐ ํฌ๊ฒ ๋ฌ๋ผ์ง ์๋ ์๊ธฐ ๋๋ฌธ์ด๋ค. ๋ฐ๋ผ์ cross validation์ ์ด์ฉํ์ฌ ์ ํ๋๋ฅผ ๊ตฌํด๋ณผ ์ ์๋ค.
- cross validation ์ฌ์ฉ
from sklearn.model_selection import cross_val_score
import numpy as np
for k in range(1,30):
knn = KNeighborsClassifier(n_neighbors=k)
scores = cross_val_score(knn, iris[['sepal_length','sepal_width','petal_length','petal_width']], iris['species'], cv=5)
print(f"{k} : " ,np.mean(scores))
5-fold-cross validation์ ์งํํ์๋ค. k=6 ์ผ๋ ๊ฐ์ฅ ์ฒซ๋ฒ์งธ๋ก ๋์ ์ ํ๋๊ฐ ๋์จ ๊ฒ์ ์ ์ ์๋ค.
---> ์ต์ ์ K : 6
KNN ์ค์ต - ํ๊ท
ํ๊ท๋ฌธ์ ์ KNN ์ ์ฌ์ฉํ ์๋ ์๋ค. ์ด๋ฌํ KNN ํ๊ท๋ฌธ์ ๋ฅผ ์ค์ต์ ํด๋ณด๊ธฐ ์ํด sepal_length, sepal_width, petal_length ๋ฅผ ์ด์ฉํ์ฌ petal_width๋ฅผ ์์ธกํ๋ ๋ชจ๋ธ์ ์์ฑํ๋ค.
del train['species']
del test['species']
๊ฐ๋จํ ์ค์ต์ ์ํ์ฌ ๋ฒ์ฃผํ ๋ณ์์ธ species ๋ ์ญ์ ํด ์ค๋ค. ๊ทธ๋ค์ ๋ถ๋ฅ๋ฌธ์ ์ ๋๊ฐ์ด ํ์ต์ ์งํํ๋ค.
from sklearn.neighbors import KNeighborsRegressor
knn = KNeighborsRegressor(n_neighbors=3)
knn.fit( train[['sepal_length','sepal_width','petal_length']] , train['petal_width'] )
predictions = knn.predict( test[['sepal_length','sepal_width','petal_length']] )
test['pred'] = predictions
test.head()
ํ์ต๊ณผ ์์ธก์ ๋์ผํ๊ฒ ์งํํ๋ค.
* Mean absolute error ( MAE ) : ํ๊ท๋ฌธ์ ์์ ๋ชจ๋ธ์ ์ฑ๋ฅ์ ํ๊ฐํ๋ ๋ฐฉ๋ฒ ์ค ํ๋.
MAE ๋ ๋ค์๊ณผ ๊ฐ์ด ๊ตฌํ ์ ์๋ค.
abs(test['petal_width'] - pd.Series(predictions)).mean()
์ ๋ต์์ ์์ธก๊ฐ์ ๋นผ๊ณ , ์ ๋๊ฐ์ ์ทจํด์ค ํ ๊ฐ๊ฐ์ ์ค๋ฅ์จ์ ํ๊ท ์ ๊ตฌํด์ฃผ๋ฉด ๋๋ค. ์ด ํ๊ฐ์งํ๋ ์ค๋ฅ์จ์ด๋ฏ๋ก ์์ ์๋ก ์ ์์ธกํ ๊ฒ์ด๋ผ ํ๋จ๋์ด์ง๋ค.
for k in range(1,30):
knn = KNeighborsRegressor(n_neighbors=k)
knn.fit( train[['sepal_length','sepal_width','petal_length']] , train['petal_width'] )
predictions = knn.predict( test[['sepal_length','sepal_width','petal_length']] )
print(str(k)+' :'+str(abs(test['petal_width'] - pd.Series(predictions)).mean()))
์ค๋ฅ์จ์ด ๊ฐ์ฅ ์์ k๋ 7์์ ์ ์ ์๋ค.
---> ์ต์ ์ K : 7