혼공단/혼공단 5기

혼자 공부하는 머신러닝 + 딥러닝 3장 - 특성 공학과 규제

하양훈 2021. 2. 4. 19:46
반응형

1. 다중회귀

 

- 다중회귀 : 여러개의 특성을 사용한 선형회귀

선형회귀, 다항회귀, 다중회귀 차이(선형회귀는 이를 모두 포함하는 의미이다)

- 특성공학 : 기존의 특성을 사용해 새로운 특성을 뽑아내는 작업

Ex) 특성이 a,b,c 인경우 특성공학을 이용하면 a^2, ab, abc 등의 특성을 만들 수 있다.

 

<변환기>

 

- 사이킷런에서 특성을 만들거나 전처리 하기 위한 다양한 클래스

- 변환기 클래스에서는 모두 fit(), transform()을 제공한다.

Ex) PolynomialFeatures 클래스로 만들어본 특성을 가진 샘플들

from sklearn.processing import Polynomial Features

poly = PolynomialFeatures()
poly.fit([[2,3]])
print(poly.transform([[2,3]]))

>> [[1. 2. 3. 4. 6. 9.]]

 

- PolynomialFeatures 클래스는 기본적으로 각 특성을 제곱한 항(위에선 4,9)을 추가하고 특성끼리 서로 곱한항(위에선 6)을 추가한다.

- 1이 추가된 이유는 선형방정식의 절편 때문이다. 선형 방정식의 절편은 항상 값이 1인 특성과 곱해지는 계수이기 때문에 특성에 1이 추가되었다.

- 하지만 사이킷런의 선형 모델은 자동으로 절편을 추가하므로, 굳이 특성을 이렇게 만들 필요가 없다. 이를 해결하기 위해선 include_bias = False를 지정하면 된다.

 

poly = PolynomialFeatures(include_bias=False)
poly.fit([[2,3]])
print(poly.transform([[2,3]]))

>> [[2. 3. 4. 6. 9.]]

 

 

2. 규제

 

- 규제 : 머신러닝 모델이 훈련세트를 너무 과도하게 학습하지 못하도록 훼방하는 것.

- 선형 회귀 모델의 경우에는 특성에 곱해지는 계수의 크기를 작게 만드는 일을 말함.

 

- 일반적으로 선형 회귀 모델에 규제를 적용할때 계수 값의 크기가 많이 다르면 공정하게 제어 되지 않음 => 규제를 적용하기 전에 먼저 정규화를 실행해야 함.(사이킷런에서 제공하는 StandardScaler클래스 활용)

from sklearn.preprocessing import StandardScaler

# StandardSclaer 클래스의 객체 ss 초기화
ss = StandardScaler()

# train_poly로 객체 훈련(반드시 훈련 세트로 학습한 변환기를 사용해 테스트 세트까지 변환해야함)
ss.fit(train_poly)
train_scaled = ss.transform(train_poly)
test_scaled = ss.transform(test_poly)

 

- 선형 회귀 모델에 규제를 추가한 모델을 릿지(ridge)와 라쏘(lasso)라고 부름.

- 릿지와 라쏘 모두 sklearn.linear_model 패키지 안에 존재함.

 

<릿지회귀>

 

- 계수를 제곱한 값을 기준으로 규제를 적용함.

from sklearn.linear_model import Ridge
ridge = Ridge()
ridge.fit(train_scaled,train_target)
print(ridge.score(train_scaled, train_target)
>> 0.9896XX..

 

<라쏘회귀>

 

- 계수의 절댓값을 기준으로 규제를 적용함.

from sklearn.linear_model import Lasso
lasso = Lasso()
lasso.fit(train_scaled,train_target)
print(lasso.score(train_scaled, train_target)
>> 0.9800XX..

 

- 라쏘 모델은 계수 값을 아예 0으로 만들 수 있다. 따라서 라쏘모델의 계수가 0인 값을 종합해서 유용한 특성을 골라내는 용도로 사용할 수 있다.

print(np.sum(lasso.coef_==0))

 

<하이퍼 파라미터>

 

- 머신러닝 모델이 학습할 수 없고 사람이 알려줘야 하는 파라미터

- 릿지와 라쏘모델을 사용할때 규제의 양을 alpha를 사용해 임의로 조절할 수 있는데, 여기서 alpha가 하이퍼 파라미터에 해당된다.

(참고) 혼자 공부하는 머신러닝에서는 함수와 클래스의 파라미터는 매개변수, 모델과 관련된 파라미터는 파라미터라고 표현했다고 한다.

 

#alpha값에 따른 릿지와 라쏘 score 변화 그래프
import matplotlib.pyplot as plt

ridge_train_score = []
ridge_test_score = []
lasso_train_score = []
lasso_test_score = []

alpha_list = [0.001,0.01,0.1,1,10,100]

#릿지 모델 테스트
for alpha in alpha_list:
	ridge = Ridge(alpha=alpha)
    ridge.fit(train_scaled,train_target)
    ridge_train_score.append(ridge.score(train_scaled,train_target)
    ridge_test_score.append(ridge.score(test_scaled,test_target)

plt.plot(np.log10(alpha_list),ridge_train_score)
plt.plot(np.log10(alpha_list),ridge_test_score)

#라쏘 모델 테스트
for alpha in alpha_list:
	lasso = Lasso(alpha=alpha)
    lasso.fit(train_scaled,train_target)
    lasso_train_score.append(lasso.score(train_scaled,train_target)
    lasso_train_score.append(lasso.score(test_scaled,test_target)

plt.plot(np.log10(alpha_list),lasso_train_score)
plt.plot(np.log10(alpha_list),lasso_test_score)

 

 

<전체 소스 코드>

링크 : https://bit.ly/hg-03-3

반응형