ML_AI/24_여름방학 인공지능 스터디

[교재] 3. 회귀 알고리즘과 모델 규제 (2)

안정민 2024. 7. 9. 20:15

3-3 특성 공학과 규제

1. 다중회귀

-다항회귀와 구분

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

-다항회귀는 계수의 문제, 다중회귀는 차원의 문제

 

-특성공학 (feature engineering) : 기존의 특성들을 이용해서 새로운 특성을 뽑아내는 것

-기존에 가지고 있던 [농어길이] 특성과 [농어높이] 특성을 활용해 이 둘을 곱하여 새로운 특성을 창출

-사이킷런에서는 이를 위한 다양한 모듈과 함수들을 제공하고 있음

 

 

2. 데이터 준비

- 이전과 다르게 데이터의 특성이 3개로 늘어났기 때문에 데이터를 복사해 붙여넣는 것도 어려움, 넘파이는 이러한 기능을 제공하지 않기 때문에 판다스 라이브러리를 활용

-판다스(Pandas) 라이브러리는 데이터 분석 라이브러리로, 데이터프레임 (dataframe)을 핵심 데이터 구조로 가진다.

-넘파이보다 더 많은 기능을 제공하며, 데이터프레임은 넘파이 배열로 to_numpy() 함수를 활용해 쉽게 바꿀 수도 있다.

import pandas as pd

df = pd.read_csv('https://raw.githubusercontent.com/rickiepark/hg-mldl/master/perch_full.csv')
perch_full = df.to_numpy()
print(perch_full)

 

 

3. 사이킷런의 변환기

- 변환기 (transformer) : 특성을 만들거나 전처리하기 위하여 사이킷런에서 제공하는 다양한 클래스

- 사이킷런 모델 클래스에 일관된 fit(), score(), predict() 메서드가 있는 것처럼 변환기 클래스는 모두 fit(), transform() 메서드를 제공한다.

- Polinominal Features 클래스 : sklearn.preprocessing 패키지에 포함되어있다.

from sklearn.preprocessing import PolynomialFeatures

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

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

 

- fit() 메서드는 새롭게 만들 특성 조합을 찾고, transform() 메서드는 실제로 데이터를 변환한다.

- 변환기는 입력데이터를 변환하는 데에 타깃데이터가 필요하지 않음, 따라서 모델 클래스와 다르게 fit() 메서드에 입력데이터만 전달하였다

- 위의 코드의 경우 2개의 특성을 가진 샘플이 6개의 특성을 가진 샘플로 바뀌었다.

- PolynominalFeatures 클래스는 기본적으로 각 특성을 [제곱] 한 항을 추가하고 특성끼리 [서로 곱한 값]의 항을 추가한다

-2와 3을 제곱한 4와 9, 두 특성을 곱한 6이 추가

-그럼 왜 1이 추가되었는가? -> 1은 절편값, include_bias = False 로 지정하여 포함이 되지 않게 할 수 있음

from sklearn.preprocessing import PolynomialFeatures

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

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

 

- get_feature_names_out()의 메서드를 통해 fit을 통해서 새롭게 생성된 특성들이 각각 어떤 입력의 조합으로 만들어졌는지 알 수 있다.

 

 

4. 다중회귀모델 훈련하기

- 다중회귀모델을 훈련하는 것은, 선형회귀모델을 훈련하는 것과 같으나, 다만 여러 개의 특성을 활용하여 선형 회귀를 수행하는 것일 뿐이다.

-따라서 LinearRegression 클래스를 임포트하고 앞에서 만들 train_poly를 사용하여 모델을 훈련시킨다.

from sklearn.linear_model import LinearRegression

lr = LinearRegression()
lr.fit(train_poly, train_target)
print(lr.score(train_poly, train_target))
print(lr.score(test_poly, test_target))

>> 0.9903183436982125

>> 0.9714559911594111

 

-테스트세트에 대한 점수는 높아지지 않았으나, 과소적합 문제는 더이상 보이지 않는다.

 

-PolynominalFeatures 클래스의 degree 매개변수를 사용하여 필요한 고차항의 최대차수를 지정할 수 있다

poly = PolynomialFeatures(degree=5, include_bias=False)

 

- 특성의 개수를 늘리면 선형 모델은 훈련 세트에 대해 거의 완벽하게 학습할 수 있게 되기 때문에 아주 강력해진다

-그러나 이런 모델은 훈련 세트에 너무 과대적합되므로 테스트세트에서는 형편없는 점수를 만든다.

 

 

5. 규제

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

-즉, 모델이 훈련세트에 과대적합되지 않도록 하는 과정이다.

 

 

 

 

 

6. 릿지 회귀

-

 

 

 

 

 

 

 

 


**핵심 패키지와 함수

패키지 함수 설명
pandas read_csv() csv 파일에 저장된 데이터를 읽고 데이터 프레임을 만들어 줌
  to_numpy() 전달된 데이터프레임을 넘파이 배열로 바꾸어주는 메서드
sklearn.preprocessing. PolynominalFeatures fit() 새롭게 만들 특성 조합을 찾는다
기본적으로 각 특성을 [제곱] 한 항을 추가하고 특성끼리 [서로 곱한 값]의 항을 추가
  get_feature_names_out() fit을 통해서 새롭게 생성된 특성들이 각각 어떤 입력의 조합으로 만들어졌는지 알려준다.
  transform() fit() 메서드를 통해 찾은 특성 조합으로 실제로 데이터를 변환