DeseoDeSeo
[Machine Learning] 하이퍼 파라미터 튜닝(유방암 분류 실습) 본문
1. 유방암 데이터를 활용하여 Ensembl 모델을 학습해보자.
- wisconsin의 유방암 데이터 셋을 활용
- 총 569건의 데이터(악성-212개, 양성 - 357개)
데이터 셋 불러오기
from sklearn.datasets import load_breast_cancer
cancer_data = load_breast_cancer()
cancer_data
➤ 데이터 형태 : 딕셔너리구조에 텍스트, 여러가지 형태를 담고 있음 ➜ bunch 형태
딕셔너리 구조에서 데이터 확인 : 키 값들을 확인
➤ keys()
cancer_data.keys()
print(cancer_data['DESCR'])
분류에 사용할 특성 확인 ➜ 학습에 사용할 데이터의 이름, 개수 확인
print(cancer_data.feature_names)
len(cancer_data.feature_names)
각 특성들의 자료형 확인
print('유방암 데이터의 자료형 ', type(cancer_data.data))
유방암 데이터 셋의 크기 확인
cancer_data.data.shape
○ 양성(357)과 악성(212) 데이터 수 확인
○ 정답 레이블(클래스)의 이름 ➜ cancer_data.target_names
○ 클래스별(범주별) 개수를 반환 ➜ bincount()
○ 동일한 개수로 이루어진 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})
2. 훈련 데이터와 테스트 데이터로 분리
- 7:3의 비율로 나눔.
- random_state = 10
from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(cancer_data.data,cancer_data.target , test_size =0.3, random_state =10)
x_train.shape
3. RandomForest모델 적용하기
- n_estimators: 몇개의 트리를 만들지 선택 ➜(100개)
- random_state=10
- max_features : 선택할 특징의 최대 수 (0.3 ~ 0.7) ~> (30% ~ 70%)
- max_features =0 ➜ 특성을 사용하지 않겠다.
- max_features =1 ➜ 전체 특성을 사용하겠다.
- 개별 트리가 적을 때, max_features의 값을 늘린다.
- 개별 트리가 많을 때 줄인다.
예측 결과 확인
print('학습 데이터를 이용한 예측 결과: \n', train_pred)
print('테스트 데이터를 이용한 예측 결과: \n', test_pred)
학습 및 테스트 데이터에 대한 분류모델의 성능(평균 정확도) 확인
{:.3f} 평균값을 소수 3번째자리까지만 출력.
from sklearn.metrics import accuracy_score
print('학습 데이터 정확도 결과 : {:.3f}'.format(accuracy_score(y_train, train_pred)))
print('테스트 데이터 정확도 결과 : {:.3f}'.format(accuracy_score(y_test, test_pred)))
GridSearchCV를 적용하여 모델의 성능 향상시키기
모델 완성 및 영향력이 높은 특성 확인
라이브러리 불러오기
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
랜덤포레스트 모델 완성하기
best_model = RandomForestClassifier(max_depth= 4, max_leaf_nodes= 5, min_samples_split= 10, n_estimators= 400, random_state=10)
학습
best_model.fit(x_train, y_train)
영향력 높은 특성 추출하기
➜ feature_importances_
features = best_model.feature_importances_
print('features \n', features)
AdaBoost 모델 적용하기
결정트리 기반의 모델이지만 각각의 트리들이 독립적으로 존재하지 않음,
- 사전 가지치기 파라미터들을 사용할 수 없음,
- 이전 모델이 잘못 분류한 생플에 대한 가중치를 높여서 다음 모델을 훈련시킴
- n_estimators: 사용할 결정트리의 개수
- larning_rate(학습률) : 가중치 갱신의 변동폭으로 조절, 0~1 사이의 값, 기본값 1
-값이 크면 ➜ 과대적합
-값이 작으면 ➜ 과소적합
✔ AdaBoost 불러오기
✔ 모델 생성 및 하이퍼퍼라미터 설정
✔ 학습
from sklearn.ensemble import AdaBoostClassifier
ada_model = AdaBoostClassifier(n_estimators=50, random_state=10)
ada_model.fit(x_train,y_train)
학습 및 테스트 데이터를 이용하여 예측값 만들기
train_pred = ada_model.predict(x_train)
test_pred = ada_model.predict(x_test)
예측 결과 확인
print('학습 데이터를 이용한 예측 결과 : \n', train_pred)
print('테스트 데이터를 이용한 예측 결과 : \n', test_pred)
{:.3f} 평균값을 소수 3자리까지만
print('학습 데이터 정확도 : {:.3f}'.format(accuracy_score(y_train, train_pred)))
print('테스트 데이터 정확도 : {:.3f}'.format(accuracy_score(y_test, test_pred)))
⛧GBM 모델 적용하기
- 여러개의 결정트리를 묶어서 강력한 모델을 만드는 앙상블 모델
- 강력한 사전 가지치기가 적용되었음(max_depth의 기본값: 3)
- 예측 성능은 높지만 과대 적합이 빠르게 되고 시간이 오래 걸린다는 단점이 있다.
- max_depth를 작게 설정해서 트리의 깊이가 5보다 깊어지지않게 해야한다.
- 가중치를 계산할 때 경사하강법을 사용한다.
#gbm 모델 불러오기
from sklearn.ensemble import GradientBoostingClassifier
# 모델 생성 및 하이퍼파라미터 설정( 하이퍼 파라미터는 기본모델로만 설정할거임.)
gbm_model = GradientBoostingClassifier(random_state=10)
#학습
gbm_model.fit(x_train, y_train)
# 여기 한번 더,
# 학습 및 테스트 데이터를 이용하여 예측값 만들기
train_pred = gbm_model.predict(x_train)
test_pred = gbm_model.predict(x_test)
# 예측 결과 확인
print('학습 데이터를 이용한 예측 결과 : \n', train_pred)
print('테스트 데이터를 이용한 예측 결과 : \n', test_pred)
# {:.3f} 평균값을 소수 3자리까지만
print('학습 데이터 정확도 : {:.3f}'.format(accuracy_score(y_train, train_pred)))
print('테스트 데이터 정확도 : {:.3f}'.format(accuracy_score(y_test, test_pred)))
⛧ XGBoost 모델 적용하기
- 결정트리 기반의 앙상블 모델에서 가장 각광받고 있는 알고리즘(모델)의 하나
- 분류에 있어서 일반적으로 다른 머신러닝 모델보다 뛰어난 성능을 나타냄.
- GBM 기반이지만 GBM의 단점을 해결
- 느린 학습 시간 ➜ Early Stopping기능으로 해결
- 과대 적합 ➜ 과대 적합을 방지하는 규제포함.
- 대규모 머신러닝 문제에서 GBM을 적용하는 경우 ➜ XGBoost를 사용.
sklearn에서 제공하지 않는 모듈 ( 따로 설치 필요)
# XGBoost 패키지 설치
!pip install xgboost
# XGBoost 불러오기
from xgboost import XGBClassifier
# 모델 생성 및 하이퍼 파라미터 설정(하이퍼파라미터는 기본값으로 설정함.)
xgb_model = XGBClassifier(random_state=10)
# 학습
xgb_model.fit(x_train, y_train)
# 여기 한번 더,
# 학습 및 테스트 데이터를 이용하여 예측값 만들기
train_pred = xgb_model.predict(x_train)
test_pred = xgb_model.predict(x_test)
# 예측 결과 확인
print('학습 데이터를 이용한 예측 결과 : \n', train_pred)
print('테스트 데이터를 이용한 예측 결과 : \n', test_pred)
# {:.3f} 평균값을 소수 3자리까지만
print('학습 데이터 정확도 : {:.3f}'.format(accuracy_score(y_train, train_pred)))
print('테스트 데이터 정확도 : {:.3f}'.format(accuracy_score(y_test, test_pred)))
⛧ LightGBM모델 적용하기
- XGBoost에 비해 가벼워 속도가 빠른 모델
- 대량(1만개 이상)의 데이터를 병렬로 빠르게 학습 가능( low memory, gpu 활용 가능)
- 소량의 데이터에서는 제대로 동작x (➜ 과대 적합 위험)
- 예측 속도가 빠름 (➜ level-wise에 비해 과적합에 민감)
- leaf-wise(수직방향, 비대칭이 특징)로 트리를 성장시킴 (속도 up)
- ➜ light gbm
- level-wise (수평방향, 깊이 ↓ , 대칭이 특징) 보다 오류가 더 적음( 정확도 up) ➜기존의 random forest, xg boosting
- XGBoost에 비해 가벼워 속도가 빠른 모델
- 비대칭트리분할로 균형을 맞추지 않음.➜ 속도가 빠름.
- 학습을 반복할 수록 균형 트리보다 예측 오류의 손실이 최소화된다.
- 깊이가 깊은 비대칭 트리 생성 ➜ 과적합이 쉽다.
Light GBM 패키지 설치하기
! pip install lightgbm
# Light GBM 불러오기
import lightgbm
from lightgbm.sklearn import LGBMClassifier
# 모델생성 및 하이퍼파라미터 설정(하이퍼 파라미터는 기본값으로 설정)
lgbm_model =LGBMClassifier(random_state=10)
#학습
lgbm_model.fit(x_train, y_train)
# 여기 한번 더,
# 학습 및 테스트 데이터를 이용하여 예측값 만들기
train_pred = lgbm_model.predict(x_train)
test_pred = lgbm_model.predict(x_test)
# 예측 결과 확인
print('학습 데이터를 이용한 예측 결과 : \n', train_pred)
print('테스트 데이터를 이용한 예측 결과 : \n', test_pred)
# {:.3f} 평균값을 소수 3자리까지만
print('학습 데이터 정확도 : {:.3f}'.format(accuracy_score(y_train, train_pred)))
print('테스트 데이터 정확도 : {:.3f}'.format(accuracy_score(y_test, test_pred)))
'Python' 카테고리의 다른 글
[Machine Learning ] ex09_보스턴 집값 예측 실습 (0) | 2023.09.07 |
---|---|
[Machine Learning] 회귀, 선형 회귀 모델 (0) | 2023.09.07 |
[Machine Learning] 하이퍼 파라미터 튜닝(타이타닉 실습) (0) | 2023.09.06 |
[Machine learning] 앙상블 (0) | 2023.09.05 |
[ Machine Learning ] ex06_타이타닉실습_앙상블모델 (0) | 2023.09.05 |