https://www.python2.net/questions-1067047.htm
python - Pandas에서 count () 및 value_counts ()를 언제 사용해야합니까?
팬더를 배우고 있습니다. .count() 를 언제 사용해야할지 모르겠습니다. .value_counts() 기능 및 사용시기 .
www.python2.net
1. 결정트리
직관적으로 이해 쉬움
최대한 균일한 데이터 세트를 구성할 수 있도록 분할
정보의 균일도 측정 - 지니계수, information gain(정보 이득)
정보 이득 : 1-엔트로피 지수
디폴트 : 지니계수
정보 이득이 높거나 지니 계수가 낮은 조건을 찾아서 분할
| 장점 | 단점 |
| 쉽고 직관적 전처리 필요 없음 |
과적합 -> 트리의 크기를 제한 |
대표 파라미터
| min_samples_split | 노드를 분할하기 위한 최소 샘플 데이터 개수 -> 과적합 제어 디폴트 : 2 작을수록 과적합 min_samples_split=4이면 분할하려면 최소 4개 샘플필요 |
| min_samples_leaf | 리프 노드가 되기 위한 최소 샘플 데이터 개수 비대칭적 데이터의 경우 특정 클래스의 데이터가 극도로 작을수 있으므로 이 경우 작게 설정 min_samples_leaf=4이면 샘플이 4이하일 때 리프노드가 됨. |
| max_features | 최족의 분할을 위해 고려할 최대 피처 개수 디폴트 : none -> 모든 피처 사용 int로 설정 : 대상 피처 개수 float : 대상 피처의 퍼센트 auto : sqrt |
| max_depth | 트리 최대 깊이 min_samples_split보다 작아질 때까지 깊이 증가시킴 |
| max_leaf_nodes | 리프 노드 최대 개수 |
export_graphviz() : 시각화 -> 학습 완료된 estimator, 피처 이름 리스트, 레이블 이름 리스트 입력
색깔이 짙어질수록 지니 계수가 낮고 해당 레이블에 속하는 샘플 데이터가 많다.
feature_importances_ : 넘파이로 반환
피처 중요도 정렬해서 보기
ftr_importances_values = best_df_flc.feature_importances_
ftr_importances = pd.Series(ftr_importances_values, index=X_train.columns)
ftr_top20 = ftr_importances.sort_values(ascending=False)[:20]
sns.barplot(x=ftr_top20,y = ftr_top20.index)

3. 앙상블 학습
앙상블 : 여러 개의 분류기를 생성하고 그 예측을 결합함.
여러 명의 전문가에게 다양한 의견 수렴
비정형 데이터(이미지, 영상, 음성)은 딥러닝이 뛰어남
랜덤포레스트, 그래디언트 부스팅, 스태킹
xgboost, xgboost보다 빠른 lightGBM
학습 유형 : 보팅(voting), 배깅(bagging), 부스팅(boosting)
보팅은 서로 다른 알고리즘을 가진 분류기를 결합
배깅은 분류기가 모두 같음 하지만 데이터 샘플링을 서로 다르게 가져감(bootstrap aggregating)
랜덤포레스트는 배깅

배깅은 중첩 허용
따라서 10000개의 데이터를 10개의 분류기가 배깅 방식으로 나누더라도 각 1000개의 데이터 내에는 중복된 데이터가 존재
부스팅은 여러 개의 분류기가 순차적으로 학습을 수행하되 앞에서 학습한 분류기가 예측이 틀린 데이터에 대해서는 올바르게 예측할 수 있도록 다음 분류기에게는 가중치를 부여하면서 학습과 예측 진행
가중치를 부스팅하면서 학습을 진행해서 부스팅이라고 불림
gradient boost, xgboost, LightGBM 존재
스태킹은 여러 가지 다른 모델의 예측 결괏값을 다시 학습 데이터로 만들어서 다른 모델(메타 모델)로 재학습시켜 결과를 예측
보팅 유형
Hard voting : 다수결 원칙
Soft voting : 레이블 값 결정 확률을 모두 더하고 이를 평균해서 이들 중 확률이 가장 높은 레이블 값을 결과로 설정
일반적으로 소프트 보팅 사용
from sklearn.ensemble import VotingClassifier
estimator(튜플 형식)와 voting(기본 : hard) 값 입력받음
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=.2, random_state=156)
vo_clf.fit(X_train, y_train)
pred = vo_clf.predict(X_test)
print(f'voting 분류기 정확도 : {accuracy_score(y_test, pred)}')
print(vo_clf.__class__.__name__)
voting 분류기 정확도 : 0.9473684210526315
VotingClassifier
배깅과 부스팅은 대부분 결정 트리 알고리즘 기반
결정 트리 알고리즘은 과적합 발생 확률 높지만 이러한 단점을 많은 분류기를 결합해 다양한 상황을 학습하게함.
보팅과 스태킹은 서로 다른 알고리즘 사용
4. 랜덤 포레스트
배깅 방식
개별 트리가 학습하는 데이터 세트는 전체 데이터에서 일부가 중첩되게 샘플링된 데이터 세트임.
이렇게 여러 개의 데이터 세트를 중첩되게 분리하는 것을 부트스트래핑이라고 함.
데이터가 임의로 생성됨
단점 : 파라미터 너무 많고 이로인해 튜닝에 시간을 많이 사용
n_estimators : 결정 트리 개수
랜덤 포레스트는 CPU 병렬 처리도 효과적으로 수행됨-> 빠름 -> 그래디언트 부스팅보다 예측 성능이 약간 떨어지더라도 핸덤 포레스트로 기반 모델 먼저 구축하는 경우 많음
5. GBM(Gradient Boosting Machine)
부스팅 알고리즘 : 여러 개의 약한 학습기(weak learner)를 순차적으로 학습-예측하면서 잘못 예측한 데이터에 가중치 부열르 통해 오류를 개선해 나가면서 학습하는 방식
AdaBoost, 그리디언트 부스트
1. AdaBoost
오류 데이터에 가중치를 부여하면서 부스팅을 수행

Box1에 0.3, Box2에 0.5, Box3에 0.8의 가중치 부여를 부여하고 모두 결합
2. GBM
GBM도 에이다부스트와 유사하지만 가중치 업데이트에 경사 하강법 이용
회귀도 가능
일반적으로 GBM이 랜덤포레스트보다 나은 예측 성능이 조금 뛰어남.
하지만 수행 시간 오래걸리고 하이퍼파라미터 튜닝 노력도 해야함.
또한 약한 학습기의 순차적인 예측 오류 보정을 통해 학습을 수행하므로 멀티 cpu 코어 시스템을 사용하더라도 병렬처리가 지원되지 않아서 대용량 데이터의 경우 학습에 매우 많은 시간이 필요
하이퍼 파라미터 및 튜닝
loss : 경사하강법에서 사용할 cost function / 기본값인 deviance를 그대로 적용
learning_rate : 너무 작은 값 설정하면 성능 높아질 수 있지만 완료되도 최소 오류값을 찾지 못할 수 있음
너무 크면 최소 오류값을 그냥 지나쳐 버려 예측 성능 떨어지지만 빠름
-> 이러한 이유로 learning rate은 n_estimators와 상호 보완적으로 조합해 사용
n_estimators : weak learner 개수
subsample : weak learner가 학습에 사용하는 데이터의 샘플링 비율 / 기본값은 1인데 이는 전체 학습 데이터를 사용한다는 뜻
GBM은 과적합에도 강한 뛰어난 예측 성능가짐 / 오래걸림
두 개의 그래디언트 부스팅 기반 ML 패키지 : XGBoost, LightGBM
'머신러닝' 카테고리의 다른 글
| 파이썬 머신러닝 완벽가이드 - 3장 (0) | 2021.10.02 |
|---|---|
| 파이썬 머신러닝 완벽가이드 - 2장 (0) | 2021.09.15 |
| 파이썬 머신러닝 완벽가이드 - 1장 (0) | 2021.09.07 |
| 알고리즘 체인과 파이프라인 (0) | 2021.08.09 |
| 모델 평가와 성능 향상 (0) | 2021.08.05 |