티스토리 뷰

  • 통계기반 머신러닝으로 만든 학습기와 분류기? => 분류와 식별을 실행할 때 학습기 하나에서 원하는 성능을 낼 수 있도록 설계.
  • 학습기 수가 적은 모델을 구축할 때가 많다. (사람이 학습기의 동작을 이해하려면 가능한 하 구조가 단순한 것이 바람직하기 때문
  • 앙상블 방법은 분류에서 가장 각광을 받는 방법 중 중 하나
  • 서로 다른/또는 같은 알고리즘을 단순히 결합한 형태도 있으나, 일반적으로 배깅(Bagging)과 부스팅(Boosting) 방식으로 나뉨 

 

1.배깅(Bagging) – 일반적인 모델을 만드는데 집중 가중치 부여 X

  • 배깅 알고리즘(랜덤 포레스트) ==> 여러 트리 모양 결합하여 생긴 결과
  • 샘플을 여러 번 뽑아 각 모델을 학습시켜 결과를 집계(Aggregating)하는 방법
  • 대상 데이터로부터 복원 랜덤 샘플링 한 후 이렇게 추출한 데이터가 일종의 표본집단 >> 이 결과로 모델을 생성해낸다.
  • 배깅은 각 샘플에서 나타난 결과를 일종의 중간값으로 맞추어주기 때문에 overfitting을 피할 수 있다.
  • Bagging이 병렬로 학습
  • 부트스트랩 방법을 이용해 학습데이터에서 m개의 복원 추출을 B회만큼 반복, 병렬로 학습
  • 작게 나눈 m개의 데이터를 포함하는 B회의 학습 데이터 생성
  • 각각의 학습 데이터로 학습하면서 약학습기 h를 구축한 후 통합하면 학습기 H가 된다.
  • H는 학습 데이터의 식별이나 확인에는 가장 우수한 결과를 선택하며 회귀일때는 h의 평균을 이용
  • bootstrap aggregating의 줄임말
  • 통계적 분류와 회귀 분석에서 사용되는 기계 학습 알고리즘의 안정성과 정확도를 향상시키기 위해 고안된 일종의 앙상블 학습법의 메타 알고리즘
  • 배깅은 분산을 줄이고 과적합(overfitting)을 피하도록 해준다.
  • 결정 트리 학습법이나 랜덤 포레스트(Random Forest)에만 적용되는 것이 일반적이기는 하나, 그 외의 다른 방법들과 함께 사용할 수 있다

2. 부스팅

  • 맞추기 어려운 문제를 맞추는데 초점이 되어 있. 가중치 부여 O
  • Ex) 수학문제 9번이 계속 어려워서 틀렸다면? 9번문제에 가중치를 부여해서 9번문제를 잘 맞춘 모델을 선정
  • 순차적으로 학습, 배깅과 마찬가지로 동일하게 복원 랜덤 샘플링을 하지만 가중치를 부여 오답에 대해 높은 가중치를 부여하고, 정답에 대해 낮은 가중치를 부여하기 때문에 오답에 더욱 집중할 수 있다.
  • Boosting 기법의 경우, 정확도가 높게 나타나지만, 하지만, 그만큼 Outlier에 취약하다.
  • AdaBoost, XGBoost, GradientBoost 등 다양한 모델이 있다.
  • Boosting은 순차적으로 학습

 

3. 스태킹(Stacking) 

  • Stacking은 서로 다른 모델들을 조합해서 최고의 성능을 내는 모델을 생성
  • 여러가지 다른 모델의 예측 결괏값을 다시 학습 데이터로 만들어서 다른 모델(메타모델)로 재 학습시켜 결과를 예측하는 방법 
  • SVM, Random Forest, KNN 등 다양한 알고리즘을 사용할 수 있다. -> 조합을 통해 서로의 장점은 취하고 약점을 보완할 수 있게 되는 것 
  • 하지만 계산량이 어마어마 하다

 

4. 보팅(Voting) 

  • 보팅의 경우 일반적으로 서로 다른 알고리즘을 가진 분류기를 결합하는것
  • 보팅방법에는 두가지가 있음 
  1. 하드보팅 - 예측한 결괏값들 중 다수의 분류기가 결정한 예측값을 최종 보팅 결괏값으로 선정하는 것
  2. 소프트보팅 - 분류기들의 레이블 값 결정 확률을 모두 더하고 이를 평균해서 이들 중 확률이 가장 높은 레이블 값을 최종 보팅 결괏값으로 선정 

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
import pandas as pd
from sklearn.ensemble import VotingClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.neighbors import KNeighborsClassifier
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
pd.set_option('display.expand_frame_repr', False)
 
cancer = load_breast_cancer()
data_df = pd.DataFrame(cancer.data, columns = cancer.feature_names)
print(data_df.head(3))
 
 
"""
 mean radius  mean texture  mean perimeter  mean area  mean smoothness  mean compactness  mean concavity  mean concave points  mean symmetry  mean fractal dimension  radius error  texture error  perimeter error  area error  smoothness error  compactness error  concavity error  concave points error  symmetry error  fractal dimension error  worst radius  worst texture  worst perimeter  worst area  worst smoothness  worst compactness  worst concavity  worst concave points  worst symmetry  worst fractal dimension
0        17.99         10.38           122.8     1001.0          0.11840           0.27760          0.3001              0.14710         0.2419                 0.07871        1.0950         0.9053            8.589      153.40          0.006399            0.04904          0.05373               0.01587         0.03003                 0.006193         25.38          17.33            184.6      2019.0            0.1622             0.6656           0.7119                0.2654          0.4601                  0.11890
1        20.57         17.77           132.9     1326.0          0.08474           0.07864          0.0869              0.07017         0.1812                 0.05667        0.5435         0.7339            3.398       74.08          0.005225            0.01308          0.01860               0.01340         0.01389                 0.003532         24.99          23.41            158.8      1956.0            0.1238             0.1866           0.2416                0.1860          0.2750                  0.08902
2        19.69         21.25           130.0     1203.0          0.10960           0.15990          0.1974              0.12790         0.2069                 0.05999        0.7456         0.7869            4.585       94.03          0.006150            0.04006          0.03832               0.02058         0.02250                 0.004571         23.57          25.53            152.5      1709.0            0.1444             0.4245           0.4504                0.2430          0.3613                  0.08758
 
"""
 
#개별모델
lr_clf = LogisticRegression()
knn_clf = KNeighborsClassifier(n_neighbors = 8)
 
#개별 모델을 소프트 보팅 기반의 앙상블 모델로 구현
vo_clf = VotingClassifier(estimators = [('LR', lr_clf), ('KNN', knn_clf)], voting = 'soft')
 
X_train, X_test, y_train, y_test = train_test_split(cancer.data, cancer.target, test_size = 0.2, random_state = 156)
 
#VotingClassifier 학습/예측 평가
vo_clf.fit(X_train, y_train)
pred = vo_clf.predict(X_test)
print('Voting 분류기 정확도 : {0:.4f}'.format(accuracy_score(y_test,pred)))
 
#개별모델 학습 평가
classifiers = [lr_clf, knn_clf]
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 분류기 정확도 : 0.9561
LogisticRegression 정확도 : 0.9474
KNeighborsClassifier 정확도 : 0.9386
"""
 
cs
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG more
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함