Eggs Sunny Side Up
본문 바로가기
Computer Engineering/머신러닝

Ensemble 유방암 데이터 분류 실습

by guswn100059 2023. 6. 15.
### 유방암 데이터를 활용하여 Ensemble 모델을 학습해보자
- wisconsin의 유방암 데이터 셋
- 총 569건의 데이터
- 구성 : 악성(212), 양성(357)

# 데이터 셋 불러오기
from sklearn.datasets import load_breast_cancer

cancer_data = load_breast_cancer()
cancer_data

# 데이터 형태 : 전체적인 형태 - 딕셔너리 구조, bunch 객체

# 딕셔너리 구조에서 데이터 확인하기
# 키값들을 확인하기
cancer_data.keys()

# 분류에 사용할 특성 확인 : 
# => 학습에 사용할 데이터의 이름과 개수 확인하기
cancer_data.feature_names

len(cancer_data.feature_names)

# 각 특성들의 자료형 확인하기
type(cancer_data.data)

# 유방암 데이터셋의 크기 확인
cancer_data.data.shape

cancer_data.target_names

# 양성과 악성의 데이터 수 확인
# 정답 레이블(클래스)와 이름 - cancer_data.target_names => 양성 or 악성
# 양성/악성의 수 : 
# 동일한 개수로 이루어진 2개 이상의 데이터를 연결하는 함수 : zip()
# zip() ==> 양성 : 00명, 악성 : 00명
import numpy as np

for i, j in zip(cancer_data.target_names, np.bincount(cancer_data.target)):
    print({i:j})

#### 훈련데이터와 테스트 데이터로 분리

from sklearn.model_selection import train_test_split

# 7 : 3
X_train, X_test, y_train, y_test = train_test_split(cancer_data.data, 
                                                   cancer_data.target,
                                                   test_size=0.3,
                                                   random_state=60)

X_train.shape, X_test.shape

### RandomForest 모델 적용하기
- n_estimators : 몇 개의 트리를 만들지 선택
- 단일 결정 트리에서처럼 max_depth 등 매개변수를 조정하여 사전 가지치기도 할 수 있음.

# 필요한 라이브러리 불러오기
from sklearn.ensemble import RandomForestClassifier

# 랜덤포레스트 모델 생성
# 하이퍼 파라미터 설정 (100개의 결정트리로 구성)
forest_model = RandomForestClassifier(n_estimators=100, random_state=10)

# 학습
forest_model.fit(X_train, y_train)

# 교차검증으로 평가
from sklearn.model_selection import cross_val_score
cross_val_score(forest_model, X_train, y_train, cv=5).mean()

# 학습 및 테스트 데이터를 이용하여 예측값 만들고 확인하기
train_pre = forest_model.predict(X_train)
test_pre = forest_model.predict(X_test)

print(f"학습 데이터를 이용한 예측 결과 : {train_pre}")
print(f"테스트 데이터를 이용한 예측 결과 : {test_pre}")

# 학습 및 테스트 데이터에 대한 분류 모델의 성능(평균 정확도) 확인
from sklearn.metrics import accuracy_score

print("학습 데이터 정확도 : {:.3f}".format(accuracy_score(y_train, train_pre)))
print("학습 데이터 정확도 : {:.3f}".format(accuracy_score(y_test, test_pre)))

#### GridSearchCV를 적용하여 모델의 성능 향상시키기

from sklearn.model_selection import GridSearchCV

# 튜닝할 하이퍼 파라미터 설정
# max_depth, max_leaf_nodes, min_samples_split, n_estimators
param = {
    'n_estimators' : [50, 70, 100],
    'max_depth' : [3, 5, 7], 
    'max_leaf_nodes' : [2, 4, 6], 
    'min_samples_split' : [3, 5, 7]
}

forest_model = RandomForestClassifier(random_state=10, n_jobs=-1)
# n_jobs = -1 : 가지고 있는 내 시스템의 메모리를 모두 사용하겠다.

# GridSearchCV 모델 객체 생성
grid_model = GridSearchCV(forest_model, param, 
                          cv=5, scoring='accuracy',
                          n_jobs=-1)

# 학습
grid_model.fit(X_train, y_train)

# 최적의 하이퍼 파라미터 조합 확인
grid_model.best_params_

grid_model.best_score_

#### 영향력 높은 특성을 확인 및 모델 완성

import pandas as pd
import matplotlib.pyplot as plt

# 랜덤포레스트 모델 완성하기
best_model = RandomForestClassifier(n_estimators=50, 
                                    max_depth=3, 
                                    max_leaf_nodes=6, 
                                    min_samples_split=5,
                                    random_state=10)

# 학습
best_model.fit(X_train, y_train)

# feature_importances_ 를 이용하여 영향력이 높은 모델의 특성 추출하기
feature = best_model.feature_importances_
feature

# 영향력이 높은 모델의 특성을 이용해서 데이터 프레임 생성하기
df = pd.DataFrame(feature, index=cancer_data.feature_names, columns=['importances'])
df.sort_values(by='importances', ascending=False)

df.plot.barh()

### AdaBoost(Adaptive Boosting) 모델 적용하기
- 각각의 트리들이 독립적으로 존재하지 않음
- 이전의 모델이 잘못 분류한 샘플에 가중치를 높여서 다음 모델을 훈련시키는 방식
- 사용할 트리의 갯수
- 학습률(learning_rate) : 가중치 갱신의 변동폭을 조정, 0 ~ 1값, 기본값 : 1.0
- 사전 가지치기를 사용할 수 없음.

# 라이브러리 가져오기
from sklearn.ensemble import AdaBoostClassifier

# AdaBoost 모델 생성, 하이퍼 파라미터 설정
ada_model = AdaBoostClassifier(n_estimators=5, learning_rate=0.1, random_state=40)

# 학습
ada_model.fit(X_train, y_train)

# 학습 및 테스트 데이터를 이용하여 예측값 만들고 확인하기
train_pre = ada_model.predict(X_train)
test_pre = ada_model.predict(X_test)

print(f"학습 데이터를 이용한 예측 결과 : {train_pre}")
print(f"테스트 데이터를 이용한 예측 결과 : {test_pre}")

# 학습 및 테스트 데이터에 대한 분류 모델의 성능(평균 정확도) 확인
print("학습 데이터 정확도 : {:.3f}".format(accuracy_score(y_train, train_pre)))
print("학습 데이터 정확도 : {:.3f}".format(accuracy_score(y_test, test_pre)))

# 하이퍼 파라미터 n-estimators = 100 증가시킨 후 학습 진행
ada_model2 = AdaBoostClassifier(n_estimators=100, random_state=40)

# 학습
ada_model2.fit(X_train, y_train)

# 학습 및 테스트 데이터를 이용하여 예측값 만들고 확인하기
train_pre = ada_model2.predict(X_train)
test_pre = ada_model2.predict(X_test)

print(f"학습 데이터를 이용한 예측 결과 : {train_pre}")
print(f"테스트 데이터를 이용한 예측 결과 : {test_pre}")

# 학습 및 테스트 데이터에 대한 분류 모델의 성능(평균 정확도) 확인
print("학습 데이터 정확도 : {:.3f}".format(accuracy_score(y_train, train_pre)))
print("학습 데이터 정확도 : {:.3f}".format(accuracy_score(y_test, test_pre)))

#### GridSearchCV를 적용하여 모델의 성능 향상 시키기

# 튜닝할 하이퍼 파라미터 설정
# max_depth, max_leaf_nodes, min_samples_split, n_estimators
param = {
    'n_estimators' : [50, 100, 200],
    'learning_rate' : [0.4, 0.6, 1.0]
}

ada_model = AdaBoostClassifier(random_state=0)
# n_jobs = -1 : 가지고 있는 내 시스템의 메모리를 모두 사용하겠다.

# GridSearchCV 모델 객체 생성
grid_model = GridSearchCV(ada_model, param, 
                          cv=5, scoring='accuracy')

# 학습
grid_model.fit(X_train, y_train)

# 최적의 하이퍼 파라미터 조합 찾기
print(grid_model.best_params_)
print(grid_model.best_score_)

#### 영향력 높은 특성을 확인 및 모델 완성

# 랜덤포레스트 모델 완성하기
best_model = AdaBoostClassifier(n_estimators=200, 
                                learning_rate=1.0,
                                random_state=0)

# 학습
best_model.fit(X_train, y_train)

# feature_importances_ 를 이용하여 영향력이 높은 모델의 특성 추출하기
feature = best_model.feature_importances_
feature

# 영향력이 높은 모델의 특성을 이용해서 데이터 프레임 생성하기
df = pd.DataFrame(feature, index=cancer_data.feature_names, columns=['importances'])
value = df.sort_values(by='importances', ascending=False)
print(value)
df.plot.barh()

### GBM(Gradient Boosting Machine) 모델 적용하기
- 여러 개의 결정트리를 묶어서 강력한 모델을 만드는 앙상블 방법
- 강력한 사전 가지치기 적용
- 예측 성능은 높지만, 과대적합이 빠르게 되고, 시간이 오래 걸린다는 단점
- 과대적합을 제어하기 위해 max_depth = 5 이하로 설정 --> 트리의 깊이가 깊어지지 않게 제어

from sklearn.ensemble import GradientBoostingClassifier

# AdaBoost 모델 생성, 하이퍼 파라미터 설정
gbm_model = GradientBoostingClassifier(n_estimators=5, learning_rate=0.1, random_state=0)

# 학습
gbm_model.fit(X_train, y_train)

# 학습 및 테스트 데이터를 이용하여 예측값 만들고 확인하기
train_pre = gbm_model.predict(X_train)
test_pre = gbm_model.predict(X_test)

print(f"학습 데이터를 이용한 예측 결과 : {train_pre}")
print(f"테스트 데이터를 이용한 예측 결과 : {test_pre}")

# 학습 및 테스트 데이터에 대한 분류 모델의 성능(평균 정확도) 확인
print("학습 데이터 정확도 : {:.3f}".format(accuracy_score(y_train, train_pre)))
print("학습 데이터 정확도 : {:.3f}".format(accuracy_score(y_test, test_pre)))

#### GridSearchCV를 적용하여 모델의 성능 향상 시키기

# 튜닝할 하이퍼 파라미터 설정
# max_depth, max_leaf_nodes, min_samples_split, n_estimators
param = {
    'n_estimators' : [50, 100, 200],
    'max_depth' : [1, 2, 3, 4],
    'learning_rate' : [0.1, 0.2, 0.4]
}

gbm_model = GradientBoostingClassifier(random_state=0)
# n_jobs = -1 : 가지고 있는 내 시스템의 메모리를 모두 사용하겠다.

# GridSearchCV 모델 객체 생성
grid_model = GridSearchCV(gbm_model, param, 
                          cv=5, scoring='accuracy')

# 학습
grid_model.fit(X_train, y_train)

# 최적의 하이퍼 파라미터 조합 찾기
print(grid_model.best_params_)
print(grid_model.best_score_)

#### 영향력 높은 특성을 확인 및 모델 완성

# 랜덤포레스트 모델 완성하기
best_model = GradientBoostingClassifier(n_estimators=200, 
                                max_depth=2,
                                learning_rate=0.1,
                                random_state=0)

# 학습
best_model.fit(X_train, y_train)

# feature_importances_ 를 이용하여 영향력이 높은 모델의 특성 추출하기
feature = best_model.feature_importances_
feature

# 영향력이 높은 모델의 특성을 이용해서 데이터 프레임 생성하기
df = pd.DataFrame(feature, index=cancer_data.feature_names, columns=['importances'])
value = df.sort_values(by='importances', ascending=False)
print(value)
df.plot.barh()

best_model.score(X_test,y_test)

### XGBoost 모델 적용하기
- 분류에 있어서 일반적으로 다른 머신러닝보다 뛰어난 성능을 나타냄
- GBM 기반이지만 Early Stopping 기능과 과대적합을 제어하기 위한 규제를 포함
- GBM의 단점인 느린 학습시간과 과대적합 문제를 해결
- 대규모 머신러닝 문제에서 GBM을 적용하려면 XGBoost를 사용

# sklearn에서 제공되지 않는 클래스로 설치 필요
!pip install xgboost

import xgboost 
from xgboost import XGBClassifier

# XGBoost 모델 생성, 하이퍼 파라미터 설정은 X
xgb_model = XGBClassifier()

# 학습
xgb_model.fit(X_train, y_train)

# 학습 및 테스트 데이터를 이용하여 예측값 만들고 확인하기
train_pre = xgb_model.predict(X_train)
test_pre = xgb_model.predict(X_test)

print(f"학습 데이터를 이용한 예측 결과 : {train_pre}")
print(f"테스트 데이터를 이용한 예측 결과 : {test_pre}")

# 학습 및 테스트 데이터에 대한 분류 모델의 성능(평균 정확도) 확인
print("학습 데이터 정확도 : {:.3f}".format(accuracy_score(y_train, train_pre)))
print("학습 데이터 정확도 : {:.3f}".format(accuracy_score(y_test, test_pre)))

#### GridSearchCV를 적용하여 모델의 성능 향상 시키기

# 튜닝할 하이퍼 파라미터 설정
# max_depth, max_leaf_nodes, min_samples_split, n_estimators
param = {
    'n_estimators' : [50, 100, 200],
    'max_depth' : [1, 2, 3, 4],
    'learning_rate' : [0.1, 0.2, 0.4]
}

xgb_model = XGBClassifier(random_state=0)
# n_jobs = -1 : 가지고 있는 내 시스템의 메모리를 모두 사용하겠다.

# GridSearchCV 모델 객체 생성
grid_model = GridSearchCV(xgb_model, param, 
                          cv=5, scoring='accuracy')

# 학습
grid_model.fit(X_train, y_train)

# 최적의 하이퍼 파라미터 조합 찾기
print(grid_model.best_params_)
print(grid_model.best_score_)

#### 영향력 높은 특성을 확인 및 모델 완성

# 랜덤포레스트 모델 완성하기
best_model = XGBClassifier(n_estimators=50, 
                                max_depth=4,
                                learning_rate=0.2,
                                random_state=0)

# 학습
best_model.fit(X_train, y_train)

# feature_importances_ 를 이용하여 영향력이 높은 모델의 특성 추출하기
feature = best_model.feature_importances_
feature

# 영향력이 높은 모델의 특성을 이용해서 데이터 프레임 생성하기
df = pd.DataFrame(feature, index=cancer_data.feature_names, columns=['importances'])
value = df.sort_values(by='importances', ascending=False)
print(value)
df.plot.barh()

best_model.score(X_test,y_test)

### LGBM(Light GBM)

# sklearn에서 제공하지 않으므로 설치 필요
!pip install lightgbm

import lightgbm
from lightgbm import LGBMClassifier

# XGBoost 모델 생성, 하이퍼 파라미터 설정은 X
lgbm_model = LGBMClassifier(max_depth=-1,
                            learning_rate=0.1,
                            n_estimators=100)

# 학습
lgbm_model.fit(X_train, y_train)

# 학습 및 테스트 데이터를 이용하여 예측값 만들고 확인하기
train_pre = lgbm_model.predict(X_train)
test_pre = lgbm_model.predict(X_test)

print(f"학습 데이터를 이용한 예측 결과 : {train_pre}")
print(f"테스트 데이터를 이용한 예측 결과 : {test_pre}")

# 학습 및 테스트 데이터에 대한 분류 모델의 성능(평균 정확도) 확인
print("학습 데이터 정확도 : {:.3f}".format(accuracy_score(y_train, train_pre)))
print("학습 데이터 정확도 : {:.3f}".format(accuracy_score(y_test, test_pre)))

#### GridSearchCV를 적용하여 모델의 성능 향상 시키기

# 튜닝할 하이퍼 파라미터 설정
# max_depth, max_leaf_nodes, min_samples_split, n_estimators
param = {
    'n_estimators' : [50, 100, 200],
    'max_depth' : [1, 2, 3, 4],
    'learning_rate' : [0.1, 0.2, 0.4]
}

lgbm_model = LGBMClassifier(random_state=0)
# n_jobs = -1 : 가지고 있는 내 시스템의 메모리를 모두 사용하겠다.

# GridSearchCV 모델 객체 생성
grid_model = GridSearchCV(lgbm_model, param, 
                          cv=5, scoring='accuracy')

# 학습
grid_model.fit(X_train, y_train)

# 최적의 하이퍼 파라미터 조합 찾기
print(grid_model.best_params_)
print(grid_model.best_score_)

#### 영향력 높은 특성을 확인 및 모델 완성

# 랜덤포레스트 모델 완성하기
best_model = GradientBoostingClassifier(n_estimators=200, 
                                max_depth=4,
                                learning_rate=0.2,
                                random_state=0)

# 학습
best_model.fit(X_train, y_train)

# feature_importances_ 를 이용하여 영향력이 높은 모델의 특성 추출하기
feature = best_model.feature_importances_
feature

# 영향력이 높은 모델의 특성을 이용해서 데이터 프레임 생성하기
df = pd.DataFrame(feature, index=cancer_data.feature_names, columns=['importances'])
value = df.sort_values(by='importances', ascending=False)
print(value)
df.plot.barh()

best_model.score(X_test,y_test)

댓글