선릉역 1번 출구

3-3 본문

Computer/AI

3-3

choideu 2021. 7. 8. 16:05

선형 회귀는 하나의 특성을 사용해서 훈련 시키는 것이고 다항 회귀는 비선형일 때 비선형 데이터를 학습시키기 위해 선형 모델을 활용하는 것이다.

다항 회귀와 다중 회귀가 많이 헷갈리는 데 다항 회귀는 독립 변수 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.932.040.051.570.0100.078.080.085.085.0110.0,
       115.0125.0130.0120.0120.0130.0135.0110.0130.0,
       150.0145.0150.0170.0225.0145.0188.0180.0197.0,
       218.0300.0260.0265.0250.0250.0300.0320.0514.0,
       556.0840.0685.0700.0700.0690.0900.0650.0820.0,
       850.0900.01015.0820.01100.01000.01100.01000.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 매개변수는 사전에 우리가 지정해야하는 값으로 하이퍼파라미터라고 부른다.

 

'Computer > AI' 카테고리의 다른 글

4-1  (0) 2021.07.13
자연어 처리-1  (0) 2021.07.10
3-2  (0) 2021.07.08
3-1  (0) 2021.07.08
2  (0) 2021.07.07
Comments