IT/ML
[Machine Learning] 다항 회귀(Polynomial regression)
aram
2022. 12. 13. 01:21
다항 회귀(Polynomial regression) ; 선형 회귀
- 독립변수의 단항식이 아닌 2차, 3차 방정식과 같은 다항식으로 표현
- 독립 변수와 종속 변수가 선형 관계가 아닌 경우 적용할 수 있는 회귀분석 모델
- 선형 모델을 사용하여 비선형 데이터 집합을 모델링
- 데이터 포인트가 비선형 방식으로 존재할 때 사용
- 곡선의 다항식 선을 사용하여 최적적합을 수행
- 과대적합으로 나타나기 쉬움 > 이상치를 피하기 위해서는 끝 부분의 곡선을 분석하는 것이 좋다.
# 사이킷런은 다항 회귀 역시 선형 회귀이기 때문에 비선형 함수를 선형 모델에 적용시키기 위해 피처를 다항식으로 변환하는 클래스 제공 ?
== PolynomialFeatures
- PolynomialFeatures 클래스를 통해 피처를 Polynomial(다항식) 피처로 변환
- degree 파라미터를 통해 입력 받은 단항식 피처를 degree에 해당하는 다항식 피처로 변환
- 다항식의 차수가 높아질수록 매우 복잡한 피처 간의 관계까지 모델링 가능
- 다항 회귀의 차수(degree)를 높일수록 학습 데이터에만 너무 맞춘 학습이 이뤄져서 정작 테스트 데이터 환경에서는 오히려 예측 정확도가 떨어짐(=과적합)
- 좋은 예측 모델 == 학습 데이터의 패턴을 잘 반영하면서도 복잡하지 않은 균형 잡힌(Balanced) 모델 의미
교차 특성 처리
- 타킷 변수에 영향을 미치면서 다른 특성에 의존하는 특성
- 타깃 변수에 대한 특성의 영향이 부분적으로 또 다른 특성에 의존
- 두 특성값의 곱을 포함하는 새로운 특성을 포함시켜 상호 작용을 나타낼 수 있음
- PolynomialFeatures를 사용해 특성의 모든 조합에 대한 교차항을 만든 다음 모델 선택 전략을 사용해 최선의 모델을 만드는 특성 조합과 교차항을 찾음(의존성 찾음)
- interaction_only=True : 교차항만 반환
- include_bias=True(기본) : PolynomialFeatures를 절편이라고 부르는 1로 채워진 특성 추가
- include_bias=False : 절편 1로 채워진 특성 추가x
from sklearn.linear_model import LinearRegression
from sklearn.datasets import load_boston
from sklearn.preprocessing import PolynomialFeatures
import numpy as np
# 데이터를 로드하고 두 개의 특성만 선택
boston = load_boston()
features = boston.data[:, 0:2]
target = boston.target
#교차항
interaction = PolynomialFeatures(degree=3, include_bias=False, interaction_only=True)
features_interaction = interaction.fit_transform(features)
regression = LinearRegression() # 선형 회귀 모델 객체 생성
model = regression.fit(features_interaction, target) # 선형 회귀 모델 훈련
features[0] # 첫 번째 샘플의 특성 값을 확인
#array([6.32e-03, 1.80e+01])
# 각 샘플에서 첫 번째와 두 번째 특성을 곱합니다.
interaction_term = np.multiply(features[:, 0], features[:, 1])
interaction_term[0] # 첫 번째 샘플의 교차 항을 확인.
### 0.11376
features_interaction[0] # 첫 번째 샘플의 값을 확인
### array([6.3200e-03, 1.8000e+01, 1.1376e-01])
#차수 3인 polinomial
from sklearn.preprocessing import PolynomialFeatures
poly = PolynomialFeatures(degree=3, include_bias=False)
poly_features = poly.fit_transform(X)
X_train2, X_test2, y_train2, y_test2 = train_test_split(poly_features,Y,test_size=0.2,random_state=99)
poly_reg = LinearRegression()
poly_reg.fit(X_train2, y_train2)
y_pred2 = poly_reg.predict(X_test2)
print('Polynomial Regression R-square : ' , r2_score(y_test2, y_pred2))
## Polynomial Regression R-square: -60.569535992639175
print('Polynomial Regression MSE : ' , mean_squared_error(y_test2, y_pred2))
## Polynomial Regression MSE: 359482.2200678169
* 내용참고&출처 : 태그에서 수강한 수업을 복습 목적으로 정리한 내용입니다.
728x90