240610 Today I Learn
์์ฌ๊ฒฐ์ ๋๋ฌด์ ๋๋ค ํฌ๋ ์คํธ
๋๋ณด๊ธฐ
# ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฐ ๋ฐ์ดํฐ ๋ถ๋ฌ์ค๊ธฐ
import pandas as pd
import matplotlib.pyplot as plt
titanic = pd.read_csv('TITANIC/train.csv')
# ์ ์ฒ๋ฆฌ
#Pclass: LabelEncoder
from sklearn.preprocessing import LabelEncoder
le1 = LabelEncoder()
titanic['Pclass'] = le1.fit_transform(titanic['Pclass'])
#Sex: LabelEncoder
le2 = LabelEncoder()
titanic['Sex'] = le2.fit_transform(titanic['Sex'])
#Age: ๊ฒฐ์ธก์น-> ํ๊ท ์ผ๋ก ๋์นํ๊ณ
titanic['Age'] = titanic['Age'].fillna(titanic['Age'].mean())
์์ฌ๊ฒฐ์ ๋๋ฌด
๐ณ ์์ฌ๊ฒฐ์ ๋๋ฌด
์์ฌ๊ฒฐ์ ๊ท์น์ ๋๋ฌด ๊ตฌ์กฐ๋ก ๋ํ๋ด์ด ์ ์ฒด ์๋ฃ๋ฅผ ๋ช ๊ฐ์ ์์ง๋จ์ผ๋ก ๋ถ๋ฅํ๊ฑฐ๋ ์์ธก์ ์ํํ๋ ๋ถ์ ๋ฐฉ๋ฒplot_tree(model = ๋ชจ๋ธ๋ช , feature_names = feature๋ช , class_names = ๋ถ๋ฅํ class๋ช ์ง์ ํ๊ธฐ, filled = ์์ฌ๊ฒฐ์ ๋๋ฌด ์์ ์ฌ๊ฐํ ์ ์ฑ์ฐ๊ธฐ(default False) )โ
- ์ฅ์
- ์ฝ๊ณ ํด์ํ๊ธฐ ์ฉ์ด
- ๋ค์ค๋ถ๋ฅ์ ํ๊ท์ ๋ชจ๋ ์ ์ฉ์ด ๊ฐ๋ฅ
- ์ด์์น์ ๊ฒฌ๊ณ ํ๋ฉฐ ๋ฐ์ดํฐ ์ค์ผ์ผ๋ง์ด ๋ถํ์(๋ฐ์ดํฐ์ ์๋์ ์ธ ์์๋ฅผ ๊ณ ๋ คํด์)
- ๋จ์
- ๋๋ฌด๊ฐ ์ฑ์ฅ์ ๋๋ฌด ๋ง์ดํ๋ฉด ๊ณผ๋ ์ ํฉ์ ์ค๋ฅ์ ๋น ์ง ์ ์๋ค.
- ํ๋ จ ๋ฐ์ดํฐ์ ๋ฏผ๊ฐํ๊ฒ ๋ฐ์ํ์ฌ ์์ ๋ณํ๊ฐ ๋ ธ์ด์ฆ์๋ ๋๋ฌด์ ๊ตฌ์กฐ๊ฐ ํฌ๊ฒ ๋ฌ๋ผ์ง(๋ถ์์ ์ฑ)
from sklearn.tree import DecisionTreeClassifier, plot_tree
model_dt = DecisionTreeClassifier(max_depth=1, random_state= 42)
# fitting
X = titanic[X_features]
y = titanic['Survived']
model_dt.fit(X,y)
# ์์ฌ๊ฒฐ์ ๋๋ฌด ๊ทธ๋ฆฌ๊ธฐ
X_features = ['Pclass','Sex','Age']
plot_tree(model_dt,
feature_names=X_features,
class_names=['Not Survived','Survived'], #
filled = True # ์์ฌ๊ฒฐ์ ๋๋ฌด ์์ ์ฌ๊ฐํ์ ์ฑ์ฐ๊ธฐ
)
plt.show()
- max_depth์ ๊ฒฝ์ฐ ์์ฌ๊ฒฐ์ ๋๋ฌด๊ฐ ์ผ๋ง๋ ์๋ ๊ฒ์ธ์ง๋ฅผ ์ง์ ํ๋ค.
๋๋ค ํฌ๋ ์คํธ
๋จธ์ ๋ฌ๋์์ ๊ฐ์ฅ ์ค์ํ ๊ฒ์ ๋ฐ์ดํฐ์ ์. ๋ค๋ค์ต์ ์ผ๋ก ๋จธ์ ๋ฌ๋ ์ ์ฐ๋ฆฌ๋ ํญ์ '๋ฐ์ดํฐ ๋ถ์กฑ' ๋ฌธ์ ์ ์ง๋ฉดํ๊ฒ ๋๋ค. ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ฐ๋ฆฌ๋ Bagging์ ํ์ฉํ ์ ์๋ค.
๐ Bagging
*
- Bootstrapping: ๋ฐ์ดํฐ๋ฅผ ๋ณต์ ์ถ์ถํด์ ์ ์ฌํ์ง๋ง ๋ค๋ฅธ ๋ฐ์ดํฐ ์ง๋จ์ ์์ฑํ๋ ๊ฒ
- Aggregating: ๋ฐ์ดํฐ์ ์์ธก,๋ถ๋ฅ ๊ฒฐ๊ณผ๋ฅผ ํฉ์น๋ ๊ฒ
- Ensemble(์์๋ธ): ์ฌ๋ฌ ๊ฐ์ ๋ชจ๋ธ์ ๋ง๋ค์ด ๊ฒฐ๊ณผ๋ฅผ ํฉ์น๋ ๊ฒ
๐ฆ ๋๋คํฌ๋ ์คํธ
๋ถ๋ฅ, ํ๊ท ๋ถ์ ๋ฑ์ ์ฌ์ฉ๋๋ ์์๋ธ ํ์ต ๋ฐฉ๋ฒ์ ์ผ์ข ์ผ๋ก, ํ๋ จ ๊ณผ์ ์์ ๊ตฌ์ฑํ ๋ค์์ ๊ฒฐ์ ํธ๋ฆฌ๋ก๋ถํฐ ๋ถ๋ฅ(๋ถ๋ฅ) ๋๋ ํ๊ท ์์ธก์น(ํ๊ท ๋ถ์)๋ฅผ ์ถ๋ ฅํจ์ผ๋ก์จ ๋์ํ๋ค.
- Random Forest์ key idea
Optimal Splitting variable ์ฐพ์ ๋ ๋ชจ๋ ๋ณ์๋ฅผ ์ฌ์ฉํ์ง ์๊ณ , ์์์ n (<p)๊ฐ ์ค๋ช ๋ณ์๋ง ์ฌ์ฉํ์ฌ ๊ฐ๋ณ ์์ธก๋ชจํ(tree)์ ์ฑ๋ฅ์ ๋จ์ด์ง๋ ์ ์ฒด Agg. model์ ์ฑ๋ฅ์ ์ข์์ง๊ฒ ํ๋ ๊ฒ์ด๋ค. - ์ฅ์
- Bagging ๊ณผ์ ์ ํตํด ๊ณผ์ ํฉ์ ํผํ ์ ์๋ค.
- ์ด์์น์ ๊ฒฌ๊ณ ํ๋ฉฐ ๋ฐ์ดํฐ ์ค์ผ์ผ๋ง์ด ๋ถํ์
- ๋ณ์ ์ค์๋๋ฅผ ์ถ์ถํ์ฌ ๋ชจ๋ธ ํด์์ ์ค์ํ ํน์ง์ ํ์ ํ ์ ์๋ค.
- ๋จ์
- ์ปดํจํฐ ๋ฆฌ์์ค ๋น์ฉ์ด ํฌ๋ค.
- ์์๋ธ ์ ์ฉ์ผ๋ก ํด์์ด ์ด๋ ต๋ค.
from sklearn.ensemble import RandomForestClassifier
model_rf = RandomForestClassifier(random_state=42)
# fitting
model_rf.fit(X,y)
# prdict
y_rf_pred = model_rf.predict(X)
- Random Forest๋ฅผ ์ฌ์ฉํ๋ฉด, ๋ณ์๋ณ ์ค์๋๋ฅผ ํ์ธํ ์ ์๋ค.
ftr_importances = model_rf.feature_importances_
for x, imp in zip(X_features,ftr_importances):
print(f'{x}์ ์ค์๋๋ {imp : .3f}์
๋๋ค.')
๋ก์ง์คํฑ ํ๊ท vs. ์์ฌ๊ฒฐ์ ๋๋ฌด vs. ๋๋ค ํฌ๋ ์คํธ
# ํ๊ฐํ๊ธฐ
from sklearn.metrics import accuracy_score,f1_score
def get_score(model_name, y_true, y_pred):
acc = accuracy_score(y_true, y_pred)
f1 = f1_score(y_true,y_pred)
print(f'{model_name} \n accuracy: {acc : .3f} \n f1_score: {f1 : .3f}')
get_score('Logistic Regression ',y,y_lor_pred)
get_score('Decision Tree ',y,y_dt_pred)
get_score('Random Forest ',y,y_rf_pred)
KNN (K-Nearest Neighbor, ์ต๊ทผ์ ์ด์)
๐งญ KNN (K-Nearest Neighbor, ์ต๊ทผ์ ์ด์)
missing์ด ์๋ ๊ด์ธก์น์ ๊ฐ์ฅ ๊ฐ๊น์ด(←๊ฑฐ๋ฆฌ/distance์ ์ ์ ํ์) K๊ฐ์ ๊ด์ธก์น(๋ณดํต k=10)๋ฅผ ์ฐพ์์ ๋ค์๊ณผ ๊ฐ์ด imputation(๊ฐ์ ์ฑ์ด๋ค.)
- numeric → mean, median
- categorical → mode
- ์ฅ์
- ์ดํดํ๊ธฐ ์ฝ๊ณ ์ง๊ด์
- ๋ชจ์ง๋จ์ ๊ฐ์ ์ด๋ ํํ๋ฅผ ๊ณ ๋ คํ์ง ์์
- ํ๊ท, ๋ถ๋ฅ ๋ชจ๋ ๊ฐ๋ฅํจ
- ๋จ์
- ๊ณ์ฐ๋์ด ๋ง์. → ํนํ data๊ฐ ํฌ๋ฉด ์๊ฐ์ด ์ค๋ ๊ฑธ๋ฆด ์ ์์.
- ๊ฑฐ๋ฆฌ ๊ธฐ๋ฐ์ ์๊ณ ๋ฆฌ์ฆ์ด๊ธฐ ๋๋ฌธ์ ๋จ์์ ์ํฅ์ ํฌ๊ฒ ๋ฐ๋๋ค. → ํ์คํ ํ์
from sklearn.neighbors import KNeighborsClassifier
# fitting
model_knn = KNeighborsClassifier()
model_knn.fit(X,y)
# predict
y_knn_pred = model_knn.predict(X)
๐ก ํ์ดํผ ํ๋ผ๋ฏธํฐ(Hyper parameter)
๋ฐ์ดํฐ ๊ณผํ์๊ฐ ๊ธฐ๊ณ ํ์ต ๋ชจ๋ธ ํ๋ จ์ ๊ด๋ฆฌํ๋๋ฐ ์ฌ์ฉํ๋ ์ธ๋ถ ๊ตฌ์ฑ๋ณ์์ด๋ฉฐ ๋ชจ๋ธ ํ์ต๊ณผ์ ์ด๋ ๊ตฌ์กฐ์ ์ํฅ์ ๋ฏธ์น๋ค.
KNN์ ๊ฒฝ์ฐ ์ธ๊ทผ k๊ฐ์ ํ๋ผ๋ฏธํฐ๋ฅผ ์ฐพ์ imputationํ๊ฒ ๋๋๋ฐ, ์ด๋ k์ ์ง์ ํ๋ ๊ฐ์ด ๋ฐ๋ก ํ์ดํผ ํ๋ผ๋ฏธํฐ๊ฐ ๋๋ค.
- ๋ชจ๋ธ์ ํ์ดํผ ํ๋ผ๋ฏธํฐ ๋ณ์๋ฅผ ๋ฐ๊พธ๋ฉด์ ์ข์ ํ๊ฐ ์งํ๊ฐ ๋์ฌ ๋๊น์ง ์คํํ๊ณ ์๋ฆฌ๋ฅผ ๋ฐํ๋ด๋ ๊ฒ์ด ๋ฐ๋ก ๋ฐ์ดํฐ ์ฌ์ด์ธ์ค์ ๊ธฐ๋ฐ
๋ถ์คํ ์๊ณ ๋ฆฌ์ฆ
๐ ๋ถ์คํ (Boosting) ์๊ณ ๋ฆฌ์ฆ
์ฌ๋ฌ ๊ฐ์ ์ฝํ ํ์ต๊ธฐ(weak learner)๋ฅผ ์์ฐจ์ ์ผ๋ก ํ์ตํ๋ฉด์ ์๋ชป ์์ธกํ ๋ฐ์ดํฐ์ ๊ฐ์ค์น๋ฅผ ๋ถ์ฌํ์ฌ ์ค๋ฅ๋ฅผ ๊ฐ์ ํด๋๊ฐ๋ ํ์ต ๋ฐฉ์. ๊ณ์ residulal์ fitting → minimum loss ๋ชจํ์ผ๋ก ๊ฐ๋ ๊ฒ.
์ข ๋ฅ | GBM | XGBoost | LightGBM |
---|---|---|---|
Python ๋ผ์ด๋ธ๋ฌ๋ฆฌ |
sklearn.ensemble GradientBoostingRegressor |
xgboost.XGBRegressor |
lightgbm.LGBMClassifier lightgbm.LGBMRegressor |
ํน์ง | ๊ฐ์ค์น ์ ๋ฐ์ดํธ๋ฅผ ๊ฒฝ์ฌํ๊ฐ๋ฒ ๋ฐฉ๋ฒ์ ํตํด ์งํ |
|
|
## GBM
from sklearn.ensemble import GradientBoostingClassifier
# fitting
model_gbm = GradientBoostingClassifier(random_state= 42)
model_gbm.fit(X,y)
# predict
y_gbm_pred = model_gbm.predict(X)
## XGboost
from xgboost import XGBClassifier
# fitting
model_xgb = XGBClassifier(random_state= 42)
model_xgb.fit(X,y)
# predict
y_xgb_pred = model_xgb.predict(X)
## lightGBM
from lightgbm import LGBMClassifier
# fitting
model_lgb = LGBMClassifier(random_state= 42)
model_lgb.fit(X,y)
# predict
y_lgb_pred = model_lgb.predict(X)
- ๊ฐ์ฅ ์ฑ๋ฅ์ด ์ข์ ๊ฒ์ Random Forest์ด์ง๋ง, ๋ถ์คํ ์๊ณ ๋ฆฌ์ฆ ์ค์์๋ XGboost์ light GBM์ ์ฑ๋ฅ์ด ์ข๋ค.
# accuracy์ f1-score๋ฅผ ๊ณ์ฐํ๋ get_score ํจ์
def get_score(model_name, y_true, y_pred):
acc = accuracy_score(y_true, y_pred)
f1 = f1_score(y_true,y_pred)
print(f'{model_name} \n accuracy: {acc : .3f} \n f1_score: {f1 : .3f}')
get_score('Logistic Regression ',y,y_lor_pred)
get_score('Decision Tree ',y,y_dt_pred)
get_score('Random Forest ',y,y_rf_pred)
get_score('KNN',y,y_knn_pred)
get_score('GBM ',y,y_gbm_pred)
get_score('XGboost ',y,y_xgb_pred)
get_score('lightGBM ',y,y_lgb_pred)
'๐ Today I Learn > ๐ Python' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋จธ์ ๋ฌ๋ ํน๊ฐ #1 ๋ถ๋ฅ(Clasification) (0) | 2024.06.12 |
---|---|
๋จธ์ ๋ฌ๋์ ์ดํด์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํ์ฉ (6) ๋น์ง๋ํ์ต (0) | 2024.06.11 |
ํต๊ณ์ผ ๋์ (4) ์ง๋ํ์ต๊ณผ ๋น์ง๋ํ์ต (1) | 2024.06.11 |
ํต๊ณ์ผ ๋์ (3) ํ๊ท์ ์์ธก (2) | 2024.06.10 |
๋จธ์ ๋ฌ๋์ ์ดํด์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํ์ฉ (4) ๋ฐ์ดํฐ ๋ถ์ ํ๋ก์ธ์ค (0) | 2024.06.08 |