선릉역 1번 출구
3-3 본문
선형 회귀는 하나의 특성을 사용해서 훈련 시키는 것이고 다항 회귀는 비선형일 때 비선형 데이터를 학습시키기 위해 선형 모델을 활용하는 것이다.
다항 회귀와 다중 회귀가 많이 헷갈리는 데 다항 회귀는 독립 변수 x의 차수를 높이는 것이고 다중 회귀는 독립 변수 x1, x2, .. 다중의 독립 변수가 쓰이는 것을 말한다.
즉 여러 개의 특성을 사용한 선형 회귀를 다중 회귀(multiple regression)라고 한다.
기존의 특성을 사용해 새로운 특성을 뽑아내는 작업을 특성 공학(featurn engineering)이라고 한다.
import pandas as pd df = pd.read_csv('https://bit.ly/perch_csv_data') perch_full = df.to_numpy() import numpy as np perch_weight = np.array([5.9, 32.0, 40.0, 51.5, 70.0, 100.0, 78.0, 80.0, 85.0, 85.0, 110.0, 115.0, 125.0, 130.0, 120.0, 120.0, 130.0, 135.0, 110.0, 130.0, 150.0, 145.0, 150.0, 170.0, 225.0, 145.0, 188.0, 180.0, 197.0, 218.0, 300.0, 260.0, 265.0, 250.0, 250.0, 300.0, 320.0, 514.0, 556.0, 840.0, 685.0, 700.0, 700.0, 690.0, 900.0, 650.0, 820.0, 850.0, 900.0, 1015.0, 820.0, 1100.0, 1000.0, 1100.0, 1000.0, 1000.0]) from sklearn.model_selection import train_test_split train_input, test_input, train_target, test_target = train_test_split(perch_full, perch_weight, random_state = 42) //데이터 준비 |
사이킷런에서는 변환기(transformer)라고 불리는 특성을 만들거나 전처리하는 클래스가 있다.
from sklearn.preprocessing import PolynomialFeatures poly = PolynomialFeatures() poly.fit([[2,3]]) print(poly.transform([[2,3]])) |
*fit()을 해야 transform()이 가능하고 이 둘을 이어붙인 fit_transform 메서드도 존재한다.
PolynomialFeatures 클래스는 기본적으로 각 특성을 제곱한 항을 추가하고 서로 곱한 항을 추가한다. 1은 include_bias=False로 없앨 수 있다.
poly = PolynomialFeatures(include_bias=False) poly.fit(train_input) train_poly = poly.transform(train_input) print(train_poly.shape) // (42, 9) |
9가 나온 이유는 3가지 특성을 제곱한 값(3) + 서로 곱한 값(3) + 원래의 값(3)이기 때문이다. ->get_featurn_names()메서드를 사용해 확인이 가능함
from sklearn.linear_model import LinearRegression lr = LinearRegression() lr.fit(train_poly, train_target) print(lr.score(train_poly, train_target)) // 0.9903183436982124 print(lr.score(test_poly, test_target)) // 0.9714559911594132 |
과소적합 문제는 나타나지 않았다. 그렇다면 특성을 늘리면 어떻게 될까?
poly = PolynomialFeatures(degree = 5, include_bias=False) // 5제곱 까지 만듦 poly.fit(train_input) train_poly = poly.transform(train_input) print(train_poly.shape) test_poly = poly.transform(test_input) from sklearn.linear_model import LinearRegression lr = LinearRegression() lr.fit(train_poly, train_target) print(lr.score(train_poly, train_target)) // 0.9999999999991096 print(lr.score(test_poly, test_target)) // -144.40579242335605 |
특성의 개수를 늘리면 선형 모델이 너무 강력해져 과대적합의 문제가 발생하게 된다.
규제(regularization)를 사용해서 이를 해결하자.
규제는 모델이 훈련 세트를 너무 과도하게 학습하지 못하게 막는 것이다. 선형 회귀 모델의 경우 특성에 곱해지는 계수(기울기)의 크기를 작게 만드는 것을 말한다.(이때 특성의 스케일이 정규화되어야 함)
선형 회귀 모델에 규제를 추가한 모델에는 릿지(ridge)와 라쏘(lasso)가 있다.
릿지 회귀는 계수를 제곱한 값을 기준으로 규제를 적용하고, 라쏘는 계수의 절댓값을 기준으로 규제를 적용한다.
이 두 모델 모두 규제의 양을 임의로 조절할 수 있는데 alpha 매개변수를 통해 이루어진다. 그리고 이 alpha 매개변수는 사전에 우리가 지정해야하는 값으로 하이퍼파라미터라고 부른다.