머신러닝 내용 요약 및 정리

장우솔·2022년 1월 4일
0

머신러닝

목록 보기
1/2

공모전에 참가하게 되어 분류데이터 분석하고 있는데 필요한 머신러닝 내용 정리해보았습니다~!

분류의 평가 지표

범주 불균형 문제르 갖고 있는 데이터에 대한 분석 평가지표는 중요한 분류 범주만 다루어야한다. 이때 민감도와 특이도 사용.

예측 참예측 거짓
실제 참(암, 스팸)TPFN
실제 거짓FPTN

특이도 TN/(FP+TN)
실제 negative 중 예측한 것 중 예측과 실제값이 일치한 것

정밀도 TP/(TP+FP)
(from sklearn.metrics import precision_score)
positive로 예측한 것 중 실제값이 positive인 것
중요한 지표인 경우

ex) 스팸메일
스팸메일이 아닌데 스팸메일로 인식해서 처리하면 일에 지장이 생길 수 있음
따라서 FP를 최소화 하는 게 좋다.

민감도=재현율 TP/(TP+FN)
(from sklearn.metrics import recall_score)
실제값이 positive 중 예측과 실제값이 일치한 것
중요한 지표인 경우

ex) 암발병판단, 금융사기 등
실제 암인데 암이 아니라고 판단하면 목숨에 위험이 생김
따라서 FN을 최소화하는게 좋다.

-> 정밀도와 재현율은 trade-off된다. 예를들면, 정밀도는 모델이 심장병에 걸렸다고 예측한 사람 중에서 실제로 심장병이 있는 사람의 비율. 재현율은 실제로 심장병이 있는 사람 중 모델이 심장병에 걸렸다 예측한 비율.

  • 컷오프가 올라가면 긍정 맞추는게 희박해져서 정밀도는 올라가고 재현율(민감도)감소간다(정밀도 재현율 분모를 봐!!). 컷오프가 내려가면 민감도는 올라가고 정밀도는 떨어진다.


  • 성능 수치를 조정하기 위해선 컷오프(임곗값)을 조절한다. predict_proba()를 통해 예측 확률 알 수 있다.
from sklearn.preprocessing import Binarizer
binarizer=Binarizer(threshold=)
binarizer.fit_transform(data)

f1(from sklearn.metrics import f1_score)
정밀도와 재현율이 어느 한쪽으로 치우치지 않는 수치를 나타낼 때 높은 값 갖는다.
f1 score는 정밀도랑 재현율의 조화평균


roc 곡선과 이에 기반한 auc스코어
y축에는 민감도, x축에는 1-특이도로 (TPR,FPR) 왼쪽아래부터 컷오프 값을 1에서 0으로 줄이며 민감도와 특이도 쌍을 그린다. 그래프가 왼쪽 위를 향할수록 옳은 성능을 가짐을 뜻한다. ROC곡선을 요약하는 측도로 AUC를 사용하는데 이는 곡선 아래의 면적을 뜻한다. 분류기가 이성적일수록 1에 가까워지고 무작위에 가까울수록 0.5에 가까워진다. 밑부분 면적이 넓을수록 좋은 모형이다.

  • 컷오프 값을 낮추면 암에 걸리지 않았는데 암에 걸렸다고 판단한다.
  • 컷오프 값을 높이면 암에 걸렸는데 안걸렸다고 판단한다.

이진 분류의 예측 성능 측정에서 중요하게 사용한다.






회귀 평가 지표

  • ME :음, 양의 오차가 상쇄되어 잘못된 결론을 내릴 수 있다.

  • MAE: 실제 값과 예측값 차이 절댓값을 변환해 평균 scoring=’neg_mean_absolute_error’

  • MSE: 실제 값과 예측값 차이 제곱해 평균 scoring=’neg_mean_squared_error’
    -->제곱을 하기 때문에 아웃라이어에 민감하다.

  • RMSE: MSE 값은 오류의 제곱을 구하므로 실제 오류 평균보다 더 커지는 특성이 있어 MSE에 루트를 씌운 값.
    --> 아웃라이어에 덜 민감하고 실제 값과 유사한 단위로 변환하여 해석이 다소 용이하다.

  • RMSLE: RMSE에 로그를 적용해준 지표. log(y)가 아니라 log(y+1). y=0일 때, log(y)는 마이너스 무한대이므로 이를 보정해주기 위해 +1을 한다.
    특징
    1. 아웃라이어에 덜 민감하다. (robust) : 아웃라이어가 있더라도 값의 변동폭이 크지 않다.
    2. 상대적 에러 측정 가능하다. : 값의 절대적 크기가 커지면 RMSLE 값도 커지지만, 상대적 크기가 동일하다면 RMSLE의 값도 동일하다.
    3. 예측값이 실제값보다 작을 경우 더 큰 패널티를 준다. : 로그값이기 때문에 어느지점에서 급격하게 마이너스 무한대로 감소한다. 예를 들어 기차가 2시 도착이라 했으나, 실제로 2시10분에 도착하면 소비자가 실망하는 것과 같은 개념이다.

특징 2 예시)
예측값 = 100, 실제값 = 90일 때, RMSLE = 0.1053, RMSE = 10
예측값 = 10,000, 실제값 = 9,000일 때, RMSLE = 0.1053, RMSE = 1,000

  • R^2: 분산 기반으로 예측성능 평가 1에 가까울수록 예측 정확도 높다. 예측값 분산 / 실제값 분산

  • MPE : 오차의 방향을 고려하여 예측이 얼마나 벗어나는지 퍼센트 점수로 제공

  • MAPE : MPE에서 오차의 방향을 고려하지 않음

import numpy as np
from sklearn.metrics import mean_squared_error, r2_score, mean_absolute_error, mean_squared_log_error

MAE =  mean_absolute_error(origin, pred)

MSE = mean_squared_error(origin, pred)

RMSE = np.sqrt(MSE)

MSLE = mean_squared_log_error(origin, pred)

RMSLE = np.sqrt(mean_squared_log_error(origin, pred))

R2 = r2_score(origin, pred)





분류 모델 종류

나이브 베이즈
로지스틱 회귀
서포트백터머신
최소근접 알고리즘
신경망
결정트리
앙상블 등.....

나이브베이즈

  1. 설명변수가 연속형일 때 : 가우시안 나이브베이즈
    정규분포를 가정한 표본들을 대상으로 조건부 독립을 나타내, 항상 같은 분모를 갖는 조건하에서, 분자의 값이 가장 큰 경우, 즉 확률이 가장 높은 경우를 "선택"하는 것이다.

  2. 설명변수가 범주형일 때 : 다항 나이브베이즈
    범주가 2개밖에 없는 이진형일 경우 : 베르누이 나이브베이즈

  • 각각의 출현한 횟수를 모두 곱한 것 분의 각각의 출현한 횟수를 다 더한 것의 팩토리얼

나이브 벤치마크
학습데이터에 대한 평균으로 예측하는 것으로 모델을 사용하지 않는다. 좋은 예측 모델은 벤치마크 기준보다 우수한 성능을 내야한다.

knn

데이터에 대한 가정이 필요없는 비모수적 방법으로 통계적모델이 아닌 데이터기반 알고리즘이다. k개의 데이터들이 주로 속한 클래스를 찾아 새로운 데이터를 예측, 분류한다.
검증데이터에서 분류성능이 가장 좋은 k값을 사용한다. 수치형은 k 최근접이웃들의 평균 결과값을 사용한다.
장점 : 분포가정없어서 통계적 모델이 없어도 좋은성능을 낸다. 분류, 예측 다 가능
단점 : 학습데이터가 큰 경우 근접이웃을 찾는데 오래걸린다.

결정트리

지니계수는 작을수록 균일도가 높은 것이다.
앙상블의 기본 알고리즘으로 결정 트리를 사용한다. 결정 트리는 사전 가공 안해도 되지만 과적합 발생 가능성 높으며 예측성능 저하될 수 있다.
복잡도 조절 매개변수 -> 사전 가지치기(max_depth, max_lead_nodes, min_samples_leaf)
각 특성이 개별적으로 처리 되어 스케일 영향받지 않는다. -> 전처리나 정규화 필요 없다.
이진 특성과 연속 특성 혼합되어도 잘 작동한다.
but, 사전 가지치기 사용함에도 과대 적합 경향이 있다.

#min_samples_split: 최소한 샘플 데이터 수 디폴트2, 작게 설정할수록 노드 분할 많아져서 과적합 가능성 증가
#min_samples_leaf : 말단 노드가 되기 위한 최소 샘플 수, 비대칭적 데이터일 경우 특정 클래스 데이터가 극도로 작을 수 있으니 이 경우는 작게 설정 필요
#max_depth : 트리의 최대 깊이 규정, 디폴트는 none. 노드가 갖고 있는 데이터 개수가 min_samples_split보다 작아질 때까지 계속 깊이증가
#max_features : 최대 피처 개수, 디폴트는 none,
#max_leaf_nodes : 말단노드 최대 개수

앙상블

: 약한 학습기를 결합해 확률 전 보완과 오류가 발생한 부분에 가중치를 업데이트하면서 예측 성능 향상시킨다.

  1. 보팅 : 다른 알고리즘을 가진 분류기를 결합한다.
    하드보팅 : 다수의 분류기가 결정한 예측값을 최종 결과값으로
    소프트보팅 : 분류기들의 레이블 값 결정 확률을 모두 더하고 평균해서 이들 중 확률이 가장 높은 레이블 값을 최종 보팅 결과값으로/ 일반적으로 예측성능이 더 좋다.

  2. 배깅 ex)랜덤포레스트
    각각의 분류기가 모두 같은 유형의 알고리즘 기반이지만 데이터 샘플링을 서로 다르게 가져가면서 학습한다.
    뛰어난 예측성능, 빠른수행시간, 유연성/ 교차검증 간에 중첩허용

  • 랜덤포레스트 : 여러 결정트리를 묶어 평균을 냄으로써 성능이 유지되면서 과대적합을 줄일 수 있다.

랜덤포레스트 하이퍼파라미터

#n_estimators : default=10, 결정트리 개수 지정 n_estimators 클수록 좋다. 많은 트리면 과적합 줄여준다. 하지만 시간 길어진다.

#max_features : 최대 피처 개수, 디폴트는 sqrt.
max_features 트리를 얼마나 무작위로 할지 -> 과대 적합 줄여준다.
max_features=1 -> 트리의 분기는 테스트할 특성을 고를 필요가 없게 되며 그냥 무작위로 선택한 특성의 임계치를 찾기만 하면 된다.
max_features 값 크게 하면, 랜덤 포레스트의 트리들은 매우 비슷 -> 가장 두드러진 특성을 이용해 데이터에 잘 맞춘다.
max_features 낮추면, 랜덤 포레스트 트리들이 많이 달라지고 각 트리는 맞추기 위해 깊이가 깊어지게 된다.

  • max_depth, min_samples_leaf도 있다.
  • 중요 매개변수 n_estimators, max_features, max_depth 등은 사전 가지치기 옵션이다. 추가하면 시간과 메모리 아낄 수 있고 성능 향상 기대할 수 있다.

#n_jobs : 매개 변수 이용하여 코어 수 정할 수 있다.
코어에 비례하여 속도 빨라진다. n_jobs=2 -> 속도 2배
n_jobs=-1 하면 모든 코어 사용한다.

**회귀의 경우** 이 예측들을 평균하여 최종 예측을 만든다. 
**분류의 경우** 약한 투표 전략을 사용한다.




3. 부스팅-회귀에도 가능!
여러 개의 분류기가 순차적으로 학습 수행하되, 예측이 틀린 데이터에 대해서 올바르게 예측할 수 있도록 다음 분류기에 가중치를 부여하며 학습과 예측 진행한다.

  • adaboost-오류 데이터에 가중치 부여
  • gbmboost-가중치 업데이트를 경사하강법으로 한다.

gbm 하이퍼파라미터

#loss: 비용함수, 특별한이유없으면 default 사용

#learning_rate : 학습률 0~1값 지정가능 기본값은 0.1 너무 작은 값을 적용하면 업데이트 되는 값이 작아져서 최소 오류 값을 찾아 예측성능이 높아질 가능성이 높지만 수행시간 오래걸린다. 큰 값을 적용하면 최소 오류 값 찾지 못하고 지나쳐버려 예측성능 떨어질 수 있지만 빠른 수행 가능. 앙상블 방식에서 사전 가지치기나 트리 개수 이외에도 트리 오차 얼마나 강하게 보정할 것인지 결정한다. 학습률이 크면 트리는 보정이 강하게 하기 때문에 -> 복잡한 모델

#n_estimators : weak learner 개수, 개수 많을수록 수행시간오래걸려 기본값 100

#subsample: weak learner가 학습에 사용하는 데이터 샘플링 비율. 기본값 1. 0.5는 전체 학습데이터의 50% 이용한다는 의미. 과적합이 염려되는 경우 1보다 작은 값으로 설정.

gbm을 기반으로 xgboost, lightgbm이 나왔다. 수행시간 단축된 알고리즘 등장

  • xgboost : 분류에 있어서 일반적으로 다른 머신러닝보다 뛰어난 예측 성능 나타냄.
    결손값 자체처리, 자체 내장된 교차검증, 나뭇가지치기 가능, 과적합 규제 기능있음.
    하이퍼파라미터 너무 많아. 파이썬 머신러닝 완벽가이드 231p 참고.
    from xgboost import plot_importance 로중요도 알 수 있다.

  • lightboost : xgboost보다 학습 걸리는 시간이 적다. 더 적은 멜모리를 사용한다.
    카테고리형 피처의 자동 변환과 최적 분할 가능하다.
    리프 노드가 계속 분할되면서 트리의 깊이가 깊어지므로 트리 특성에 맞는 하이퍼 파라미터 설정이 필요하다.
    하이퍼파라미터는 파이썬 머신러닝 완벽가이드 250p 참고


스태킹

여러 가지 모델의 예측 결과값을 다시 학습 데이터로 만들어서 다른모델로 재학습시켜 결과 예측한다. 즉 개별 알고리즘의 예측 결과 데이터 세트를 최종적인 메타 데이터 세트로 만들어 별도의 머신러닝 알고리즘으로 최종 학습을 수행하고 테스트 데이터 기반으로 다시 최종학습을 수행하는 방식이다. 현실 모델에 적용하는 경우는 많지 않다. 스태킹을 적용할 때는 많은 개별 모델이 필요하다. 어떤 모델먼저 쓰는지 순서 중요!





요약 : 배깅은 한번에 여러개 데이터셋에서 학습한 결과 종합하는 병렬식 앙상블, 부스팅은 오류를 수정하고 해결해나가는 순차적인 직렬식 앙상블, 여러 학습기에서 예측값으로 다시 학습데이터 만들어 일반화된 최종모델 구성하는 방법





회귀 모델

선형회귀 : 일반선형회귀, 릿지, 라쏘, 엘라스틱넷
비선형회귀 : 다항회귀
트리기반 알고리즘 : gbm, xgboost, lightgbm, 결정트리, 랜덤 포레스트
svm
스태킹 등.....











모델 불러오는데 필요한 라이브러리

from sklearn.linear_model import LogisticRegression/ C-default 1 solver=’sag’ 
from sklearn.neighbors import KNeighborsClassifier, KNeighborsRegressor
/ n_neighbors=5
from sklearn.naive_bayes import GaussianNB/var_smoothing=0.000001
from sklearn.linear_model import BayesianRidge/alpha_1, lambda_1
from sklearn.neural_network import MLPClassifier, MLPRegressor
/ hidden_layer_sizes, solver, activation
from sklearn.svm import SVC, SVR/ C=1, kernal=rbf, linear, poly, precomputed, sigmoid
from sklearn.tree import DecisionTreeClassifier, Regressor/ max_depth, max_leaf_node, min_sample_leaf
from sklearn.ensemble import RandomForestClassifier, Regressor/ n_estimators=100, max_features=auto, sqrt, log2, none
from sklearn.ensemble import VotingClassifier / estimators=[(,)] voting=’soft’, hard
from sklearn.ensemble import VotingRegressor / estimators=[(,)]
from sklearn.ensemble import BaggingClassifier, Regressor / n_estimators(부트스트랩데이터셋 수), base_estimator=모델명
from sklearn.ensemble import AdaBoostClassifier, Regressor/ n_estimators=수행횟수 
from sklearn.ensemble import GradientBoostingClassifier / learning_rate=0.1, max_depth=1

from sklearn.ensemble import StackingClassifier, Regressor/ estimators[(,)], final_estimator 

from xgboost import XGBClassifier
from lightgbm import LGBMClassifier
profile
공부한 것들을 정리하는 블로그

0개의 댓글