본문 바로가기
  • 데이터에 가치를 더하다, 서영석입니다.
연구 활동/폐암 예측 프로젝트

[2022 동계 인턴십]암예측 4

by 꿀먹은데이터 2022. 2. 16.

이전에서 포스팅한 내용에서 중요도(feature_importance)를 0.5까지 잘라서 시행했다.

#폐암 
features=['LUNG','STOMA','COLON','LIVER','LUNG','PROST','THROI','BREAC','RECTM']
y_df =df['LUNG']
#X_df =df.drop(features, axis=1)
X_df =df[['AGE_B','GOT_B','SBP_B','LDL_B','HDL_B','DBP_B','CHO_B','WT_B','FBS_B','GPT_B']]
X_train, X_test, y_train, y_test = train_test_split(X_df, y_df, test_size=0.2, random_state=156)
print(X_train.shape, X_test.shape)
DMatrix : 넘파이 입력 파라미터를 받아서 만들어지는 XGBoost만의 전용 데이터 세트

주요 입력 파라미터는 data(피처 데이터 세트)와 label
(분류: 레이블 데이터 세트/회귀: 숫자형인 종속값 데이터 세트)
판다스의 DataFrame으로 데이터 인터페이스를 하기 위해서는 DataFrame.values를 이용해 넘파이로 일차변환 한 뒤에 DMatrix 변환을 적용
dtrain = xgb.DMatrix(data=X_train, label = y_train)
dtest = xgb.DMatrix(data=X_test, label=y_test)
params = {'max_depth' : 3,
         'eta' : 0.1, 
         'objective' : 'binary:logistic',
         'eval_metric' : 'logloss',
         'early_stoppings' : 100 }

num_rounds = 500
wlist = [(dtrain, 'train'), (dtest,'eval')]
# 하이퍼 파라미터와 early stopping 파라미터를 train() 함수의 파라미터로 전달
xgb_model = xgb.train(params = params, dtrain=dtrain, num_boost_round=num_rounds, evals=wlist)
pred_probs = xgb_model.predict(dtest)
print('predict() 수행 결과값을 10개만 표시, 예측 확률 값으로 표시됨')
print(np.round(pred_probs[:10], 3))

# 예측 확률이 0.5보다 크면 1, 그렇지 않으면 0으로 예측값 결정해 리스트 객체인 preds에 저장
preds = [ 1 if x > 0.5 else 0 for x in pred_probs]
print('예측값 10개만 표시: ', preds[:10])

혼동행렬, 정확도, 정밀도, 재현율, F1, AUC 불러오기
def get_clf_eval(y_test, y_pred):
    confusion = confusion_matrix(y_test, y_pred)
    accuracy = accuracy_score(y_test, y_pred)
    precision = precision_score(y_test, y_pred)
    recall = recall_score(y_test, y_pred)
    F1 = f1_score(y_test, y_pred)
    AUC = roc_auc_score(y_test, y_pred)
    print('오차행렬:\n', confusion)
    print('\n정확도: {:.4f}'.format(accuracy))
    print('정밀도: {:.4f}'.format(precision))
    print('재현율: {:.4f}'.format(recall))
    print('F1: {:.4f}'.format(F1))
    print('AUC: {:.4f}'.format(AUC))
get_clf_eval(y_test, preds)

하지만 위에 결과값과 보다시피 정밀도, 재현율, F1의 경우 0, AUC가 0.5가 나오는 터무니없는 결과값이 나왔다.

xgb_model = xgboost.XGBRegressor(n_estimators=100, learning_rate=0.08, gamma=0, subsample=0.75,
                           colsample_bytree=1, max_depth=7)
print(len(X_train), len(X_test))
xgb_model.fit(X_train,y_train)
xgboost.plot_importance(xgb_model)

위 그림과 같이 AGE_B가 가장 중요하고 GOT_B,SBP_B 순으로 XGBoost에서 중요함을 볼 수 있다.

 

하지만.. 잘못 시도한 코드인 것 같아 처음부터 다시 시작하기로 마음먹었다..