python/실습(project)

[python/실습] xgboost를 이용한 위스콘신 유방암 데이터 분류분석

연정양 2022. 12. 20.

데이터 정의

 

[R/실습] xgboost 모델을 이용한 위스콘신 유방암 데이터 분류분석

데이터 정의 - 사용 데이터 : wisc_bc_data.csv 컬럼명 의미 id 환자 식별 번호 diagnosis 양성 여부 (M = 악성, B = 양성) 각 세포에 대한 정보 radius 반경 (중심에서 외벽까지 거리들의 평균값) texture 질감 (Gr

robinlovesyeon.tistory.com

위 게시물 참고

 

xgboost 모델 생성

1) Import packages

import pandas as pd
import numpy as np
from  sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt

import xgboost as xgb
from xgboost import plot_importance
from xgboost import plot_importance

2) 데이터 전처리

df= pd.read_csv('wisc_bc_data.csv')
df.head()

df = df.drop('id', axis=1)
df.head()
df['diagnosis'] = df['diagnosis'].apply(lambda x : 1 if x== "M" else 0)

x_train, x_test, y_train, y_test = train_test_split(df.iloc[:,1:], df['diagnosis'],test_size=0.3,random_state=11)

 데이터를 불러와 불필요한 ‘id’컬럼을 삭제한 후 Benign(양성)이면 0, Malignancy(악성)이면 1로 변환하였다. 이후 독립변수는 x_train, x_test에 종속 변수는 y_train, y_test에 각각 데이터 셋을 생성하였다.

 

3) model 생성

dtrain = xgb.DMatrix(data=x_train, label=y_train)
dtest = xgb.DMatrix(data=x_test, label=y_test)
params = {'max_depth' : 2,'eta' : 1,  'objective' : 'multi:softmax', 'num_class' :2, 'eval_metric' : 'merror', 'early_stoppings' : 100}

xgb_model = xgb.train(params = params, dtrain = dtrain, num_boost_round = 400, early_stopping_rounds = 100, evals=[(dtrain,'train'),(dtest,'dtest')])

 트리의 최대 깊이인 max.depth 2, 과적합을 방지하기 위해 업데이트에 사용되는 eta 단계 크기 축소는 1 train parameter objective softmax로 지정했다. softmax는 다중분류로 eval_metric에서 다중분류의 error rate를 나태내는 merror로 설정했다. 과적합을 방지하기 위해 early_stoppings 100으로 설정했다.

 

결과:

Will train until dtest-merror hasn't improved in 100 rounds
1 train-merror:0.030151 dtest-merror:0.064327
2 train-merror:0.025126 dtest-merror:0.05848
3 train-merror:0.015075 dtest-merror:0.05848
4 train-merror:0.01005 dtest-merror:0.046784
5 train-merror:0.007538 dtest-merror:0.05848
6 train-merror:0.002513 dtest-merror:0.046784
7 train-merror:0.002513 dtest-merror:0.046784
8 train-merror:0 dtest-merror:0.046784
9 train-merror:0   dtest-merror:0.052632
10 train-merror:0   dtest-merror:0.040936
11 train-merror:0   dtest-merror:0.035088
12 train-merror:0   dtest-merror:0.035088
13 train-merror:0   dtest-merror:0.035088
14 train-merror:0   dtest-merror:0.040936
15 train-merror:0 dtest-merror:0.040936
Stopping. Best iteration:
11 train-merror:0   dtest-merror:0.035088

-> 11번째가 최적의 모델로 선택됐다.

 

4) 분류모델 평가

y_pred_probs = xgb_model.predict(dtest)

print(confusion_matrix(y_test, y_preds))
print(classification_report(y_test, y_preds))
Confusion_matrix
100 3
5 63
Classification_report
  precision recall f1-score support
0 0.95 0.97 0.96 103
1 0.95 0.93 0.94 68
accuracy     0.95 171
macro avg  0.95 0.95 0.95 171
weighted avg 0.95 0.95 0.95 171

95%정도의 정확도를 보여주고 있다. 

 

5) 중요 변수 시각화

fig, ax = plt.subplots(figsize=(10, 12))
plot_importance(xgb_model, ax=ax)

중요 변수 시각화 결과

  texture_worst 가장 중요한 변수이고 area_se, area_worst, points_worst 그다음 중요변수 point_se, symmetry_worst, points_mean 뒤를 잇고 있다.

 

소스 코드

#데이터 불러오기
df= pd.read_csv('wisc_bc_data.csv')
df.head()
#데이터 전처리
df = df.drop('id', axis=1)
df.head()
df['diagnosis'] = df['diagnosis'].apply(lambda x : 1 if x== "M" else 0)

x_train, x_test, y_train, y_test = train_test_split(df.iloc[:,1:], df['diagnosis'],test_size=0.3,random_state=11)

dtrain = xgb.DMatrix(data=x_train, label=y_train)
dtest = xgb.DMatrix(data=x_test, label=y_test)
params = {'max_depth' : 2,'eta' : 1,  'objective' : 'multi:softmax', 'num_class' :2,
                               'eval_metric' : 'merror', 'early_stoppings' : 100}
xgb_model = xgb.train(params = params, dtrain = dtrain, num_boost_round = 400,
                      early_stopping_rounds = 100, evals=[(dtrain,'train'),(dtest,'dtest')])

# 예측하기, 확률값으로 반환됨
y_pred = xgb_model.predict(dtest)
#성능 평가
print(confusion_matrix(y_test, y_pred))
print(classification_report(y_test, y_pred))
#시각화
#%matplotlib inline

fig, ax = plt.subplots(figsize=(10, 12))
plot_importance(xgb_model, ax=ax)

 

댓글