KT 에이블스쿨 : 머신러닝 (지도학습) 5일치 총 정리
- 데이터 전처리
- 결측치, 이상치, 제거, 가변수화 등
- 머신러닝 모델링하는 것보다 전처리가 가장 시간이 많이걸리고 성능을 좌우할만큼 중요하단걸 느낌
- 학습방법에 따른 분류 : 지도, 비지도, 강화
- 지도 : 분류, 회귀
- 비지도 : 군집화, 연관, 변환
- 과제에 따른 분류 : 분류, 회귀, 클러스터링
- 모델 선택하는 방법
- 딥러닝 : 어떤 미래의 값을 정확하게 예측해야할때 = 성능이 중요할때
- 딥러닝은 성능이 좋지만 어떻게 한건지 사람은 알수가 없어서 설명은 못함
- 머신러닝 : 비즈니스 관점으로 어떤 요소가 중요한지 설명해야할때
- 가격이 중요한지, 경쟁사 가격이 중요한지처럼 중요한 요소가 무엇인지를 알고 설명을 위해서는 성능은 떨어지지만 설명은 가능한 기본 알고리즘을 씀
- 지도학습을 선택했다면, 회귀 / 분류 선택해야함
- 수치형 변수라고 다 회귀는 아님. 연속성이 있는지를 확인하는게 중요함
- 두 값 사이에 중간값이 의미가 있는 숫자인지
- 두 값에 대한 연산결과가 의미가 있는 숫자인지
- 용어 정리
- 모델 : 데이터로 부터 패턴을 찾아 수학식으로 정리해 놓은 것
- 모델링 : 적절한 학습을 통해 오차가 적은 최적의 모델을 만드는 과정
- 모델의 목적
- 샘플(과거데이터, 표본, 부분집합)을 가지고
전체(모집단, 현재와 미래데이터)를
추정(예측/추론)하는것
- 과대적합 (과적합) : 모델의 복잡도가 높아지는것
- 학습 데이터에 대해서만 잘 맞는 모델 → 실전에서 예측 성능이 좋지 않음
- 과소적합 : 모델의 복잡도가 너무 낮아서, 단순함. 학습데이터에 대한 훈련이 안된것
A) 범주형 종속변수가 클래스 불균형일때, 균형있게 데이터를 쪼개는 것
분류문제에서 타겟값이 학습, 평가데이터 비율을 비등비등하게 하기 위해서 쓰는것
연속형 종속변수일때 평가데이터랑 학습데이터랑 비율을 동일하게 할수없는데 stratify=y를 주면 오류가남
범주값일때는 y를 주면되는데, 연속값일때는 하나밖에 있는걸 동일하게 줄 수가 없어서임
연속형일때는 stratify를 쓸 이유가 없음
2일차 - 평가지표
- 회귀 모델 평가
- from sklearn.metrics import mean_squared_error, r2_score
- 정확할 수가 없다. 잔차(오차)가 존재할거라 예상함
- 예측값이 실제값에 가까울 수록 좋은 모델임
- 예측한 값과 실제 값의 차이(=오차)로 모델 성능을 평가
- 회귀 평가지표
- SSE (sum squared error) - 오차 제곱의 합
- MSE (mean squared error) - 오차 제곱의 평균, sse을 n으로 나눈거
- RMSE (root mse) - mse는 오차의 제곱이므로 루트로 제곱을 품
- MAE (mean absolute error ) - 오차의 절대값의 평균
- MAPE (mean absolute percentage error) - mae의 퍼센트 비율
- SST = SSR + SSE : 전체 오차
- SST : (y - y평균)^ 의 합
- SSR : (y예측 - y평균)^ 의 합
- SSE : (y예측 - y)^ 의 합
- 결정계수 - R^ (R-squared) - R2 스코어
- 전체 오차 중에서 회귀식이 잡아낸 오차 비율
- 평균과 비교해서 오차를 얼마나 커버했는지 = 평균보다 나의 모델이 얼마나 좋은지
- 설명력이라고도 함. R^가 클수록 좋음. 설명력이 좋다.
- 분류 모델 평가
- from sklearn.metrics import confusion_matrix, classification_report
- 분류 모델의 결과값은 이진수임. Yes인지 No 인지~이 인지 아닌지, 2종류임
- 그래서 0을 0으로 예측했는지, 0을 1로 예측했는지 정확도를 체크가능
- 정확도 = 예측값이 실제값과 많이 같을 수록 좋은 모델
- 정확히 예측한 비율로 모델 성능을 평가
- 평가 - 혼동행렬
- 정확도 (Accuracy) : 1과 0을 정확히 예측한 비율
- 정밀도 (Precision) : 1이라 예측한 것 중에서 정말 1인 비율 (예측관점)
- 재현율 (Recall) : 실제 1인것을 1이라고 예측한 비율 (실제관점)
- 특이도 (Specificity) : 실제 Negative(TN + FP) 중에서 Negative로 예측한(TN) 비율
- F1 score : precision, recall 의 조화평균인데, 정밀도, 재현율의 값이 차이가 많이날때 보는 값
- 비즈니스 관점에서 혼동행렬 해석
- 공장에서 센서가 고장나는걸 예측하는 경우
- TP (50) : 고장나는 센서를 예측대로 알아내서, 고장이 나면 트랙 1개당 1억의 손실이라면, 50억의 손실을 막음
- FP (8) : 고장나는 센서를 예측했지만, 고장 안나는게 8개. 말짱한 센서를 고장날 거라고 예측한것. 잘못예측했지만, 1개 당 10만원 센서를 미리 바꿔서 1억 손실을 예방함
- FN (16) : 고장이 안난다고 했지만, 실제로 고장이 나는 경우. 트랙 16개로 16억의 손실이 날것임
- 80만원, 16억의 손해는 봤지만, 50억의 손실을 막았다
- 비즈니스 이익 = 50 - 16 - 80만원
혼동행렬 시각화 |
3일차 - 모델
- 회귀
- 회귀모델은 상관관계가 중요함
- 회귀계수(가중치) model.coef_
- 편향 model.intercept_
- 산점도 scatter
- 회귀선 (학습데이터에 대한 최선의 직선)
- 다중 회귀
- 다중회귀의 회귀계수
- 회귀계수가 여럿이므로 독립변수 이름과 같이 확인하기를 권고
- 다중회귀에서는 회귀선을 그리기 어려움.
- x가 많아서, 변수별 회귀계수 df으로 만들어서 시각화
- 회귀계수(변수 중요도)가 강하다고 해서, 변수의 중요도가 높다는게 아님.
linear 회귀에서는 해당 변수가 가중치가 크다는것이고, 다른 모델에서는 다르게 나타날수도 있음
- 비즈니스 상황에 따라서 다르게 해석할 필요도 있음.
- ex) 카페 매출증대와 관련해서, “기온” 중요도가 10, “전단지” 중요도가 2일때, 젤 중요도가 높은 기온은 우리가 어떻게 못함.
- ⇒ 기온보다 전단지를 더 중요하게 생각해야함.
- 비즈니스 이해가 동반되어야함
선형회귀는 변수가 많을수록 모델이 복잡해짐 = 과대적합이 발생할 확률이 커짐
회귀모델의 대표적 평가지표 : mean_squared_error, r2_score
- KNN (k 최근접 이웃)
- 회귀, 분류 가능
- 거리가 중요하므로 스케일링 필요
- 평가데이터 스케일링할때, 학습데이터를 기준으로 스케일링(정규화) 해야함
- K의 값
- k는 홀수로 설정 (짝수일때 50:50 나올수도 있으니까)
- k의 값이 클수록 모델이 단순해짐
- 회귀일땐 평균
- 분류모델일땐 최빈값 대로 결정됨 (가장 단순한 방법)
- k의 값이 작을수록 모델이 복잡해져서 과적합이 될수도 있음
- Decision Tree
- 회귀, 분류 가능
- 과적합으로 모델 성능이 떨어지기 쉬움 : 가지치기 튜닝 필요
- 의사결정트리가 반환하는 예측값
- 분류모델인 경우, 마지막 노드에 있는 샘플들의 최빈값을 예측값으로 반환
- 회귀모델인 경우, 마지막 노드에 있는 샘플들의 평균을 예측값으로 반환
- 불순도를 수치화하는 지표 : 엔트로피, 지니 불순도
- 변수 중요도 해석
- “A 변수가 해당 데이터셋에서 가장 중요하다” 는게 아니라,
“의사결정트리의 관점으로 보았을때, A 변수가 불순도를 가장 많이 줄여주었다. “ 를 의미함.
- randomforest나 다른 모델을 썼을때, 다른 변수가 중요하다고 뜰수도 있음 .
- 모델마다 다를수도있음. 같다면 정말로 중요한 변수일 수도
- 트리의 깊이를 조절하는게 max_depth 라는 하이퍼파라미터가 있음 .
- max_depth가 커지면, 모델이 복잡해짐
4일차 - 모델
- Logistic Regression 알고리즘
- 우리의 목적은 분류이나, 회귀처럼 0~1사이의 값으로 풀때 사용
- 시그노이드 함수로 0~1 범위의 확률값을 가짐
- K-분할 교차 검증
- 모든 데이터가 검증데이터로 한번, 학습에 k-1번 사용되는 것.
돌아가면서 검증데이터가 되는것
- 분할개수(cv) 가 많을수록 시간 소요가 큼
- K-분할은 x_train, y_train 데이터만을 대상으로 해야함
- 평가데이터는 그대로 두고, 학습데이터, 검증데이터를 k분활해 검증하는 것
- 모델의 성능을 미리 예측하기 위해서, k-fold로 학습데이터의 일부를 검증데이터로 때서 성능을 예측하는 것
- cross_val_score는 학습데이터 전체를 학습하는게 아니기때문에, model.fit()으로 정식 학습이 다시 필요함
- 평가는 하나의 모델만 하는데, 그 전에 여러개의 모델중 뭐가 좋은지 선발
- 하이퍼파라미터 튜닝
- KNN
- n_neighbors - k
- 거리계산법
- Decision Tree
- max_depth
- min_samples_leaf
- min_samples_split
- Search
- Grid Search : 다 돌리고 최적 뽑음
- Random Search : 랜덤 돌려서 최적 뽑음
- Random + Grid
- 1 ~ 20개 중에서 랜덤서치로 하나 선정
- 하나 선정된것의 주변 범위를 grid 서치
5일차 -앙상블
- 앙상블 : 여러 모델을 한방에 쓰는것. 모델로 이뤄진 숲
- 보팅 : 서로 다른 모델의 예측 결과를 종합해서 예측결과를 결정
- 배깅 (Bootstrap Aggregating)
-
부트스트랩으로 샘플 데이터를 만드는 것
샘플링을 하는데 중복된 값이 존재하게 하는 것 (복원추출)
-
배깅은 같은 모델들의 예측값을 집계해 최종 결과를 얻음
-
범주형 데이터 : 투표 방식으로 결과 집계
-
연속형 데이터 : 평균으로 결과를 집계
-
- 랜덤 포레스트
-
복원추출로 샘플 데이터를 100개 뽑음 (부트스트랩 샘플)
-
트리구조가 다 다르다
- 랜덤 데이터 샘플링 : 샘플데이터를 무작위로 100개 뽑음
- feature를 랜덤하게 선정 : 각각의 샘플 데이터마다 무작위로 뽑은 n개의 feature로 서로 다른 트리를 만듦
1개의 트리만을 볼때는 학습데이터에 과적합이 발생할 수 있는데,
100개 각각의 트리를 종합하면 과적합은 발생하지 않음
- 부스팅
-
대표적인 부스팅 알고리즘: XGBoost, LightGBM
sklearn에 속해있는 알고리즘이 아님.
그래서, 타깃에 문자열이 있으면 안됨. 다른걸로 변환해야함
-
앞의 모델이 예측하지 못한걸 계속 해서 오차 개선시킴
XGBoost : gradient boost (GBM)알고리즘을 병렬학습 가능하도록 구현한 것
- 결측치 알아서 처리해줌
- 주요 하이퍼파라미터 : n_estimators, max_death
-
스태킹 (Stacking)
여러 알고리즘이 예측한 값을 feature로 사용해 최종 예측함
- KNN, 로지스틱 회귀, XGBoost 모델 등 기본모델 4개 이상을 선택하고
각 모델별 예측값을 구한 후,
이 예측 값을 최종 모델의 학습 데이터로 사용하는 것
- 현실모델에서 많이 안씀. 대회에서 꽤 씀
댓글
댓글 쓰기