본문 바로가기

머신러닝/분석 base

Bagging & Random Forest : Programming

1. import packages

import os
from os.path import join
import copy
import warnings
warnings.filterwarnings('ignore')

import numpy as np
import pandas as pd

import sklearn

import matplotlib.pyplot as plt

adult_path = join( 'adult_data.csv')
column_path = join( 'adult_names.txt')
adult_columns = list()
for l in open(column_path):
    adult_columns = l.split() #adult_columns에 변수명을 리스트로 저장

 

2. 데이터 불러오기

data = pd.read_csv(adult_path, names = adult_columns)
label = data['income']
del data['income']
data.head()

 

 

 

 

label

0 <=50K

1 <=50K

2 <=50K

3 <=50K

4 <=50K

5 <=50K

6 <=50K

7 >50K

...

 

data.shape() #(48842, 14)
data.info()

 

 

3. Preprocessing

data = pd.get_dummies(data)
data.head()
data.shape() # (48842, 108)

Pandas의 get_dummies 함수를 사용해 범주형 변수를 One-Hot Encoding한다.

수치형 변수는 그대로 두고 범주형 자료는 모든 값이 0또는 1로 될 수 있도록 변수 개수를 늘린다. (14열에서 108개 열으로 늘어남)

 

 

label = label.map(lambda x : 0 if x =='>50K' else 1)

label label 데이터에서 값이 '>50K'이면 0으로, 값이 '<=50K'이면 1로 값을 바꿈

 

4. Cross Validation

from sklearn.model_selection import train_test_split

# train test split
X_train, X_test, y_train,y_test=train_test_split(data,label,test_size=0.2,random_state=785)

# train validation split
X_train,X_valid,y_train,y_valid=train_test_split(X_train,y_train,test_size=0.2,random_state=785)

random_state: split 하기 전에 데이터를 shuffling 할 것인지. int를 할당하면 int가 random seed가 된다.

 

from sklearn.ensemble import RandomForestClassifier
rf=RandomForestClassifier(random_state=785)

rf.fit(X_train, y_train)

sklearn의 ensemble 패키지에서 RandomForestClassifer을 불러오고 train set에 모델을 학습한다.

 

# Valid 데이터로 검증
from sklearn.metrics import accuracy_score

y_pred = rf.predict(X_valid)
accuracy = accuracy_score(y_valid, y_pred)

print("random forest validation set accuracy : {:.2f}%".format(accuracy_score(y_valid,y_pred)*100))

# Test 데이터로 모델 평가
y_pred_test = rf.predict(X_test)
accuracy_test = accuracy_score(y_test, y_pred_test)

print("random forest test set accuracy : {:.2f}%".format(accuracy_score(y_test, y_pred_test)*100))

random forest validation set accuracy: 84.29%

random forest test set accuracy: 84.70%

아직 validation set에서 검증을 통해 train set을 변형시킨 게 아니므로 validation set과 test set의 accuracy가 거의 동일하게 나온다.

 

5. Parameter Tuning

from sklearn.model_selection import GridSearchCV


params = {
    'n_estimators':[100], 
    'max_depth' : [6, 8, 10, 12], 
    'min_samples_leaf' : [8, 12, 18 ],
    'min_samples_split' : [8, 16, 20]
}


# RandomForestClassifier 객체 생성 후 GridSearchCV 수행
rf_clf = RandomForestClassifier(random_state = 0, n_jobs = -1)
grid_cv=GridSearchCV(rf_clf, param_grid = params, cv = 3, n_jobs = -1)
grid_cv.fit(X_train, y_train)

print('최적 하이퍼 파라미터:\n', grid_cv.best_params_)
print('최고 예측 정확도: {0:.4f}'.format(grid_cv.best_score_))

random forest의 hyperparameter

  • n_estimators : 생성할 tree의 개수 (이만큼의 tree를 평균내어 성능 평가)
  • max_depth : tree의 최대 깊이 (한 가지에서 몇개까지 노드가 뻗어 나갈 지)
  • min_samples_leaf : node를 분할 후에 분할된 node 안에 최소한 sample data가 몇개는 있어야 하는지
  • min_samples_split : node를 분할 하기 전에 최소한 데이터가 몇 개는 있어야 분할을 하는 지

최적 하이퍼 파라미터: {'max_depth': 12, 'min_samples_leaf': 8, 'min_samples_split': 8, 'n_estimators': 100}

최고 예측 정확도: 0.8565

 

from sklearn.model_selection import cross_val_score

# 위에서 나온 최적 하이퍼 파라미터로 모델을 학습시킴
rf_clf1 = RandomForestClassifier(n_estimators = 100, 
                                max_depth = 12,
                                min_samples_leaf = 8,
                                min_samples_split = 8,
                                random_state = 0,
                                n_jobs = -1)
rf_clf1.fit(X_train, y_train)
pred=rf_clf1.predict(X_test)
print('예측 정확도: {0:.4f}'.format(accuracy_score(y_test , pred)))

예측 정확도: 0.8629

 

6. feature importance

import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline

ftr_importances_values = rf_clf1.feature_importances_
ftr_importances = pd.Series(ftr_importances_values, index = X_train.columns)
ftr_top20 = ftr_importances.sort_values(ascending=False)[:20] 

plt.figure(figsize=(8,6))
plt.title('Top 20 Feature Importances')
sns.barplot(x=ftr_top20, y=ftr_top20.index) 
plt.show()

.feature_importances_: 각 변수의 중요도가 저장되어 있음

ftr_importances: 각 변수명과 feature importance 수치가 매칭됨

 

 

7. Voting

from sklearn.ensemble import VotingClassifier

from sklearn.ensemble import RandomForestClassifier, AdaBoostClassifier, ExtraTreesClassifier

from sklearn.svm import SVC
from sklearn.model_selection import cross_validate

models=[('rfc',RandomForestClassifier()),
        ('ada',AdaBoostClassifier()),
        ('etc',ExtraTreesClassifier())]

RandomForestClassifier, AdaBoostClassifer, ExtraTreesClassifier 총 세개의 모델로 voting을 해줄 것이다.

-1) soft vote

soft_vote=VotingClassifier(models, voting='soft')

soft_vote.fit(X_train,y_train)
soft_vote_pred=soft_vote.predict(X_test)
print("soft vote accuracy:",accuracy_score(soft_vote_pred,y_test))

위에서 세개의 모델을 합쳐서 만든 models로 VotingClassifier에 soft voting을 위해 넣어준다.

train set을 soft vote를 위한 model에 학습시키고 이 model에 test set에 대해 predict 한다.

soft vote accuracy: 0.8497287337496161

 

-2) hard vote

hard_vote=VotingClassifier(models, voting='hard')

hard_vote.fit(X_train,y_train)
hard_vote_pred=hard_vote.predict(X_test)
print("hard vote accuracy ",accuracy_score(hard_vote_pred,y_test))

위에서 세개의 모델을 합쳐서 만든 models로 VotingClassifier에 hard voting을 위해 넣어준다.

train set을 hard vote를 위한 model에 학습시키고 이 model에 test set에 대해 predict 한다.

hard vote accurcy: 0.8567918927218753

 

 

'머신러닝 > 분석 base' 카테고리의 다른 글

Resnet  (0) 2021.02.23
Boosting & Adaboost  (0) 2021.02.09
Bagging & Random Forest  (0) 2021.02.09
SVM: programming  (0) 2021.02.08
SVM (Support Vector Machine)  (0) 2021.02.08