project:eve
23.02.04 ์์ฌ๊ฒฐ์ ๋๋ฌด ๋ณธ๋ฌธ
Studying here๐ ์ฝํ์ค ์ฐํฌ์
7๋ฒ์งธ ๋ถ์ ๋ชจ๋ธ์ธ ์์ฌ๊ฒฐ์ ๋๋ฌด์ด๋ค. ์ด์ ๋จธ์ ๋ฌ๋ ํํธ๋ ๋ฐ ์ ๋ ๋ฐฐ์ด ๊ฒ ๊ฐ๋ค...(์ฑ ๊ธฐ์ค) ์กฐ๊ธ๋ง ๋ ์ด์ฌํ ํด๋ณด์!!
1) ์ ์ : ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฆฌํ๋ ๊ท์น์ ์ธ์ ํ์ตํ๊ณ ๊ทธ ๊ท์น์ ๋ฐ๋ผ ์์ธกํ๋ ๋ชจํ
- ํน์ง : ์๊ฐํํ๊ธฐ ๊ฐํธํ๋ค. ์ ์ฒ๋ฆฌ๋ฅผ ์ ํด๋ ๋๋ค / ์ฑ๋ฅ์ด ์ ์ข๋ค....

2) ์ข ๋ฅ์ ๋ถ๋ฆฌ ๊ธฐ์ค
1- ๋ถ๋ฅ : ์นด์ด์ ๊ณฑ ํต๊ณ๋ p๊ฐ, ์ง๋์ง์, ์ํธ๋กํผ์ง์
2- ํ๊ท : ๋ถ์ฐ๋ถ์ Fํต๊ณ๋, ๋ถ์ฐ์ ๊ฐ์๋
3) ์ฝ๋
1- ๋ถ๋ฅ : ๋ ์ผ ์ ์ฉ ๋ฐ์ดํฐ๋ก ๋ถ์์ ํด๋ณด๋ ค๊ณ ํ๋ค.
์ถ์ฒ : ( https://archive-beta.ics.uci.edu/dataset/144/statlog+german+credit+data)
๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ ๊ฒฐ์ธก์น๊ฐ ์๋์ง ์ดํด๋ณด์
import pandas as pd
credit = pd.read_csv('/Users/eve/Downloads/jupyter notebook/files/germancredit.csv')
credit.info()

(* ์ด์ ๊น์ง ๋ฐ์ดํฐ๋ฅผ ๋ถ์ํ๋ฉด์ ์ ์ฒ๋ฆฌ๋ฅผ ๋นก์ธ๊ฒ ํ ์ ์ด ์๋ ๊ฒ ๊ฐ๋ค. ๋์ถฉ ๊ฒฐ์ธก์น ์์ผ๋ฉด ํ๊ท ๊ฐ ๋ฃ๊ฑฐ๋ ์๋ ๊ทธ๋ฅ ํ์ ๋นผ๋ฒ๋ฆฌ๊ฑฐ๋.. ์ ๊ท์ฑ, ์ ํ์ฑ์ด๋ ๋ถํฌ ๊ฐ์ ๊ฒ๋ ๋ค ๋ณด๋ฉด ์ข์๋ฐ. ๋์ค์ ๊ฒ์๊ธ ํ๋๋ฅผ ์ ์ฒ๋ฆฌ๋ง ๋ค๋ฃจ๋ ๋ด์ฉ์ผ๋ก ํ๋ ์จ์ผ๊ฒ ๋ค)
๋ ๋ฆฝ๋ณ์์ ์ข ์๋ณ์๋ฅผ ๋๋๊ณ ํ์ต/๊ฒ์ฆ ๋ฐ์ดํฐ๋ฅผ ๋ถํ ํ๋ค.
X = credit.drop(columns=['OBS', 'RESPONSE'])
y = credit['RESPONSE']
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, stratify=y)
์์ฌ๊ฒฐ์ ๋๋ฌด๋ฅผ ํธ์ถํ๊ณ ๋ฐ์ดํฐ๋ฅผ ํ์ต/์์ธกํ๋ค. ์ฌ๊ธฐ์์ ๋ถ๋ฅ๊ธฐ์ ์์ฑ์ ์ถ๊ฐํด์ ์ด๋ ๊ฒ์ด ๋ ์ฑ๋ฅ์ด ์ข์์ง ์์๋ณด์. ์์์ ๋งํ๋ ๊ฒ์ฒ๋ผ ๋ถ๋ฆฌ ๊ธฐ์ค์ ํ๋๋ ์ง๋์ง์, ํ๋๋ ์ํธ๋กํผ์ง์๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ผ๋ก ์ง์ ํด์ ๋น๊ตํด๋ณด๊ธฐ
from sklearn.tree import DecisionTreeClassifier
clf_gn = DecisionTreeClassifier(criterion='gini', min_samples_split=50, max_depth=5)
clf_et = DecisionTreeClassifier(criterion='entropy', min_samples_split=50, max_depth=5)
clf_gn.fit(train_x, train_y)
clf_et.fit(train_x, train_y)
pred_gn = clf_gn.predict(test_x)
pred_et = clf_et.predict(test_x)
์ฑ๋ฅ ํ๊ฐํด๋ณด์. ๋ณ์๋ฅผ ๋ค ๋๋์ด์ ๊ฐ๊ฐ ๊ณ์ฐํ๊ธฐ
from sklearn.metrics import confusion_matrix, accuracy_score, precision_score, recall_score, f1_score
from sklearn.metrics import classification_report
from sklearn.metrics import plot_roc_curve, roc_auc_score
clf_gn_cm = confusion_matrix(test_y, pred_gn)
clf_gn_acc = round(accuracy_score(test_y, pred_gn), 2)
clf_gn_prc = round(precision_score(test_y, pred_gn), 2)
clf_gn_rc = round(recall_score(test_y, pred_gn), 2)
clf_gn_f1 = round(f1_score(test_y, pred_gn), 2)
clf_et_cm = confusion_matrix(test_y, pred_et)
clf_et_acc = round(accuracy_score(test_y, pred_et), 2)
clf_et_prc = round(precision_score(test_y, pred_et), 2)
clf_et_rc = round(recall_score(test_y, pred_et), 2)
clf_et_f1 = round(f1_score(test_y, pred_et), 2)
๋น๊ตํ๊ธฐ. ์๋๋ผ๋ฉด for๋ฌธ ๋๋ ค์ ๋ถ๋ฅ๊ธฐ ์์ฑ๋ถํฐ ์ฑ๋ฅ ํ๊ฐ๊น์ง ๋ชจ๋ ๋ง๋ค๋ฉด ๋๋๋ฐ ์ค๋ ์์ด๋ฆฌ ๊ณต๋ถํ๊ธฐ ํ๋ค๊น.. ๊ทธ๋ฅ ๋ ธ๊ฐ๋ค๋ก ๋ง๋ค์๋ค
result = pd.DataFrame(columns=['criterion', 'acc', 'prc', 'rc', 'f1'])
result['criterion'] = ['gini', 'entropy']
result.loc[result['criterion']=='gini','acc'] = clf_gn_acc
result.loc[result['criterion']=='gini','prc'] = clf_gn_prc
result.loc[result['criterion']=='gini','rc'] = clf_gn_rc
result.loc[result['criterion']=='gini','f1'] = clf_gn_f1
result.loc[result['criterion']=='entropy','acc'] = clf_et_acc
result.loc[result['criterion']=='entropy','prc'] = clf_et_prc
result.loc[result['criterion']=='entropy','rc'] = clf_et_rc
result.loc[result['criterion']=='entropy','f1'] = clf_et_f1
result

์ ํ๋๋ ์ง๋ ๊ณ์๋ฅผ ์ฌ์ฉํ ์ชฝ์ด ์กฐ๊ธ ๋ ๋์๋ฐ ์ฌํ์จ์ด ์ฐจ์ด๊ฐ ๋๋ค. ๋๊ฐ์ง ์ค์ ํ๋๋ฅผ ๊ณจ๋ผ์ผ ํ๋ค๋ฉด ์ฌํ์จ์ด ๋์ ๋ถ๋ฅ๊ธฐ๋ฅผ ์ฌ์ฉํ ๊ฒ ๊ฐ๋ค.
๋ ์ด๋ฒ์๋ ์ฑ๋ฅ ํ๊ฐ์ ๊ด๋ จ๋ ๋ค๋ฅธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํจ์๋ ์จ๋ดค๋ค. roc๊ทธ๋ํ, auc์ ์, ๊ทธ๋ฆฌ๊ณ classification report ํจ์๋ ์ค์ ๊ฐ๊ณผ ์์ธก๊ฐ์ ๋ฃ์ผ๋ฉด ์ ํ๋, ์ ๋ฐ๋, ์ฌํ์จ๊ณผ f1์ ์๊น์ง ์ ๋ถ ๊ตฌํด์ค๋ค! ๋ค์๋ถํฐ๋ ์ด ํจ์๋ง ์จ์ผ๊ฒ ๋ค.
์ฝ๋์์๋ ์ง๋ ๋ถ๋ฅ๊ธฐ์ ์ํธ๋กํผ ๋ถ๋ฅ๊ธฐ๋ฅผ ๋๋์ด์ ๊ทธ๋ํ์ ์ฑ๋ฅ์งํ๋ฅผ ํ์ํด๋ดค๋ค.
from sklearn.metrics import plot_roc_curve, roc_auc_score
from sklearn.metrics import classification_report
fig = plt.figure(figsize=(10, 8))
plot_roc_curve(clf_gn, test_x, test_y)
plt.show()
clf_report_gn = classification_report(test_y, pred_gn)
print(clf_report_gn)
plot_roc_curve(clf_et, test_x, test_y)
clf_report_et = classification_report(test_y, pred_et)
plt.show()
print(clf_report_et)


auc์ ์๋ก ๋ณด๋ฉด ์ง๋ ๋ถ๋ฅ๊ธฐ๊ฐ ์์ฃผ ์กฐ๊ธ ๋ ์ฑ๋ฅ์ด ์ข์ ๊ฒ ๊ฐ๋ค. classification report๋ ์ ๋ง ํธํด์ ์์ผ๋ก๋ ์ฑ๋ฅ ์งํ ๊ตฌํ ๋ ์ด๊ฒ๋ง ์ธ ๊ฒ ๊ฐ๋ค.
๊ทธ๋ฆฌ๊ณ ํ๊ฐ์ง ๋) ๋ถ์์ ํ๊ณ ๋์ ์ปฌ๋ผ๋ณ๋ก ์ค์๋๋ฅผ ์ ์ ์๋ค.
ft_imp = clf_gn.feature_importances_
print(ft_imp)

์ค์๋ ๋ฐฐ์ด์ ์๋ณธ ๋ฐ์ดํฐ์ ์ด ์์๋๋ก ๋์ค๋ฏ๋ก ๋ณด๊ธฐ ์ฝ๊ฒ ๋ฐ์ดํฐ์์ ์ด์ ๊ฐ์ ธ์ ํฉ์ณ์ฃผ๋ฉด ๋๋ค. pd.concat์ ์ฌ์ฉํ๊ธฐ ์ํด ๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ๊ฐ ๋ฐ์ดํฐํ๋ ์์ผ๋ก ๋ง๋ค์ด์ฃผ๋ ๊ฒ ํฌํจ
df_ft_imp = pd.DataFrame(ft_imp)
col = pd.DataFrame(X.columns)
imp = pd.concat([col, df_ft_imp], axis=1)
imp.columns = ['col', 'importance']
imp.sort_values(by = 'importance', axis=0, ascending=False)

2- ํ๊ท : ๋์ด ๋ฑ ์ฌ๋ฌ๊ฐ์ง ์์ธ์ ๋ฐ๋ฅธ ๋ณดํ๋ฃ ์๋ฃ๋ฅผ ๊ฐ์ง๊ณ ๋ถ์ํด๋ดค๋ค.
๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ณ ์ ์ฒ๋ฆฌ ํด๋ณด๊ธฐ
import pandas as pd
ins = pd.read_csv('/Users/eve/Downloads/jupyter notebook/files/insurance.csv')
ins.info()

๊ฒฐ์ธก์น๋ ์๊ณ , ๋ฌธ์ํ์ ๋ฐ์ดํฐ๊ฐ ๋ช ๊ฐ ๋ณด์ธ๋ค. ์์นํ์ผ๋ก ๋ฐ๊ฟ์ฃผ์.
ins[['sex', 'smoker']]
ins['sex'] = np.where(ins['sex']=='female', 1, 0)
ins['smoker'] = np.where(ins['smoker']=='yes', 1, 0)
์ ์ฒ๋ฆฌ๊ฐ ๋๋ฌ์ผ๋ฉด ๋ฐ์ดํฐ ๋ถํ ํด ์ฃผ๊ธฐ.
X = ins_1.drop(columns=['charges'])
y = ins_1['charges']
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)
์์ฌ๊ฒฐ์ ๋๋ฌด ํ๊ทํจ์๋ฅผ ํธ์ถํ๊ณ ์ฃผ์ ์์ฑ์ธ max_depth๊ฐ 3์ธ ๊ฒ๊ณผ 5์ธ ๊ฒ์ผ๋ก ๊ฐ๊ฐ ๋ถ์ํด ์ฐจ์ด๋ฅผ ๋น๊ตํด ๋ณด๊ธฐ๋ก ํ๋ค. ์ด๋ฒ์๋ ์ผ์ผ์ด ํ์ง ์๊ณ ๋ฐ๋ณต๋ฌธ์ผ๋ก ๋ง๋ค์ด๋ดค๋ค.
from sklearn.tree import DecisionTreeRegressor
from sklearn.metrics import mean_absolute_error, mean_squared_error
preds = ['reg_5', 'reg_3']
result = pd.DataFrame(columns=['preds', 'mae', 'mse', 'rmse'])
result['preds'] = preds
depth = [5, 3]
for i, d in enumerate(depth):
reg = DecisionTreeRegressor(max_depth=d)
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 = round(np.sqrt(mse), 2)
result.loc[i, 'mae'] = mae
result.loc[i, 'mse'] = mse
result.loc[i, 'rmse'] = rmse
print(result)

์ค์ฐจ๊ฐ ์ ์์๋ก ์ข์ ๋ถ์๊ธฐ์ด๋ฏ๋ก max_depth๊ฐ 3์ธ ๊ฒ์ด ์กฐ๊ธ ๋ ์ข์๋ณด์ด๋ ๊ฒ ๊ฐ๋ค. ์ซ์๊ฐ ์ด๋ ๊ฒ ํฌ๊ฒ ๋์ค๋ ๊ฑด ์๋ฌด๋๋ ์ข ์๋ณ์์ ๊ฐ ํญ์ด ๋์ด์ ๊ฐ์๋ฐ.. ์ ๊ทํ๋ฅผ ๋จผ์ ํ๊ณ ๋ถ์ํ์ผ๋ฉด ๋ณด๊ธฐ ํธํ์ ๊ฒ ๊ฐ๋ค.
'Daily' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| 23.02.11 Naive Bayes ๋์ด๋ธ ๋ฒ ์ด์ฆ (0) | 2023.02.06 |
|---|---|
| 23.02.05 ์์๋ธ (0) | 2023.02.05 |
| 23.01.31 KNN ์ต๊ทผ์ ์ด์ (0) | 2023.01.31 |
| 23.01.28 SVM ์ํฌํธ ๋ฒกํฐ ๋จธ์ (0) | 2023.01.29 |
| 23.01.28 Logistic Regression๋ก์ง์คํฑ ํ๊ท (0) | 2023.01.29 |