본문 바로가기
데이터분석/데이터분석

앙상블 (Esemble Learning)

by 이규승 2022. 5. 11.
728x90
반응형

앙상블 배깅과 부스팅 참고 사이트1

https://bkshin.tistory.com/entry/%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D-11-%EC%95%99%EC%83%81%EB%B8%94-%ED%95%99%EC%8A%B5-Ensemble-Learning-%EB%B0%B0%EA%B9%85Bagging%EA%B3%BC-%EB%B6%80%EC%8A%A4%ED%8C%85Boosting

 

머신러닝 - 11. 앙상블 학습 (Ensemble Learning): 배깅(Bagging)과 부스팅(Boosting)

앙상블(Ensemble) 앙상블은 조화 또는 통일을 의미합니다. 어떤 데이터의 값을 예측한다고 할 때, 하나의 모델을 활용합니다. 하지만 여러 개의 모델을 조화롭게 학습시켜 그 모델들의 예측 결과들

bkshin.tistory.com

앙상블 배깅과 부스팅 참고 사이트2

https://cafe.daum.net/flowlife/SBU0/15

 

Daum 카페

 

cafe.daum.net

앙상블 학습(Ensemble Learning)은 여러 개의 분류기를 생성하고, 그 예측을 결합함으로써 보다 정확한 예측을 도출하는 기법을 말합니다. 강력한 하나의 모델을 사용하는대신 보다 약한 모델 여러개를 조합하여 더 정확한 예측에 도움을 주는 방식입니다. 현실세계로 예를 들면, 어려운 문제를 해결하는데 한 명의 전문가보다 여러명의 집단지성을 이용하여 문제를 해결하는 방식을 앙상블 기법이라 할 수 있습니다.

 

#보팅

# cancer 자료 이용하기
from sklearn.datasets import load_breast_cancer
import pandas as pd

cancer = load_breast_cancer()
data_df = pd.DataFrame(cancer.data, columns = cancer.feature_names)

# train / test 분류
from sklearn.model_selection import train_test_split

x_train, x_test, y_train, y_test = train_test_split(cancer.data, cancer.target,
                                                    test_size=0.2, random_state= 12)
                                                
# 개별 분류기를 생성하기
from sklearn.ensemble import VotingClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.neighbors import KNeighborsClassifier
from sklearn.tree import DecisionTreeClassifier

logi_regression = LogisticRegression()
knn = KNeighborsClassifier(n_neighbors = 3)
dec_model = DecisionTreeClassifier()

# 보팅모델
voting_model = VotingClassifier(estimators=[('LR',logi_regression),('KNN',knn),('Decision',dec_model)],
                                voting='soft')

classifiers = [logi_regression, knn, dec_model]

for classifier in classifiers: # 개별 모델의 학습 및 평가
    classifier.fit(x_train,y_train)
    pred = classifier.predict(x_test)
    class_name = classifier.__class__.__name__
    print('{0} 정확도:{1:.4f}'.format(class_name, accuracy_score(y_test, pred)))

voting_model.fit(x_train, y_train)
vpred = voting_model.predict(x_test)
print('voting_model 정확도:{0:.4f}'.format(accuracy_score(y_test,vpred)))   
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
LogisticRegression 정확도:0.9386
KNeighborsClassifier 정확도:0.8947
DecisionTreeClassifier 정확도:0.9123
voting_model 정확도:0.9386

# 배깅

# 타이타닉 자료 활용
import pandas as pd
import numpy as np

# 자료 불러오고 데이터 정리하기
df = pd.read_csv('../testdata/titanic_data.csv')
df = df.dropna(subset=['Pclass','Age','Sex']) # 관심있는 칼럼만 대상으로 null 행 제거

df_x = df[['Pclass','Age','Sex']]

# 데이터 가공하기, LabelEncoder, OneHotEncoder 
from sklearn.preprocessing import LabelEncoder, OneHotEncoder
df_x.loc[:, 'Sex'] = LabelEncoder().fit_transform(df_x['Sex'])
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
   Pclass   Age  Sex
0       3  22.0    1
1       1  38.0    0
2       3  26.0    0

# OneHotEncoder

df_x2 = pd.DataFrame(OneHotEncoder().fit_transform(df_x['Pclass'].values[:,np.newaxis]).toarray(),
                                                   columns = ['f_class','s_class','t_class'],
                                                   index = df_x.index)
print(df_x2.head())
df_x = pd.concat([df_x,df_x2], axis=1)
print(df_x.head())

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
   f_class  s_class  t_class
0      0.0      0.0      1.0
1      1.0      0.0      0.0
2      0.0      0.0      1.0
3      1.0      0.0      0.0
4      0.0      0.0      1.0
   Pclass   Age  Sex  f_class  s_class  t_class
0       3  22.0    1      0.0      0.0      1.0
1       1  38.0    0      1.0      0.0      0.0
2       3  26.0    0      0.0      0.0      1.0
3       1  35.0    0      1.0      0.0      0.0
4       3  35.0    1      0.0      0.0      1.0

# 모델, 교차검증

df_y = df['Survived']
 
train_x, test_x, train_y, test_y = train_test_split(df_x, df_y)

# model :RandomForestClassifier - 여러 개의 DecisionTree를 배깅방식으로 처리해 최적화된 앙상블 모델 구현
model = RandomForestClassifier(criterion='entropy', n_estimators=500) #실무는 2000개많이쓴다.
model = model.fit(train_x, train_y)

pred = model.predict(test_x)
print('예측값 : ',pred[:10])
print('실제값 : ', np.array(test_y[:10]))

from sklearn.metrics import accuracy_score
print('accuracy :', accuracy_score(test_y, pred))

# 교차검증 (cross validation - K-fold)
cross_vali = cross_val_score(model,train_x,train_y, cv = 5)
print(np.round(np.mean(cross_vali), 3)) #5겹 교차검증 처리 모델 평균 정확도

cross_vali2 = cross_val_score(model, df_x,df_y, cv = 5)

# 중요 변수 확인 
import matplotlib.pyplot as plt
print('특성(변수) 중요도:\n{}'.format(model.feature_importances_))

def plot_feature_importances_func(model):
    n_features = df_x.shape[1]
    plt.barh(range(n_features), model.feature_importances_, align='center')
    plt.yticks(np.arange(n_features),df_x.columns)
    plt.xlabel('attr importances')
    plt.ylabel('attr')
    plt.show()
    
plot_feature_importances_func(model)

 

 

728x90

'데이터분석 > 데이터분석' 카테고리의 다른 글

XGboost  (0) 2022.05.12
Regressor  (0) 2022.05.11
sklearn을 이용한 과적합 방지  (0) 2022.05.11
분류모델 : 의사결정나무(DecisionTree)  (0) 2022.05.11
혼동행렬, ROC, AUC  (0) 2022.05.11