๋ฌ๋์คํผ์ฆ ์์ ์ ๋ฆฌ
< ์ด์ ๊ธ >
https://silvercoding.tistory.com/66
[Bank Marketing๋ฐ์ดํฐ ๋ถ์] 1. python ๋ฐฐ๊น , ๋๋คํฌ๋ ์คํธ bagging, randomforest
๋ฌ๋์คํผ์ฆ ์์ ์ ๋ฆฌ < ์ด์ ๊ธ > https://silvercoding.tistory.com/65 https://silvercoding.tistory.com/64 https://silvercoding.tistory.com/63?category=967543 https://silvercoding.tistory.com/62 [bost..
silvercoding.tistory.com
๋ถ์คํ Boosting
๊ฐ ๋ชจ๋ธ์ ๋ค์์ฑ ํ๋ณด (๋ถ์คํ ์ ์ฐจ)
- ์ด์ ๋ชจ๋ธ์์ ์ค๋ถ๋ฅํ ๊ฐ์ฒด์ ๊ฐ์ค์น๋ฅผ ๋์ฌ ์๋ก์ด ๋ฐ์ดํฐ(๊ฐ์ค์น๊ฐ ๋ถ์ฌ๋)๋ก ๋ชจ๋ธ ํ์ต
- ๊ฐ ๋ฐ์ดํฐ์ ์ผ๋ก ๋ชจ๋ธ ๋ง๋ฆ
- ๋ชจ๋ธ๋ณ๋ก ํ์ตํ๋ ๋ฐ์ดํฐ์ ์ ๋ค์์ฑ์ผ๋ก ์ธํด ๋ชจ๋ธ์ ๋ค์์ฑ ํ๋ณด
์ต์ข ๊ฒฐ๊ณผ๋ฌผ ๊ฒฐํฉ
- ๊ฐ ๋ชจ๋ธ๋ก๋ถํฐ ๋์จ ์์ธก์น๋ฅผ ๊ฐ์คํ๊ท
n_estimators ์ค์
(n_estimators : ๋ช ๊ฐ์ ์์ฌ๊ฒฐ์ ๋๋ฌด๋ฅผ ๋ง๋ค ๊ฒ์ธ์ง)
- n_estimators ๊ฐ ๋๋ฌด ๋์ผ๋ฉด ๋ ธ์ด์ฆ์ ๋ฏผ๊ฐํ ์ค๋ฒํผํ ์ฐ๋ ค
- n_estimators๊ฐ ๋๋ฌด ๋ฎ์ผ๋ฉด ์ธ๋ํผํ ์ฐ๋ ค
- ์ ์ ํ n_estimators๋ฅผ ์ฐพ์๋ด๋ ๊ฒ์ด ๊ด๊ฑด
๋ฐ์ดํฐ ๋ถ๋ฌ์ค๊ธฐ
import os
import pandas as pd
os.chdir('../data') # ๋ณธ์ธ ํ์ผ์ด ์กด์ฌํ๋ ํด๋ ๊ฒฝ๋ก
data = pd.read_csv("bank-additional-full.csv", sep = ';')
data.head()
data.info()
์ ์ฒ๋ฆฌ - ๋ฒ์ฃผํ ๋ณ์ ์ํซ์ธ์ฝ๋ฉ
data = pd.get_dummies(data,columns=['job','marital','education','default','housing','loan','contact','month','day_of_week','poutcome'])
dtype์ด object์ธ ๋ฒ์ฃผํ ๋ณ์๋ฅผ get_dummies๋ฅผ ์ฌ์ฉํ์ฌ ์ํซ์ธ์ฝ๋ฉ ํด์ค๋ค.
train & test ๋ฐ์ดํฐ์ ๋ถ๋ฆฌ
data['id']=range(len(data))
๋ฐ์ดํฐ๋ฅผ ๊ตฌ๋ถํ๊ธฐ ์ํ์ฌ ๊ฐ row์ id๋ฅผ ๋ถ์ฌํ๋ค.
train = data.sample(30000,replace=False,random_state=2020).reset_index().drop(['index'],axis=1)
test = data.loc[ ~data['id'].isin(train['id']) ].reset_index().drop(['index'],axis=1)
์ด์ ๊ธ๊ณผ ๋์ผํ๊ฒ train, test ๋ฐ์ดํฐ์ ์ ๋ถ๋ฆฌํด ์ค๋ค.
์ธํ๋ณ์ ์ ์ฅ
data.columns
input_var = ['age', 'duration', 'campaign', 'pdays', 'previous', 'emp.var.rate',
'cons.price.idx', 'cons.conf.idx', 'euribor3m', 'nr.employed',
'job_admin.', 'job_blue-collar', 'job_entrepreneur', 'job_housemaid',
'job_management', 'job_retired', 'job_self-employed', 'job_services',
'job_student', 'job_technician', 'job_unemployed', 'job_unknown',
'marital_divorced', 'marital_married', 'marital_single',
'marital_unknown', 'education_basic.4y', 'education_basic.6y',
'education_basic.9y', 'education_high.school', 'education_illiterate',
'education_professional.course', 'education_university.degree',
'education_unknown', 'default_no', 'default_unknown', 'default_yes',
'housing_no', 'housing_unknown', 'housing_yes', 'loan_no',
'loan_unknown', 'loan_yes', 'contact_cellular', 'contact_telephone',
'month_apr', 'month_aug', 'month_dec', 'month_jul', 'month_jun',
'month_mar', 'month_may', 'month_nov', 'month_oct', 'month_sep',
'day_of_week_fri', 'day_of_week_mon', 'day_of_week_thu',
'day_of_week_tue', 'day_of_week_wed', 'poutcome_failure',
'poutcome_nonexistent', 'poutcome_success']
data์ ์ปฌ๋ผ์์ y๋ฅผ ์ ์ธํ ์ปฌ๋ผ์ input_var์ ์ ์ฅํด ์ค๋ค.
XGBoost ๋ชจ๋ธํ์ต
XGBoost
- ํน์ง
- ํด์์ด ์ด๋ ค์
- ๋์ฒด์ ์ผ๋ก ๋๋คํฌ๋ ์คํธ์ ๋นํด ๋น ๋ฅด๊ณ ์ฑ๋ฅ์ด ์ข์
- xgb = XGBClassifier( n_estimators = 300, learning_rate = 0.1 )
- n_estimators : ๋ช ๊ฐ์ ์์ฌ๊ฒฐ์ ๋๋ฌด๋ฅผ ๋ง๋ค ๊ฒ์ธ์ง
- learning_rate : ์ผ๋ง๋ ๋น ๋ฅด๊ฒ ํ์ตํ ๊ฒ์ธ์ง
-์ค์น
!pip install xgboost
์ฐ์ xgboost๊ฐ ์ค์น๋์ด์์ง ์๋ค๋ฉด ์ค์นํด ์ค๋ค.
from xgboost import XGBClassifier
xgb = XGBClassifier( n_estimators = 300, learning_rate = 0.1 )
xgb.fit(train[input_var], train['y'])
๊ฐ์ฒด ์์ฑ์ ํ๊ณ , train ๋ฐ์ดํฐ์ ์ผ๋ก ํ์ต๊น์ง ์งํํ๋ค.
predictions = xgb.predict(test[input_var])
test ๋ฐ์ดํฐ์ ์ผ๋ก ์์ธก์ ์ํํ ํ predictions์ ์ ์ฅํ๋ค.
(pd.Series(predictions)==test['y']).mean()
์ ํ๋๊ฐ ์ฝ 91 % ๊ฐ ๋์๋ค. ํ์ฌ ๋ชจ๋ธ์ n_estimators๋ฅผ 300์ผ๋ก ์ง์ ํ์๋ค. ์์์ ํ์ตํ์๋ฏ์ด, ์ค๋ฒํผํ ๊ณผ ์ธ๋ํผํ ์ ํผํ๊ธฐ ์ํด์๋ ๋ถ์คํ ์์ n_estimators๋ฅผ ์ ์ ํ๊ฒ ์ค์ ํ๋ ๊ฒ์ด ๊ด๊ฑด์ด๋ผ๊ณ ํ์๋ค. ๋ฐ๋ผ์ ์ต์ ์ n_estimators๋ฅผ ์ฐพ์๋ณด๋๋ก ํ๋ค.
์ต์ ์์ฌ๊ฒฐ์ ๋๋ฌด ์ ( n_estimators ) ์ฐพ๊ธฐ
for n in [100,200,300,400,500,600,700,800,900]:
xgb = XGBClassifier( n_estimators = n, learning_rate = 0.05, eval_metric='logloss' )
xgb.fit(train[input_var], train['y'])
predictions = xgb.predict(test[input_var])
print((pd.Series(predictions)==test['y']).mean())
๊ฒฐ๊ณผ : ์ต์ ์ n_estimators ๋ 400์ด๋ค.
๋ณ์์ค์๋
feature_imp = xgb.feature_importances_
feature_importances_ ๋ฅผ ์ฌ์ฉํ์ฌ ๋ณ์์ค์๋๋ฅผ ๊ณ์ฐํ ์ ์๋ค.
imp_df = pd.DataFrame({'var':input_var,
'imp':feature_imp})
imp_df.sort_values(['imp'],ascending=False)
๋ณ์์ค์๋๋ฅผ ๋ด๋ฆผ์ฐจ์์ผ๋ก ์ ๋ ฌํด๋ณด๋ nr.emplyed ์ปฌ๋ผ์ด ๊ฐ์ฅ ์ค์ํ ๋ณ์๋ก ๋์จ ๊ฒ์ ๋ณผ ์ ์๋ค.