project:eve
23.01.31 KNN ์ต๊ทผ์ ์ด์ ๋ณธ๋ฌธ
Studying here๐ ํ ๋ผ๋ก์ฌ ๊ดํ๋ฌธ์
์ค๋์ K-nearest neighbor(K-์ต๊ทผ์ ์ด์)์ ๊ณต๋ถํ๋ ค๊ณ ํ๋ค. ์ง์ ์ SVM ๊ณต๋ถํ ๋ ๋๋ฌด ์ด๋ ค์ ์ด์ ์ด๋ฒ์๋ ์ข ๋์์ก๊ธธ ๋ฐ๋๋คใ
1) ์ ์
ํ์ต ๋ฐ์ดํฐ์ ๋ถํฌ๋ฅผ ๊ทธ๋๋ก ์ ์ฅํ ๋ค, ๊ฒ์ฆ ๋ฐ์ดํฐ ํฌ์ธํธ์ ํด๋์ค๋ฅผ ํ๋จํ ๋ ์ฃผ๋ณ์ k๊ฐ์ ๊ฐ์ฅ ๊ฐ๊น์ด ๋ฐ์ดํฐ์ ํด๋์ค์ ์ํด ๊ฒฐ์ ํ๋ค. ๋น์ ํ ๋ฐ์ดํฐ์์ ๋์ ์์ธก ์ฑ๋ฅ์ ๋ณด์ธ๋ค๊ณ ํ๋ค.

2) ์ข ๋ฅ
1-๋ถ๋ฅ : ๋ถ๋ฅ ๋ฐฉ์์ ์์ ์ฐํฌ๋ ๊ทธ๋ํ์ ๋๊ฐ๋ค. ๊ทธ๋ํ์ ํ ์ ์์ '๊ฐ์ฅ ๊ฐ๊น์ด ๊ฑฐ๋ฆฌ'์ k๊ฐ์ ๋ฐ์ดํฐ ํด๋์ค๋ฅผ ๋ณด๊ณ ํ ์ ์ ํด๋์ค๋ฅผ ์์ธกํ๋ค.
*)๊ฐ์ฅ ๊ฐ๊น์ด ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ๋ ๋ฐฉ๋ฒ
- ๋ ๋ฆฝ๋ณ์๊ฐ ๋ฒ์ฃผํ์ผ ๊ฒฝ์ฐ : ํด๋ฐ ๊ฑฐ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ค
- ๋ ๋ฆฝ๋ณ์๊ฐ ์ฐ์ํ์ผ ๊ฒฝ์ฐ : ์ ํด๋ฆฌ๋, ๋งจํํ ๊ฑฐ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ค.

*) ์ฃผ๋ก ์ฌ์ฉํ๋ ์์ฑ
n_neighbors : ์ด์์ ์
weights : ์ด์๋ณ ๊ฐ์ค์น. uniform์ ๋ชจ๋ ์ด์์ ๊ฑฐ๋ฆฌ์ ์๊ด์์ด ๊ฐ์ ๊ณ์ฐ, distance๋ ์ด์๋ณ ๊ฑฐ๋ฆฌ์ ๋ฐ๋ผ ๊ฐ์ค์น ๋ถ์ฌ
metric&p : ๊ฑฐ๋ฆฌ ๊ณ์ฐ ๊ณต์๊ณผ ๊ณ์. ๊ธฐ๋ณธ๊ฐ์ minkowski์ 2๋ก, ๋ฏผ์ฝ์ฐ์คํค ๊ฑฐ๋ฆฌ๊ณต์์ ๊ณ์๊ฐ 2์ผ๋ ์ ํด๋ฆฌ๋ ๊ฑฐ๋ฆฌ์ ๊ฐ์ผ๋ฏ๋ก ๊ธฐ๋ณธ๊ฐ์ ์ ํด๋ฆฌ๋ ๊ฑฐ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ค๊ณ ํ ์ ์๋ค.
1- ํ๊ท : ๊ฒ์ฆ ๋ฐ์ดํฐ์ ๋ ๋ฆฝ๋ณ์(x)์ ๊ฐ์ฅ ๊ฐ๊น์ด k๊ฐ์ ๋ฐ์ดํฐ๋ก ํด๋์ค๋ฅผ ํ๋ณํ๋ค. ๋ค๋ฅธ ์ ํํ๊ท์ ๋ค๋ฅด๊ฒ ํ๊ท์์ด ์ ํด์ ธ ์์ง ์๊ณ ํ๊ท๊ณ์๋ ์๋ค๋ ๊ฒ์ด ํน์ง!

3) ์ฝ๋
1-๋ถ๋ฅ : ์ธ๋ ๊ฐ์งํ์์ ๋ํ ๋ถ๋ฅ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ ๋ถ์ํด๋ณด์๋ค. ์ข ์๋ณ์๋ Dataset.
(๋ฐ์ดํฐ ์ถ์ฒ : https://www.kaggle.com/datasets/uciml/indian-liver-patient-records)
๋จผ์ ๋ฐ์ดํฐ์ ๊ฒฐ์ธก์น๊ฐ ์๋์ง ํ์ธํด๋ณด์.
import pandas as pd
import numpy as np
data = pd.read_csv('/Users/eve/Downloads/jupyter notebook/files/indian_liver_patient.csv')
print(data.info())
print(data.head(5))

์ด ๋ฐ์ดํฐ์ ๋นํด ์ ์ ๋ถ๋ถ์ ์ฐจ์งํ๋ ์ง์๋ฒ๋ฆฌ๋ ๋ฐฉ๋ฒ๋ ์์ง๋ง ๋๋จธ์ง ๋ฐ์ดํฐ์ ํ๊ท ์น๋ก ๋์ฒดํ๋ค.
col_mean = round(data['Albumin_and_Globulin_Ratio'].mean(), 2)
#๋ค๋ฅธ ๋ฐฉ๋ฒ
#data.loc[data['Albumin_and_Globulin_Ratio'].isna()==True, :]['Albumin_and_Globulin_Ratio'] = col_mean
data['Albumin_and_Globulin_Ratio']=data['Albumin_and_Globulin_Ratio'].fillna(col_mean)
๋ํ ๋ ๋ฆฝ๋ณ์ ์ค Gender์ ๋ฐ์ดํฐ ํ์์ด object์ด๋ฏ๋ก ์ํซ์ธ์ฝ๋ฉ์ ํด์ค๋ค.
(* ๋ฌธ์ํ ๋ฐ์ดํฐ๊ฐ ์์ ๋ fitํ๋ฉด ์๋ฌ๊ฐ ๋ฐ์ํ๊ธฐ ๋๋ฌธ์ด๋ค. ์ ์๋ฌ๊ฐ ๋ฐ์ํ๋์ง ๊ตฌ๊ธ์ ํ์ฐธ ์ฐพ์๋ดค๋๋ฐ๋ ์ ๋์จ๋ค. ์ฌ๋๋ค์ ์ ๊ถ๊ธํ๊ฐ..? ์๋ ๋ด๊ฐ ๋๋ฌด ์ด๋ณด์ ์ธ ๋ด์ฉ์ ๋ชฐ๋ผ์ ์ฐพ๊ณ ์์ด์ ์ ๋์ค๋..??)
์๋ฌดํผ KNN๋ถ๋ฅ๊ธฐ์์๋ ๋ ๋ฆฝ๋ณ์๋ ๋ชจ๋ ์์นํ ๋ณ์์ฌ์ผ๋ง ํ๋ค. ๊ทผ๋ฐ ์ข ์๋ณ์๋ ๋ฌธ์ํ์ด์ด๋ ๊ด์ฐฎ์ผ๋ ์ฐธ๊ณ .
- could not convert string to float: 'Male'
โฌ๏ธ์ด๋ ๊ฒ
data['Gender'] = np.where(data['Gender']=='Female', 1, 0)
๋๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํด ์ํซ์ธ์ฝ๋ฉ์ ํด์ฃผ์. ๋ค์ ๋ถ์ํ ๋ np.where๋ฅผ ์ฌ์ฉํ ๋ฐ์ดํฐ๋ ์ด๊ฑฐ๋ ์ฐจ์ด๋ฅผ ๋น๊ตํด๋ณด๋ ๊ฒ๋ ์ข๊ฒ ๋ค.
# ohe๋ฅผ ์ฌ์ฉํด ์ํซ์ธ์ฝ๋ฉ
from sklearn.preprocessing import OneHotEncoder
ohe = OneHotEncoder(sparse=False)
data_cat = ohe.fit_transform(data[['Gender']])
cat_Gender = pd.DataFrame(data_encoded, columns=['cat_'+ cat for cat in ohe.categories_[0]])
data_concated = pd.concat([data, cat_Gender], axis=1).drop(columns=['Gender'])
data_concated

ํ ์คํธ ๋ฐ์ดํฐ๋ฅผ 2๊ฐ๋ก ๋๋์๋ค. X๋ ๋ฌธ์ํ ๋ฐ์ดํฐ๋ฅผ np.where๋ก ๋ฐ๊พผ ๋ฐ์ดํฐ, X_2๋ ohe๋ก ๋ฐ๊พผ ๋ฐ์ดํฐ.
from sklearn.model_selection import train_test_split
X = data.drop(columns=['Dataset'])
y = data['Dataset']
X_2 = data_concated.drop(columns=['Dataset'])
train_x, test_x, train_y, test_y = train_test_split(X, y, train_size=0.7, random_state=1,
stratify=y)
train_x_ohe, test_x_ohe, train_y_ohe, test_y_ohe = train_test_split(X_2, y, train_size=0.7, random_state=1,
stratify=y)
๋ฐ์ดํฐ ํ๋ จ๊ณผ ์์ธก๋ ๊ฐ๊ฐ. n_neighbors ๊ฐ์ 3์ผ๋ก ์ค์ ํ๋ค.
from sklearn.neighbors import KNeighborsClassifier
clf = KNeighborsClassifier(n_neighbors=3)
clf.fit(train_x, train_y)
pred = clf.predict(test_x)
clf = KNeighborsClassifier(n_neighbors=3)
clf.fit(train_x_ohe, train_y_ohe)
pred_ohe = clf.predict(test_x_ohe)
๊ทธ๋ฆฌ๊ณ ์ฑ๋ฅ ํ๊ฐ. ์ด๋ ๊ฒ ์ผ์ผ์ด ๋ ธ๊ฐ๋คํ๋ ๊ฒ๋ณด๋ค for๋ฌธ์ ๋ง๋ค์์ผ๋ฉด ์ข์์ํ ๋ฐ..
from sklearn.metrics import confusion_matrix, accuracy_score, precision_score, recall_score, f1_score
liver_cm = confusion_matrix(test_y, pred)
liver_acc = round(accuracy_score(test_y, pred), 3)
liver_prc = round(precision_score(test_y, pred), 3)
liver_rc = recall_score(test_y, pred)
liver_f1 = round(f1_score(test_y, pred), 3)
liver_cm_ohe = confusion_matrix(test_y, pred_ohe)
liver_acc_ohe = round(accuracy_score(test_y, pred_ohe), 3)
liver_prc_ohe = round(precision_score(test_y, pred_ohe), 3)
liver_rc_ohe = recall_score(test_y, pred_ohe)
liver_f1_ohe = round(f1_score(test_y, pred_ohe), 3)
print('confusion matrix : ')
print(liver_cm, liver_cm_ohe, '\n')
print('acc score : ', liver_acc, liver_acc_ohe)
print('prc score : ', liver_prc, liver_prc_ohe)
print('rc score : ', liver_rc, liver_rc_ohe)
print('f1 score : ', liver_f1, liver_f1_ohe)

๊ณ ์ํ๋ฉด์ ๋ ๊ฐ์ ๊ตฌํด์ ๋น๊ตํด๋ดค๋๋ฐ ๋๊ฐ๋ค.. ์ด๋ด๊ฑฐ๋ฉด ๊ทธ๋ฅ np.where๊ฐ ํจ์ฌ ๋ซ์ง ์ ohe๋ฅผ ์ธ๊น? ๋ญ๊ฐ ์ฅ์ ์ด ์์ํ ๋ฐ, ๊ทธ๊ฑด ๋์ค์ ์์๋ด์ผ๊ฒ ๋ค.(์ด์ง๋ถ๋ฅ๊ฐ ์๋ ๋ฒ์ฃผํ ๋ณ์๊ฐ์ ํจ์จ์ด ์ข์์ง๋ ๋ชจ๋ฅธ๋ค)
2-ํ๊ท
์ด๋ฒ์๋ KNN์ผ๋ก ํ๊ท๋ถ์์ ํด๋ณด์. ์ด๋ฒ์ ์ฌ์ฉํ ๋ฐ์ดํฐ๋ ์ธ์ฌํ ๋ฐ์ดํฐ์ ์ ๋๋ค. ์ง์๋ค์ ์ด๋ฆ๋ถํฐ ๋ด๊ธ, ๊ฒฐํผ ์ฌ๋ถ, ๋ถ์, ํด๊ฐ์ผ์, ํ๋ก์ ํธ ๊ฒฝํ ๋ฑ ์ฌ๋ฌ๊ฐ์ง ์ ๋ณด๊ฐ ์๋ ๋ฐ์ดํฐ์ธ๋ฐ, ์ฌ๊ธฐ์์ ์ข ์๋ณ์๋ฅผ ๋ด๊ธ์ผ๋ก ์ง์ ํด์ ํ๊ท ๋ถ์์ ํด๋ณด๋ ค๊ณ ํ๋ค.
hr = pd.read_csv('/Users/eve/Downloads/jupyter notebook/files/regression/HRdataset.csv')
hr.info()

๋ ๋ฆฝ๋ณ์๋ ์ด๋ ์ ๋ ๊ด๋ จ์ด ์์ด ๋ณด์ด๋ ๊ฒ์ ๊ฐ์ ธ์๋ค. (๋ฒ์ )๊ฒฐํผ ์ฌ๋ถ, (์ฌ์ค)ํผ์ธ ์ฌ๋ถ, ์ฑ๋ณ ๋ฑ๋ฑ. ๋ฐ์ดํฐ๋ฅผ ์ ์ ํ ๋ค์์๋ ํ๋ จ/๊ฒ์ฆ ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฆฌํ๋ค.
hr_1 = hr[['MarriedID', 'MaritalStatusID', 'GenderID', 'EmpStatusID', 'DeptID', 'PerfScoreID', 'FromDiversityJobFairID', 'EngagementSurvey', 'EmpSatisfaction', 'SpecialProjectsCount', 'Absences', 'Salary']]
X = hr_1.drop(columns=['Salary'])
y = hr_1['Salary']
from sklearn.model_selection import train_test_split
train_x, test_x, train_y, test_y = train_test_split(X, y, train_size=0.7, random_state=1)
ํ๊ทํจ์๋ฅผ ์ ์ธํ๊ณ k๊ฐ์ 3, 5 ๋ ๊ฐ๋ก ๋๋์ด ํ ์คํธํด๋ณด๊ธฐ๋ก ํ๋ค. for๋ฌธ ์์์ ๊ฐ๊น์ด ๊ฑฐ๋ฆฌ์ ์ด์์ด 3์ธ ํจ์์ 5์ธ ํจ์์ ์ํด ์์ธก๋ ๊ฐ์ ์ค์ ๊ฐ๊ณผ ์ค์ฐจ๋ฅผ ๊ณ์ฐํ ๋ค ๋น๊ตํด ๋ณด์.
from sklearn.neighbors import KNeighborsRegressor
from sklearn.metrics import mean_absolute_error, mean_squared_error
preds = ['reg_3', 'reg_5']
knum = [3, 5]
result = pd.DataFrame(columns=['preds', 'mae', 'mse', 'rmse'])
result['preds'] = preds
for k, name in zip(knum, preds):
reg = KNeighborsRegressor(n_neighbors=k)
reg.fit(train_x, train_y)
pred = reg.predict(test_x)
mae = round(mean_absolute_error(test_y, pred), 2)
mse = round(mean_squared_error(test_y, pred))
rmse = np.sqrt(mse)
result.loc[result['preds']==name, 'mae'] = mae
result.loc[result['preds']==name, 'mse'] = mse
result.loc[result['preds']==name, 'rmse'] = rmse

์ค์ฐจ ๊ฐ์ด ์ข ํฌ๋ค..? ๋ด๊ธ์ ์ ๊ทํํ์ง ์๊ณ ๊ทธ๋๋ก ๋ฃ์๋๋ ์ด๋ ๊ฒ ์์๋ณด๊ธฐ ํ๋ ๊ฒ ๊ฐ๋ค. ์ ๊ทํ๋ฅผ ํ ๋ค์ ๋ถ์์ ํด๋ณด๋ฉด ๊น๋ํ๊ฒ ์ฐจ์ด๋ฅผ ์ ๊ฒ ๊ฐ๋ค. ์ด์จ๋ ์ง๊ธ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ฉด k๊ฐ์ด 5์ผ ๋ ๋ถ์ ๊ฒฐ๊ณผ๊ฐ ๋ ์ข์ ๊ฒ ๊ฐ๋ค.
'Daily' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| 23.02.05 ์์๋ธ (0) | 2023.02.05 |
|---|---|
| 23.02.04 ์์ฌ๊ฒฐ์ ๋๋ฌด (0) | 2023.02.04 |
| 23.01.28 SVM ์ํฌํธ ๋ฒกํฐ ๋จธ์ (0) | 2023.01.29 |
| 23.01.28 Logistic Regression๋ก์ง์คํฑ ํ๊ท (0) | 2023.01.29 |
| 23.01.27 Lasso, Elasticnet ๋ผ์, ์๋ผ์คํฑ๋ท (0) | 2023.01.28 |