240206 TUE ๋จธ์ ๋ฌ๋ ์ฌํ - ํ๊ท, ๋ถ๋ฅ ๋ชจ๋ธ
1. ์์ฌ๊ฒฐ์ ๋๋ฌด (Decision Tree, DT)
์์ฌ๊ฒฐ์ ๊ท์น์ ๋๋ฌด ๊ตฌ์กฐ๋ก ๋ํ๋ด์ด ์ ์ฒด ์๋ฃ๋ฅผ ๋ช ๊ฐ์ ์์ง๋จ์ผ๋ก ๋ถ๋ฅํ๊ฑฐ๋ ์์ธก์ ์ํํ๋ ๋ถ์ ๋ฐฉ๋ฒ
โ ํน์ง
์ฅ์ | ์ฝ๊ณ ํด์ํ๊ธฐ ์ฉ์ด |
๋ค์ค๋ถ๋ฅ, ํ๊ท ๋ชจ๋ ์ ์ฉ ๊ฐ๋ฅ | |
์ด์์น์ ๊ฒฌ๊ณ ํ๋ฉฐ, ๋ฐ์ดํฐ ์ค์ผ์ผ๋ง์ด ๋ถํ์ *๋ฐ์ดํฐ์ ์๋์ ์์๋ฅผ ๊ณ ๋ คํ์ฌ | |
๋จ์ | ๋๋ฌด๊ฐ ์ฑ์ฅ์ ๋๋ฌด ๋ง์ด ํ๋ฉด ๊ณผ๋ ์ ํฉ์ ์ค๋ฅ์ ๋น ์ง ์ ์์ |
ํ๋ จ ๋ฐ์ดํฐ์ ๋ฏผ๊ฐํ๊ฒ ๋ฐ์ํ์ฌ ์์ ๋ณํ๋ ๋ ธ์ด์ฆ์๋ ๋๋ฌด์ ๊ตฌ์กฐ๊ฐ ํฌ๊ฒ ๋ฌ๋ผ์ง (๋ถ์์ ์ฑ) | |
ํ์ด์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ |
sklearn.tree.DecisionTreeClassifier |
sklearn.tree.DecisionTreeRegressor |
โ ์ฉ์ด (+์์)
- ๋ฃจํธ ๋ ธ๋(Root Node): ์์ฌ๊ฒฐ์ ๋๋ฌด์ ์์์ . ์ต์ด์ ๋ถํ ์กฐ๊ฑด
- ๋ฆฌํ ๋ ธ๋(Leaf Node): ๋ฃจํธ ๋ ธ๋๋ก๋ถํฐ ํ์๋ ์ค๊ฐ ํน์ ์ต์ข ๋ ธ๋
- ๋ถ๋ฅ๊ธฐ์ค(criteria): sex๋ ์ฌ์ฑ์ธ ๊ฒฝ์ฐ 0, ๋จ์ฑ์ธ ๊ฒฝ์ฐ 1๋ก ์ธ์ฝ๋ฉ. ์ฌ์ฑ์ธ ๊ฒฝ์ฐ ์ข์ธก ๋ ธ๋๋ก, ๋จ์ฑ์ธ ๊ฒฝ์ฐ ์ฐ์ธก ๋ ธ๋๋ก ๋ถ๋ฅ
- ๋ถ์๋(impurity)
- ๋ถ์๋ ์ธก์ ๋ฐฉ๋ฒ ์ค ํ๋ ์ธ ์ง๋ ๊ณ์๋ 0๊ณผ 1์ฌ์ด ๊ฐ์ผ๋ก 0์ด ์๋ฒฝํ ์๋(๋ชจ๋ ์ํ์ด ํ๋์ ํด๋์ค), 1์ ์์ ํ ๋ถ์๋(๋ ธ๋์ ์ํ์ ๊ท ๋ฑํ๊ฒ ๋ถํฌ) ๋จ์ ๋ํ๋
- ๋ฆฌํ ๋ ธ๋๋ก ๊ฐ์๋ก ๋ถ์๋๊ฐ ์์์ง๋(ํ์ชฝ์ผ๋ก ํด๋์ค๊ฐ ๋ถ๋ฅ๊ฐ ์๋๋)๋ฐฉํฅ์ผ๋ก ๋๋ฌด๊ฐ ์๋
- ์ํ(samples): ํด๋น ๋ ธ๋์ ์ํ ๊ฐ์(891๊ฐ์ ๊ด์ธก์น)
- ๊ฐ(value): Y๋ณ์์ ๋ํ ๋ฐฐ์ด. 549๋ช ์ด ์ฃฝ์๊ณ (Y = 0), 342๋ช ์ด ์ด์์(Y = 1)
- ํด๋์ค(class)
- ๊ฐ์ฅ ๋ง์ ์ํ์ ์ฐจ์งํ๋ ํด๋์ค๋ฅผ ํํ
- ์์์๋ ์ฃผํฉ์(Y = 0 ๋ค์), ํ๋์(Y=1 ๋ค์)๋ฅผ ํํ
โ ์ค์ต
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.preprocessing import LabelEncoder
from sklearn.tree import DecisionTreeClassifier, plot_tree
titanic_df = pd.read_csv('C:/Users/Downloads/vscode/ML/titanic/train.csv')
# Pclass, Sex: LabelEncoder
# Age: ๊ฒฐ์ธก์น ์์ผ๋ฏ๋ก ํ๊ท ์ผ๋ก ๋์น
X_features = ['Pclass', 'Sex', 'Age']
le = LabelEncoder()
titanic_df['Sex'] = le.fit_transform(titanic_df['Sex'])
le2 = LabelEncoder()
titanic_df['Pclass'] = le.fit_transform(titanic_df['Pclass'])
age_mean = titanic_df['Age'].mean()
titanic_df['Age'] = titanic_df['Age'].fillna(age_mean)
x = titanic_df[X_features]
y = titanic_df['Survived']
# ์ผ๊ด๋ ํ๊ฐ๋ฅผ ์ํ random_state ๊ณ ์ : random_state = 42
model_dt = DecisionTreeClassifier(max_depth = 1)
model_dt.fit(x, y)
plt.figure(figsize = (10, 5))
plot_tree(model_dt, feature_names = X_features, class_names = ['Not Survived', 'Survived'], filled = True)
plt.show()
2. ๋๋ค ํฌ๋ ์คํธ (Random Forest, RF)
์์ฌ๊ฒฐ์ ๋๋ฌด์ ๊ณผ์ ํฉ๊ณผ ๋ถ์์ ์ฑ์ ํด๊ฒฐํ๊ธฐ ์ํด ๋๋ฌด๋ฅผ ์ฌ๋ฌ ๊ฐ ๋ง๋ค์ด ์ฒ์ ๋ง๋๋ ๊ฒ
โ ๋ฐฐ๊น (Bagging)์ ์๋ฆฌ
๋จธ์ ๋ฌ๋์ ์ธ์ ๋ ๋ฐ์ดํฐ์ ๋ถ์กฑ์ด ๋ฌธ์
์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ Bootstrapping + Aggregating ๋ฐฉ๋ฒ๋ก
- Bootstrapping: ๋ฐ์ดํฐ๋ฅผ ๋ณต์ ์ถ์ถํด์ ์ ์ฌํ์ง๋ง ๋ค๋ฅธ ๋ฐ์ดํฐ ์ง๋จ์ ์์ฑํ๋ ๊ฒ
- Aggregating: ๋ฐ์ดํฐ์ ์์ธก,๋ถ๋ฅ ๊ฒฐ๊ณผ๋ฅผ ํฉ์น๋ ๊ฒ
- Ensemble: ์ฌ๋ฌ ๊ฐ์ ๋ชจ๋ธ์ ๋ง๋ค์ด ๊ฒฐ๊ณผ๋ฅผ ํฉ์น๋ ๊ฒ
โ Tree๋ฅผ Forest๋ก ๋ง๋ค๊ธฐ
์ฌ๋ฌ ๊ฐ์ ๋ฐ์ดํฐ ์ํ์์ ๊ฐ์ ์์ฌ๊ฒฐ์ ํธ๋ฆฌ๋ฅผ ๋ง๋ค์ด์ ๋ค์๊ฒฐ ๋ฒ์น์ ๋ฐ๋ผ ๊ฒฐ๋ก ์ ๋
ex) 1๋ฒ ์น๊ฐ์ ๋ํด์ ๋ชจ๋ธ 2๊ฐ๋ ์์กด, ๋ชจ๋ธ 1๊ฐ๋ ์ฌ๋ง์ ๋ถ๋ฅํ์๋ค๋ฉด, 1๋ฒ ์น๊ฐ์ ์ต์ข ์ ์ผ๋ก ์์กด์ผ๋ก ๋ถ๋ฅ
์์ฌ๊ฒฐ์ ๋๋ฌด์ ์ฅ์ ์ ์์ฉํ๊ณ ๋จ์ ์ ๋ณด์
โก๏ธ ๋๋ค ํฌ๋ ์คํธ๋ ์ผ๋ฐ์ ์ผ๋ก ๊ต์ฅํ ๋ฐ์ด๋ ์ฑ๋ฅ์ ๋ณด์ฌ์ ์ง๊ธ๋ ์์ฃผ ์ฐ์ด๋ ์๊ณ ๋ฆฌ์ฆ
โ ํน์ง
์ฅ์ | Bagging ๊ณผ์ ์ ํตํด ๊ณผ์ ํฉ์ ํผํ ์ ์์ |
์ด์์น์ ๊ฒฌ๊ณ ํ๋ฉฐ, ,๋ฐ์ดํฐ ์ค์ผ์ผ๋ง์ด ๋ถํ | |
๋ณ์ ์ค์๋๋ฅผ ์ถ์ถํ์ฌ ๋ชจ๋ธ ํด์์ ์ค์ํ ํน์ง์ ํ์ ๊ฐ๋ฅ | |
๋จ์ | ์ปดํจํฐ ๋ฆฌ์์ค ๋น์ฉ์ด ํผ (๋ชจ๋ธ์ ์ฌ๋ฌ๊ฐ ์์ฑํ๊ธฐ ๋๋ฌธ) |
์์๋ธ ์ ์ฉ์ผ๋ก ํด์์ด ์ด๋ ค | |
ํ์ด์ฌ ํจํค์ง |
sklearn.ensemble.RandomForestClassifer |
sklearn.ensemble.RandomForestRegressor |
โ ์ค์ต
from sklearn.linear_model import LogisticRegression
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score, f1_score
model_lor = LogisticRegression()
model_dt = DecisionTreeClassifier()
model_rf = RandomForestClassifier()
model_lor.fit(x, y)
model_dt.fit(x, y)
model_rf.fit(x, y)
y_lor_pred = model_lor.predict(x)
y_dt_pred = model_dt.predict(x)
y_rf_pred = model_rf.predict(x)
def get_score(model_name, y_true, y_pred):
acc = accuracy_score(y_true, y_pred)
f1 = f1_score(y_true, y_pred)
print(model_name, ')', 'acc ์ค์ฝ์ด: ', acc, ',', 'f1 ์ค์ฝ์ด: ', f1)
get_score('lor', y, y_lor_pred)
get_score('dt', y, y_dt_pred)
get_score('rf', y, y_rf_pred)
3. ์ต๊ทผ์ ์ด์ (K-Nearest Neighbor, KNN)
์ฃผ๋ณ์ ๋ฐ์ดํฐ๋ฅผ ๋ณด๊ณ ๋ด๊ฐ ์๊ณ ์ถ์ ๋ฐ์ดํฐ๋ฅผ ์์ธกํ๋ ๋ฐฉ์
ํ์ธํ ์ฃผ๋ณ ๋ฐ์ดํฐ K๊ฐ๋ฅผ ์ ์ ํ์ ๊ฑฐ๋ฆฌ ๊ธฐ์ค์ผ๋ก ๊ฐ์ฅ ๋ง์ ๊ฒ์ผ๋ก ์์ธกํ๋ ๊ฒ์ด ๊ธฐ๋ณธ ์๋ฆฌ
- K=3์ด๋ผ๋ฉด, ๋ณ 1๊ฐ์ ์ธ๋ชจ 2๊ฐ์ด๋ฏ๋ก ? ๋ ์ธ๋ชจ๋ก ์์ธก๋ ๊ฒ
- K=7์ด๋ผ๋ฉด, ๋ณ 4๊ฐ์ ์ธ๋ชจ 3๊ฐ์ด๋ฏ๋ก ?๋ ๋ณ๋ก ์์ธก๋ ๊ฒ
โ ํ์ดํผ ํ๋ผ๋ฏธํฐ
- ํ๋ผ๋ฏธํฐ(Parameter): ๋จธ์ ๋ฌ๋ ๋ชจ๋ธ์ด ํ์ต ๊ณผ์ ์์ ์ถ์ ํ๋ ๋ด๋ถ ๋ณ์์ด๋ฉฐ ์๋์ผ๋ก ๊ฒฐ์ ๋๋ ๊ฐ
- ex) ์ ํํ๊ท์์ ๊ฐ์ค์น์ ํธํฅ
- (โ ์ฃผ์์ฌํญ) Python์์๋ ํจ์ ์ ์์์ ํจ์๊ฐ ๋ฐ์ ์ ์๋ ์ธ์(์ ๋ ฅ ๊ฐ)๋ฅผ ์ง์ ํ๋ ๊ฐ๋
- ํ์ดํผ ํ๋ผ๋ฏธํฐ(Hyper parameter): ๋ฐ์ดํฐ ๊ณผํ์๊ฐ ๊ธฐ๊ณ ํ์ต ๋ชจ๋ธ ํ๋ จ์ ๊ด๋ฆฌํ๋๋ฐ ์ฌ์ฉํ๋ ์ธ๋ถ ๊ตฌ์ฑ๋ณ์์ด๋ฉฐ ๋ชจ๋ธ ํ์ต๊ณผ์ ์ด๋ ๊ตฌ์กฐ์ ์ํฅ์ ๋ฏธ์นจ
โ ๊ฑฐ๋ฆฌ์ ๊ฐ๋
- ์ ํด๋ฆฌ๋ ๊ฑฐ๋ฆฌ(Euclidean Distance): ๋ ์ ์ ์ขํ๊ฐ ์ฃผ์ด์ก์ ๋ ํผํ๊ณ ๋ผ์ค์ ์ ๋ฆฌ๋ก ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํจ
- ํ์คํ ํ์
โ ํน์ง
์ฅ์ | ์ดํดํ๊ธฐ ์ฝ๊ณ ์ง๊ด์ |
๋ชจ์ง๋จ์ ๊ฐ์ ์ด๋ ํํ๋ฅผ ๊ณ ๋ คํ์ง ์์ | |
ํ๊ท, ๋ถ๋ฅ ๋ชจ๋ ๊ฐ๋ฅ | |
๋จ์ | ์ฐจ์ ์๊ฐ ๋ง์ ์๋ก ๊ณ์ฐ๋์ด ๋ง์์ง |
๊ฑฐ๋ฆฌ ๊ธฐ๋ฐ์ ์๊ณ ๋ฆฌ์ฆ์ด๊ธฐ ๋๋ฌธ์ ํผ์ฒ์ ํ์คํ๊ฐ ํ์ํจ | |
ํ์ด์ฌ ๋ผ์ด๋ธ๋ฌ |
sklearn.neighbors.KNeighborsClassifier |
sklearn.neighbors.KNeighborsRegressor |
4. ๋ถ์คํ ์๊ณ ๋ฆฌ์ฆ
์ฌ๋ฌ ๊ฐ์ ์ฝํ ํ์ต๊ธฐ(weak learner)๋ฅผ ์์ฐจ์ ์ผ๋ก ํ์ตํ๋ฉด์, ์๋ชป ์์ธกํ ๋ฐ์ดํฐ์ ๊ฐ์ค์น๋ฅผ ๋ถ์ฌํ์ฌ ์ค๋ฅ๋ฅผ ๊ฐ์ ํด๋๊ฐ๋ ํ์ต ๋ฐฉ์
โ ์ข ๋ฅ
Gradient Boosting Model | XGBoost | LightGBM | |
ํน์ง | ๊ฐ์ค์น ์
๋ฐ์ดํธ๋ฅผ ๊ฒฝ์ฌํ๊ฐ๋ฒ์ ํตํด ์งํ |
ํธ๋ฆฌ๊ธฐ๋ฐ ์์๋ธ ๊ธฐ๋ฒ | XGBoost์ ํจ๊ป ๊ฐ์ฅ ๊ฐ๊ด๋ฐ๋ ์๊ณ ๋ฆฌ์ฆ |
๊ฐ์ฅ ๊ฐ๊ด๋ฐ์ผ๋ฉฐ Kaggle์ ์์ ์๊ณ ๋ฆฌ์ฆ |
XGBoost๋ณด๋ค ํ์ต์๊ฐ์ด ์งง๊ณ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ด ์์ |
||
๋ณ๋ ฌํ์ต์ด ๊ฐ๋ฅํด ์๋๊ฐ ๋น ๋ฆ | ์์ ๋ฐ์ดํฐ(10,000๊ฑด ์ดํ)์ ๊ฒฝ์ฐ ๊ณผ์ ํฉ ๋ฐ์ | ||
ํ์ด์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ |
sklearn.ensemble.GradientBoostingClassifier | xgboost.XGBRegressor | lightgbm.LGBMClassifier |
sklearn.ensemble.GradientBoostingRegressor | xgboost.XGBRegressor | lightgbm.LGBMRegressor |
* ์กฐ์ ํ ๋ณ์๊ฐ ๋ง์ ๋ฑ์ ์ด์ ๋ก, ์ด๋ก ์ ๋ํด ์ ์๋ ๊ฒ์ด ์ค์ํจ
5. ์ค์ต ๋น๊ต
from sklearn.neighbors import KNeighborsClassifier
from sklearn.ensemble import GradientBoostingClassifier
from xgboost import XGBClassifier
from lightgbm import LGBMClassifier
model_knn = KNeighborsClassifier()
model_gbm = GradientBoostingClassifier(random_state=42)
model_xgb = XGBClassifier(random_state=42)
model_lgb = LGBMClassifier(random_state=42)
model_knn.fit(x, y)
model_gbm.fit(x, y)
model_xgb.fit(x, y)
model_lgb.fit(x, y)
y_knn_pred = model_knn.predict(x)
y_gbm_pred = model_gbm.predict(x)
y_xgb_pred = model_xgb.predict(x)
y_lgb_pred = model_lgb.predict(x)
get_score('lor', y, y_lor_pred)
get_score('dt', y, y_dt_pred)
get_score('rf', y, y_rf_pred)
get_score('knn', y, y_knn_pred)
get_score('gbm', y, y_gbm_pred)
get_score('xgb', y, y_xgb_pred)
get_score('lgb', y, y_lgb_pred)
ํ์ด์ฌ ํ๊ท ๋ถ๋ฅ ๋ชจ๋ธ๋ง ์ค์ต
HTML ์ฝ์ ๋ฏธ๋ฆฌ๋ณด๊ธฐํ ์ ์๋ ์์ค
heleownae.tistory.com