머신러닝 9일차

ParkJinYoung·2022년 10월 28일
0

앙상블모델, 그리드 서치

  • 앙상블 : 여러 개의 모델을 연결해서 더 강력한 모델을 만드는 기법

    종류

    특징 : 단일 모델들의 약점을 보완

## 보팅방식을 활용하여 정확도 높여보기 => 같은 데이터
- 각각 다른 모델을 활용하여 각 결과를 투표하는 방식으로 결과값을 산출

#여러 모델을 사용하기위해 다양한 모델을 만들어준다.

# 모델객체 생성
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()
profile
꾸준히

0개의 댓글