Ming's blog

kaggle) Titanic data 분석하기 2. 모델링(xgboost, RandomForest) 본문

데이터 분석

kaggle) Titanic data 분석하기 2. 모델링(xgboost, RandomForest)

H._.ming 2020. 4. 26. 22:29
반응형

1. Modeling

앞에서 처리한 데이터를 이용하여 분석을 해보고자 합니다.

여러가지 모델 중 xgboost 와 randomforest를 이용한 분석을 하려고 합니다.

1.1. xgboost

train 데이터를 train_test_split 함수로 7:3으로 나누어 CV방법을 이용하여 모델을 생성하고자 합니다.

우리가 예측하고자 하는 타켓변수는 0 또는 1의 값을 가지므로 XGBClassifier 모델을 이용하려 합니다.

 

import xgboost as xgb
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report, accuracy_score
#train 변수 나누기
X, y = dfm_train.drop(columns = ['Survived','PassengerId']) , dfm_train['Survived']
X_train, X_test, y_train, y_test= train_test_split(X, y,test_size=0.3, random_state=123)
xg_cl = xgb.XGBClassifier(objective='binary:logistic',n_estimators=20, seed=123)
xg_cl.fit(X_train, y_train)
#예측하기
preds = xg_cl.predict(X_test)
#정확도
accuracy = float(np.sum(preds==y_test))/y_test.shape[0]
print("accuracy: %f" % (accuracy))

accuracy: 0.820896

 

우선, 튜닝없이 임의의 하이퍼파라미터를 넣고 모델링은 한 결과 위와같이 82%의 정확도를 가지는 것을 알 수 있습니다.

이 모델을 이용하여 train data의 타겟변수를 예측하였습니다.

 

y_pred =  xg_cl.predict(dfm_test.drop(columns='PassengerId')).astype('int')
results = pd.DataFrame(data={'PassengerId':dfm_test['PassengerId'].astype('int'), 'Survived':y_pred})
print(results)
results.to_csv('Prediction_XGB.csv', index=False)

 

이번에는 tuning을 이용하여 xgboost 모델을 생성하고자 합니다.

import xgboost as xgb
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.model_selection import RandomizedSearchCV, GridSearchCV
from sklearn.model_selection import StratifiedKFold
X, y = dfm_train.drop(columns = ['Survived','PassengerId']) , dfm_train['Survived']
X_train, X_test, y_train, y_test= train_test_split(X, y,test_size=0.2, random_state=123)

# A parameter grid for XGBoost
params = {
        'min_child_weight': [1, 3,5,7 , 10],
        'gamma': [0.5, 1, 1.5, 2,3,4, 5],
        'subsample': [0.6,0.7, 0.8,0.9, 1.0],
        'colsample_bytree': [0.6,0.7, 0.8,0.9, 1.0],
        'max_depth': [3, 4, 5 , 6]
        }

xgb = xgb.XGBClassifier(learning_rate=0.02, n_estimators=600, objective='binary:logistic', silent=True, nthread=1)

folds = 3
param_comb = 5

skf = StratifiedKFold(n_splits=folds, shuffle = True, random_state = 1001)

random_search = RandomizedSearchCV(xgb, param_distributions=params, n_iter=param_comb, scoring='roc_auc', n_jobs=4, cv=skf.split(X_train,y_train), verbose=3, random_state=1001 )

random_search.fit(X_train, y_train)

 

StratifiedKFold를 이용하고 RandomizedSearchCV를 이용하여 최적의 하이퍼파라미터를 찾아 모델링을 진행하였습니다.

 

random_search.best_params_

 

최적 파라미터는 위와 같습니다. 

이 파라미터를 이용하여 train데이터의 예측력을 확인해보면 아래와 같이 87%로 더 높아진 것을 확인할 수 있습니다.

 

#예측하기
preds = random_search.predict(X_test)
#정확도
accuracy = float(np.sum(preds==y_test))/y_test.shape[0]
print("accuracy: %f" % (accuracy))

 

accuracy: 0.877095

y_test = random_search.predict(dfm_test.drop(columns='PassengerId')).astype('int')
results = pd.DataFrame(data={'PassengerId':dfm_test['PassengerId'].astype('int'), 'Survived':y_test})
results.to_csv('Prediction_XGB_hp.csv', index=False)

1.2. RandomForest

다음으로 RandomForest 함수를 이용하여 예측하겠습니다.

RandomForestClassifier 함수를 이용하여 타겟변수를 예측하였습니다.

from sklearn.ensemble import RandomForestClassifier
param={'n_estimators':[100,200,300],
       'max_depth':[6,8,10,12],
       'min_samples_leaf':[3,5,7,10,15],
       'min_samples_split':[2,3,5,10]
    
}
rf = RandomForestClassifier(n_estimators=100,
                              n_jobs=-1,
                              random_state=0,warm_start=True)
random_search = RandomizedSearchCV(rf, param_distributions=param, scoring='accuracy', cv=skf.split(X_train,y_train))
random_search.fit(X_train, y_train)

튜닝된 최적화 하이퍼파라미터는 아래와 같습니다.

random_search.best_params_

이 모델을 이용하여 train 데이터를 예측한 결과는 아래와 같습니다.

#예측하기
preds = random_search.predict(X_test)
#정확도
accuracy = float(np.sum(preds==y_test))/y_test.shape[0]
print("accuracy: %f" % (accuracy))

accuracy: 0.849162

y_test = random_search.predict(dfm_test.drop(columns='PassengerId')).astype('int')
results = pd.DataFrame(data={'PassengerId':dfm_test['PassengerId'].astype('int'), 'Survived':y_test})
results.to_csv('Prediction_rf_hp.csv', index=False)

xgboost를 이용하였을 때, 더 높은 예측력을 보이는 것을 알 수 있습니다.

반응형
Comments