๋ฌ๋์คํผ์ฆ ์์ ์ ๋ฆฌ
< ์ด์ ๊ธ >
https://silvercoding.tistory.com/65
[IRIS ๋ฐ์ดํฐ ๋ถ์] 2. Python Decision Tree ( ์์ฌ ๊ฒฐ์ ๋๋ฌด )
๋ฌ๋์คํผ์ฆ ์์ ์ ๋ฆฌ < ์ด์ ๊ธ > https://silvercoding.tistory.com/64 https://silvercoding.tistory.com/63?category=967543 https://silvercoding.tistory.com/62 [boston ๋ฐ์ดํฐ ๋ถ์] 1. ์ฐจ์์ถ์ (PCA) ํ..
silvercoding.tistory.com
๋ฐฐ๊น bagging
- ๋ฐฐ๊น ์ ์ฒ ํ
1. ๋ง์์๋ก ์ข๋ค.
2. ๋ค์ํ ์๋ก ์ข๋ค.
(ex) ๋จ์ฑ 1๋ช < ๋จ์ฑ 10๋ช (์๊ฐ ๋ง์) < ๋จ์ฑ 5๋ช , ์ฌ์ฑ 5๋ช (์๊ฐ ๋ง๊ณ ๋ค์ํจ)
- ๊ฐ ๋ชจ๋ธ์ ๋ค์์ฑ ํ๋ณด๋ฅผ ์ด๋ป๊ฒ ํ๋๊ฐ? (๋ฐฐ๊น ํ๋ก์ธ์ค)
1. ์ ์ฒด ๋ฐ์ดํฐ์ ์์ ๋๋ค ์ํ๋ง ( ๋ณต์ ์ถ์ถ / ์ค๋ณต ๋ฐ์ดํฐ๊ฐ ๋์ฌ์๋, ์์ ๋ฝํ์ง ์์ ๋ฐ์ดํฐ๊ฐ ์์์๋. ) -> ์ฌ๋ฌ ๋ฐ์ดํฐ์ ์์ฑ
2. ๊ฐ ๋ฐ์ดํฐ์ ์ผ๋ก ๋ชจ๋ธ ์์ฑ
3. ๋ชจ๋ธ๋ณ๋ก ํ์ตํ๋ ๋ฐ์ดํฐ์ ์ด ๋ค๋ฅด๋ฏ๋ก ๋ชจ๋ธ์ ๋ค์์ฑ ํ๋ณด
- ์ต์ข ๊ฒฐ๊ณผ๋ฌผ์ ๊ฒฐํฉ?
: ๊ฐ ๋ชจ๋ธ๋ก๋ถํฐ ๋์จ ์์ธก์น์ ๋จ์ ํ๊ท ์ ๊ตฌํ๋ค.
- ๋๋คํฌ๋ ์คํธ (๋ณธ ํฌ์คํ ์์ ์ฌ์ฉํ ๋ชจ๋ธ)
: ๋ฐฐ๊น ์ ํ๋ก์ธ์ค๋ฅผ ๋ฐ๋ฅด๋ฉด์ ์์ฌ๊ฒฐ์ ๋๋ฌด๋ฅผ ์ฌ์ฉํ๋ ์๊ณ ๋ฆฌ์ฆ
๋ฐ์ดํฐ ์ดํด๋ณด๊ธฐ
์ฌ์ฉํ ๋ฐ์ดํฐ๋ ์บ๊ธ์ Dataset ์์ ๋ฐ์ ์ ์๋ค.
< Bank Marketing dataset >
https://www.kaggle.com/volodymyrgavrysh/bank-marketing-campaigns-dataset
Bank marketing campaigns dataset | Opening Deposit
Bank Marketing (with social/economic context) dataset with loan target variable
www.kaggle.com
import os
import pandas as pd
os.chdir('../data') # ๋ณธ์ธ์ ํ์ผ ํด๋ ๊ฒฝ๋ก
data = pd.read_csv("bank-additional-full.csv", sep = ';')
๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ฌ ๋ ์ฃผ์ํ ์ ์ sep=';' ์ ์ค์ ํด ์ฃผ์ด์ผ ํ๋ค๋ ๊ฒ์ด๋ค. ์ด ํ์ผ์ csv ํ์ผ์ด์ง๋ง ์ฝค๋ง(,) ๊ฐ ์๋ ์ธ๋ฏธ์ฝ๋ก (;) ์ผ๋ก ๊ตฌ๋ถ์ด ๋์ด์๊ธฐ ๋๋ฌธ์ด๋ค.
data.head()

๋์ด, ์ง์ , ๊ฒฐํผ์ฌ๋ถ, ๋์ถ์ฌ๋ถ ๋ฑ์ ์์ธก๋ณ์๋ฅผ ์ฌ์ฉํ์ฌ ํด๋น ๊ณ ๊ฐ์ ์๊ธ ๊ฐ์ ์ฌ๋ถ๋ฅผ ๋งํ๋ ํ์ต์ ์งํํ๋ค.
data.info()

dtype์ด object์ธ ๋ณ์๋ ๋ฒ์ฃผํ ๋ณ์๋ก , ์ํซ์ธ์ฝ๋ฉ์ ํด์ฃผ์ด์ผ ํ๋ค.
๋๋คํฌ๋ ์คํธ ์ฌ์ฉ
์ ์ฒ๋ฆฌ - ๋ฒ์ฃผํ ๋ณ์ ์ํซ์ธ์ฝ๋ฉ
- dtype์ด object์ธ ์ปฌ๋ผ ์ถ์ถ
obj_column = []
for column in data.columns[:-1]:
if data[column].dtype == 'object':
obj_column.append(column)
obj_column

data = pd.get_dummies(data,columns=obj_column)
get_dummies๋ฅผ ์ด์ฉํ์ฌ ์ํซ์ธ์ฝ๋ฉ์ ์งํํ๋ค.
data

์ปฌ๋ผ์๊ฐ ๋ง์ด ๋์ด๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
data['id']=range(len(data))
๋ฐ์ดํฐ ๊ตฌ๋ถ์ ์ํ์ฌ id๊ฐ์ ๋ถ์ฌํ๋ค.
- train & test ๋ฐ์ดํฐ์ ๋ถ๋ฆฌ
train = data.sample(30000,replace=False,random_state=2020).reset_index().drop(['index'],axis=1)
train ๋ฐ์ดํฐ์ ์ ๋น๋ณต์์ถ์ถ๋ก 30000๊ฐ๋ฅผ ๊ตฌ์ฑํ๋ค.
test = data.loc[ ~data['id'].isin(train['id']) ].reset_index().drop(['index'],axis=1)
test๋ฐ์ดํฐ์ ์ train์ ์๋ id๊ฐ์ผ๋ก ์ด 11188๊ฐ์ ๋ฐ์ดํฐ๋ก ๊ตฌ์ฑ๋๋ค.
๋๋คํฌ๋ ์คํธ ๋ชจ๋ธ ํ์ต
๋๋คํฌ๋ ์คํธ
- ํน์ง
- ํด์์ด ์ด๋ ค์
- ๋งค์ฐ ๋๋ฆผ
- ์์ฌ๊ฒฐ์ ๋๋ฌด๋ณด๋ค ๋ ๊ฐ๊ด์ ์ธ ๋ณ์ ์ค์๋๋ฅผ ๋ฝ์๋ผ ์ ์์
- RandomForestClassifier(n_estimators=m, min_samples_split=n)
- n_estimators : ๋ช๊ฐ์ ์์ฌ๊ฒฐ์ ๋๋ฌด๋ฅผ ๋ง๋๋๊ฐ
- max_depth : ๊ฐ ์์ฌ๊ฒฐ์ ๋๋ฌด์ ์ต๋ ๊น์ด
- min_samples_split : ๊ฐ ์์ฌ๊ฒฐ์ ๋๋ฌด์์ ๊ฐ ๋ ธ๋์ ์ต์ ์ํ ์
from sklearn.ensemble import RandomForestClassifier
rf = RandomForestClassifier(n_estimators=500, min_samples_split=10)
๋๋คํฌ๋ ์คํธ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ค.
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 ๋ณ์์ ์ ์ฅํด ์ค๋ค.
rf.fit(train[input_var],train['y'])

train ๋ฐ์ดํฐ์ ์ผ๋ก ๋๋คํฌ๋ ์คํธ๋ถ๋ฅ๊ธฐ ๋ชจ๋ธ ํ์ต์ ์งํํ๋ค.
predictions = rf.predict(test[input_var])
test๋ฐ์ดํฐ์ ์ผ๋ก ์์ธก์ ์งํํ๊ณ , predictions ๋ณ์์ ์ ์ฅํด ์ค๋ค.
(pd.Series(predictions)==test['y']).mean()

predictions์ ์ ๋ต๊ฐ(y) ์ ๋น๊ตํ์ฌ ํ๊ท ์ ๋ด์ฃผ๋ฉด ์ ํ๋๋ ์ฝ 91% ๊ฐ ๋์ค๊ฒ ๋๋ค.
* ์์ฌ๊ฒฐ์ ๋๋ฌด์์ ๋น๊ต
from sklearn.tree import DecisionTreeClassifier
dt = DecisionTreeClassifier(min_samples_split=10)
์์ฌ๊ฒฐ์ ๋๋ฌด ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ค.
dt.fit(train[input_var], train['y'])
predictions = dt.predict(test[input_var])
ํ์ต๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ ํ์ต๊ณผ ํ ์คํธ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ ์์ธก์ ์งํํ๋ค.
(pd.Series(predictions) == test['y']).mean()

์ ํ๋๋ฅผ ๋น๊ตํด๋ณด๋ ์์ฌ๊ฒฐ์ ๋๋ฌด๋ณด๋ค ๋๋คํฌ๋ ์คํธ ๋ชจ๋ธ์ ์ ํ๋๊ฐ ์กฐ๊ธ ๋ ๋์ ๊ฒ์ ์ ์ ์๋ค.
๋ณ์์ค์๋
feature_imp = rf.feature_importances_
imp_df = pd.DataFrame({'var':input_var,
'imp':feature_imp})
imp_df.sort_values(['imp'],ascending=False)

feature_importances_ ๋ฅผ ์ฌ์ฉํ์ฌ ๋ณ์์ค์๋๋ฅผ ์์๋ณผ ์ ์๋ค. ๋ด๋ฆผ์ฐจ์์ผ๋ก ์ ๋ ฌ์ ํด ๋ณด์๋๋ duration์ด ๊ฐ์ฅ ๋๊ณ , default_yes ์ปฌ๋ผ์ด ๊ฐ์ฅ ๋ฎ์ ๊ฒ์ ๋ณผ ์ ์๋ค. (๋ณ์์ค์๋์ ๋ํ ๊ฐ๋ ์ ๋ค๋ค์์๊ฐ์ ์์ธํ ์์๋ณธ๋ค.)
'๋ฐ์ดํฐ ๋ถ์ ์ด๋ก > ๋จธ์ ๋ฌ๋' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [๋จธ์ ๋ฌ๋] ๋ณ์์ค์๋, shap value (0) | 2021.08.27 |
|---|---|
| [Bank Marketing๋ฐ์ดํฐ ๋ถ์] 2. python ๋ถ์คํ Boosting, XGBoost ์ฌ์ฉ (0) | 2021.08.23 |
| [IRIS ๋ฐ์ดํฐ ๋ถ์] 2. Python Decision Tree ( ์์ฌ ๊ฒฐ์ ๋๋ฌด ) (0) | 2021.08.20 |
| [IRIS ๋ฐ์ดํฐ ๋ถ์] 1. Python KNN ๋ถ๋ฅ (0) | 2021.08.20 |
| [boston ๋ฐ์ดํฐ ๋ถ์] 2. PCA, ๊ตฐ์งํ๋ฅผ ์ฌ์ฉํ ์ง๊ฐ ๋ถ์ (0) | 2021.08.19 |