데이터 정의
[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)
'python > 실습(project)' 카테고리의 다른 글
[Python/딥러닝/실습] Keras를 이용한 다중 분류 분석(인공신경망) (0) | 2023.01.12 |
---|---|
[Python/딥러닝/실습] 로지스틱 회귀 분석 (0) | 2023.01.12 |
[Python/딥러닝/실습] 단순 선형회귀 분석 (0) | 2023.01.05 |
[Python/실습] 의사결정나무를 이용한 BostonHousing 예측분석 (0) | 2023.01.03 |
[Python/실습] 랜덤포레스트 모델을 이용한 위스콘신 유방암 데이터 분류분석 (0) | 2023.01.02 |
댓글