종류
특징 : 단일 모델들의 약점을 보완
## 보팅방식을 활용하여 정확도 높여보기 => 같은 데이터
- 각각 다른 모델을 활용하여 각 결과를 투표하는 방식으로 결과값을 산출
#여러 모델을 사용하기위해 다양한 모델을 만들어준다.
# 모델객체 생성
tree_model2 = dtc(max_depth=5)
# 모델학습
tree_model2.fit(X_train,y_train)
# 도구 불러오기
from sklearn.ensemble import VotingClassifier as vc
# 보팅
# 어떤 모델을 사용할것인지
# 리스트 형태로 [(튜플형태), (튜플형태)]
vc_model = vc(estimators=[('tree1',tree_model), # ('이름', 모델)
('tree2',tree_model2),
('knn',knn_model)],
voting = 'soft')
# 교차검증
result = cross_val_score(vc_model,t_X_train,y_train,cv=5)
result.mean()
pre3=vc_model.predict(t_X_test)
result2=pd.read_csv('data/gender_submission.csv')
result2['Survived'] = pre3
result2.to_csv("JYP3.csv", index = False)
# 필요한 도구 불러오기
# 분리
from sklearn.model_selection import train_test_split as tts
#유방암 데이터셋 불러오기
from sklearn.datasets import load_breast_cancer
# 데이터 변수에 담아주기
cancer_data = load_breast_cancer()
cancer_data
# 번치 객체로 출력된다. (딕셔너리 형태로 구성)
# 밸류에 접근하는 방법 : 변수 이름 ['키']
# target = 정답데이터
# 데이터 살펴보기
# 문제 데이터
cancer_data.data
# 정답데이터 출력
cancer_data.target
# 정답데이터 이름 출력
cancer_data.target_names
# malignant : 0 => 악성(나쁜거)
# benign : 1 => 양성()
# 데이터 크기확인
print('데이터 크기 확인 ', cancer_data.data.shape)
# column 특성 30개
# 특성확인
cancer_data.feature_names
## 훈련셋과 테스트셋으로 분리
- 569개의 데이터를 훈련 데이터와 테스트 데이터로 분리
- 문제데이터 : cancer_data, 답데이터 : cancer_data.target
import pandas as pd
# 데이터 분리
# 7:3
cancer_list = pd.DataFrame(cancer_data['data'],columns=cancer_data['feature_names'])
cancer_list
cancer_list.info()
X=cancer_list
y=cancer_data['target']
X_train,X_test,y_train,y_test=tts(X,y, test_size=0.3,random_state=28)
## 랜덤포레스트 (배깅의 대표적 모델)
- 몇 개의 트리모델을 사용해서 학습할것인지 설정 (n_estimators)
- 단일의 트리모델을 여러개 병렬적으로 학습시켜서 최종 예측하는 모델
- 단일 트리모델에서 적용하는 사전가지치기 사용가능함
# random forest 모델 불러오기
from sklearn.ensemble import RandomForestClassifier
# 모델 생성 및 하이퍼 파라미터정하기
forest_model = RandomForestClassifier(n_estimators=100, # 100개의 트리모델을 돌려보자
random_state=10) # 트리특성상 내부에 랜덤스테이트가 존재한다.
#모델 학습
forest_model.fit(X_train,y_train)
#정확도 확인
forest_model.score(X_test,y_test)
#훈련용 데이터에 대한 정확도 확인 => 과대적합 확인하기
forest_model.score(X_train,y_train)
#사전가지치기를 해서
## GridSearchCV를 활용한 모델의 성능 향상시키기
- 최적의 파라미터를 찾아주는 도구
# 그리드서치 도구 불러오기
from sklearn.model_selection import GridSearchCV
# 1.파라미터 경우의수 직접 설정(딕셔너리 형태로 적어준다.)
params = {'n_estimators':[50,100,150,200,250,300],
#사전 가지치기 실행
'max_depth': [3,5,7,9,11,13],
'max_leaf_nodes': [2,4,6,8,10,12],
'min_samples_split':[3,5,7,9,11,13]}
# 2.대상모델선택
model=RandomForestClassifier(random_state=66)
# 랜덤 스테이트는 동일하게 설정된다. 위의 하리퍼파라미터만을 바꿔주기 위해서
# 3.대상모델에게 그리드서치 설정, 실행
grid =GridSearchCV(model, params, cv = 5, scoring='accuracy',n_jobs= -1)
#n_jobs = -1 : pc코어, 성능 최대한을 사용
# 실행
grid.fit(X_train,y_train)
# 4.최적의 파라미터 조합 및 정확도 확인
print('최적의 하이퍼 파라미터 확인',grid.best_params_)
print('최고의 정확도',grid.best_score_)
# 5.찾아준 최적의 하이퍼 파라미터 조합으로 다시 모델학습
best_model = RandomForestClassifier(max_depth=3,max_leaf_nodes=6,
min_samples_split=3, n_estimators=150, random_state = 66)
# 모델 학습
best_model.fit(X_train,y_train)
# 정확도 확인
best_model.score(X_test,y_test)
# 영향력이 높은 특성 확인하기
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
f_im=best_model.feature_importances_
# 1에 가까울수록 영향력이 있는 특성
f_im
# 데이터 프레임 만들기
# 컬럼값 => 'import'
# 인덱스 => 'cancer_data.feature_names'
#가장중요한 특성을 보기위해 내림차순 정렬 진행
df=pd.DataFrame(f_im,columns=['import'],index=cancer_data.feature_names)
#내림차순
df_sort=df.sort_values(by='import',ascending=False)
#점수가 1에 가까울수록 중요한 특성
# 위 데이터 그래프 그려보기 (상위 5개값만 그려보기)
df_sort.head().plot.barh()