본문 바로가기
코딩/Machine Learning

9. 회귀(Regression)_2

by 세자책봉 2021. 1. 1.
728x90

권철민 저, '파이썬 머신러닝 완벽 가이드', 2019.02.28

내 맘대로 요약 공부 중(문제시 비공개 및 삭제)

최초 작성일 2021.1.1

9.1 다항 회귀와 과적합/과소적합

- 독립변수(feature)와 종속변수(target)의 관계가 일차방정식(단항식)이 아닌, 2차, 3차 등 다항식으로 표현되는 회귀

- Y = a + bX1 + cX2 + dX1X2 …(Y: 종속변수 / X1, X2: 독립변수 / a, b, c, d: 회귀계수)

- 다항 회귀는 선형 회귀임!

- 회귀에서 선형/비선형을 나누는 기준은 회귀 계수가 선형/비선형인지에 따름(독립변수의 선형/비선형과 무관)

- sklearn은 다항 회귀를 위한 클래스는 없으므로, 비선형 함수를 선형 모델에 적용시키는 방법을 사용

- sklearn의 PolynomialFeatures 클래스 활용, Polynomial(다항식) 피처로 변환

[x1, x2] -> [1, x1, x2, x1^2, x1*x2, x2^2] / 단항식을 다항식으로 변환
삼차식 계수로 변환

- ①일차 단항식 계수를 삼차 다항식 계수로 변환하고,이를 선형 회귀에 적용하면 다항 회귀로 구현

이런식의 코드진행. 위는 단순 예시임

- sklearn의 Pipeline 객체를 활용하여 한번에 다항 회귀를 구현할 수 있음

Pipeline의 단계 중 원하는 속성을 고를 때 named_steps['속성']을 사용

9.2 과소적합 및 과적합(Feat. 다항 회귀)

- 다항식의 차수가 높아질수록 과적합 문제가 심함

- 차수가 높아질수록 학습 데이터에만 의존하기 때문

- 학습 데이터: 30개의 임의의 데이터 X, target: y

과소적합, 과적합의 예시 코드

- 다항식 차수별(1, 4, 15) 예측 결과 비교

- cross_val_score, MSE 계산을 통한 성능 비교

어려운 코드는 없으니 흐름을 파악하자
실선 = 회귀, 점선 = 실제 데이터 세트의 곡선, scatter = 데이터 샘플

- 맨 오른쪽, 15차수 회귀 예측을 할 경우 심하게 과대적합되어 MSE값이 비정상적으로 크고 예측 그래프가 다름

- 적정 차수의 회귀 예측 필요(실제 회귀할 때도 5차~6차 이상 넘어가면 과대적합 되는경우가 많음)

 

- 편향-분산 트레이드오프(Bias-Variance Trade off)

- Degree1: 고편향(High Bias), Degree15: 고분산(High Variance)

출처: https://zetawiki.com/wiki/%ED%8C%8C%EC%9D%BC:Bias-variance-tradeoff-0.png

- 일반적으로 편향과 분산은 반비례관계로 한쪽이 높으면 한 쪽이 낮아지는 경향

- 편향이 높으면 전체 오류가 높음

- 편향이 낮으면 분산이 높아지고 전체 오류가 낮아짐

- 편향이 Optimal 지점을 넘어서 더 낮아지면 전체 오류가 증가함

- 즉, 편향과 분산이 서로 트레이드오프를 유지하며 오류 값이 최소가 되는 모델을 만드는 것이 중요

 

9.3 규제(Regularization) 선형 모델 - 릿지, 라쏘, 엘라스틱넷

- 회귀 모델은 데이터에 적합해야 하며, 회귀 계수가 지나치게 커지는 것을 주의해야 함(고편향 방지)

- 비용 함수는 RSS(실제 값과 예측값의 차이)를 최소화하며 회귀계수 크기를 제어해야 함

- 비용함수 목표 = Min(RSS + alpha*|W|)

- alpha를 조절함으로써 회귀 계수의 크기(|W|)를 조절할 수 있음 → 규제(Regularization)

- L1 규제 alpha*|W|^2에 페널티를 부여하는 방식(라쏘)

- L2 규제 alpha*|W|에 패널티를 부여하는 방식(릿지)

- L1 규제 + L2 규제 → 엘라스틱넷

① L2규제(릿지 Ridge)

- sklearn의 Ridge

alpha=10
alpha값에 따른 평균 RMSE값, alpha:100일 때 가장 좋다

- alpha값의 변화에 따른 피처의 회귀 계수 값 시각화(회귀 계수를 Ridge의 coef_ 속성 추출하여 Series화)

alpha값의 변화에 따라 Ridge 수행, 수행결과의 회귀계수들을 Series화, 내림차순, 막대그래프화

- alpha값을 증가시킬수록 NOX 피처의 회귀 계수가 작아지는 것을 확인

alpha값에 따른 회귀 계수값의 수치화

- L2 규제의 한가지 특징적인 것은 회귀 계수를 0으로 만들지 않는다는 것

 

② L1규제(라쏘 Lasso)

- L2 규제와 다르게 불필요한 회귀 계수는 0으로 만들고 제거, 즉 적절한 피처만 선택

- alpha값을 변화시키며 RMSE와 각 피처의 회귀 계수를 확인

- sklearn의 Lasso

- get_linear_reg_eva()

- 입력: 회귀모델의 이름,  alpha 리스트, 피처 데이터 세트, target 데이터 세트

- 출력: alpha값에 따른 RMSE 출력, 회귀계수 DataFrame화

규제방법별 함수화
alpha=0.07일 때 가장 좋은 RMSE(작을수록 좋음)

③ L1+L2규제(엘라스틱넷, ElasticNet)

- L1규제의 상관관계가 높은 피처를 제외한 나머지는 0으로 바꾸고, 회귀 계수의 급변을 방지하기 위해 L2규제를 적용

- 유일한 단점은 수행시간이 길다는 것

- sklearn의 ElasticNet(주요 파라미터: alpha = a + b, l1_ratio = a / (a + b))

- ElasticNet의 규제는 a*L1 + b*L2로 정의(a: L1의 alpha, b: L2의 alpha)

- 예제에서는 l1_ration는 0.7로 고정

alpha=0.5일 때 RMSE 최소

- 선형 회귀 모델을 위한 데이터 변환(데이터 스케일링 및 정규화)

  1. StandardScaler 클래스를 이용해 평균이 0, 분산이 1인 표준 정규화 수행
  2. MinMaxScaler 클래스를 이용해 최솟값이 0, 최댓값이 1인 정규화 수행
  3. 1,2번 후 성능 향상이 없을 경우 다시(Re) 다항 특성을 적용하여 데이터 변환
  4. 로그 변환, 원래 값에 log 함수를 적용 (실제 선형 회귀에서 대부분 쓰임)

- get_scaled_data()

- 입력: 스케일링/정규화 method 인자 선택(StandardScaler, MinMaxScaler, Log), 차수(degree)

언더 플로우를 방지하기 위하여 1+log() 식을 사용
데이터 변환 모델별 알파값의 변화에 따른 성능 비교

- alpha:0.1 → Log None, alpha:1 → MinMax 2, alpha:10 → Log None, alpha:100 → Standard 2

- 일반적으로 데이터 분포가 심하게 왜곡되어 있을 경우 로그 변환을 추천

9.4 로지스틱 회귀(Logistic Regression)

- 시그모이드(Sigmoid) 함수의 최적선을 찾아 반환 값을 확률로 표현 및 결정

- 선형 회귀 방식을 기반으로 시그모이드 함수를 이용해 분류를 수행

- 시그모이드 함수( y = 1/(1+e^(-x))

출처: https://ko.wikipedia.org/wiki/%EC%8B%9C%EA%B7%B8%EB%AA%A8%EC%9D%B4%EB%93%9C_%ED%95%A8%EC%88%98

- 항상 0~1 사이 값을 반환

- 위스콘신 유방암 데이터를 활용하여 암 여부 판단(분류)

데이터 준비
기본 데이터를 활용했지만 정확도가 높은 편..

- 규제를 적용하여 최적의 파라미터를 찾아보자(GridSearchCV 활용)

GridSearchCV의 penalty는 규제를 뜻함

 

반응형

'코딩 > Machine Learning' 카테고리의 다른 글

11. 차원 축소(Dimension Reduction)  (0) 2021.01.03
10. 회귀(Regression)_3  (0) 2021.01.02
8. 회귀(Regression)_1  (0) 2020.12.27
7. 분류(Classification)_3  (0) 2020.12.13
6. 분류(Classification)_2  (0) 2020.12.13

댓글