본문 바로가기
[파이썬]/머신러닝

[머신러닝] 특성공학을 활용한 다중회귀모델 성능 향상(+예제, 해석, 개념)

by sung min_Kim 2023. 12. 24.


 이번 글에서는 "다중회귀모델에 특성공학을 적용하여 성능 향상을 도모하는 과정"에 대해 다루어 보고자 한다. 새로운 특성을 도출해 내는 특성공학을 통해 독립변수를 생성하고, 이를 다중회귀모델에 학습시킴으로써 모델 성능의 향상을 확인해 보고자 한다.

 차례와 사용 툴 및 라이브러리는 아래와 같다.

 [차례]

 첫 번째: 다중회귀모델과 특성공학
 두 번째: (예제)  농어의 길이, 두께, 높이 값을 이용해서, 무게 예측하기
 
(단, 예제 내부는 크게 다중회귀모델 - 특성공학 - 다중회귀모델 순으로 구성)
 세 번째: 다중회귀모델 추가 학습 - 특성공학 적용 후 다중회귀모델 성능 검증

 [순서]
1. 데이터 불러오기
2. 데이터 전처리
 - (독립변수로 사용할) 원본 데이터를 numpy 배열로 변환 
 - (종속변수로 사용할) 원본 데이터를 numpy 배열로 변환
 - 훈련 및 테스트 데이터 세트로 분리
 - 특성 추가 및 확인
3. 모델 구축
4. 모델 훈련(학습)
5. 모델 성능 평가
 - 훈련 및 테스트 데이터 세트의 결정계수 확인
6. 모델 예측
 - 테스트 데이터 입력을 통한 예측
7. 모델 예측 성능 평가
실제 값과 예측 값 사이의 절대평균오차(MAE)를 계산하여 모델의 예측 성능 평가
- 다중회귀모델의 테스트 결정계수를 높이기 위해 특성공학 적용


 [사용 툴]
- Jupyter notebook(웹 기반 대화형 코딩 환경)
 
 [사용 라이브러리 및 모듈]

  • 데이터 분석 라이브러리: pandas
  • 연산 라이브러리: numpy
  • 머신러닝 라이브러리 및 모델: scikit-learn
    - sklearn.linear_model.LinearRegression: 회귀모델 생성
    - sklearn.model_selection.train_test_split: 훈련 및 테스트 데이터 세트 분리
    - sklearn.metrics.mean_absolute_error: 평균절대오차(MAE) 측정
    - sklearn.preprocessing.PolynomialFeatures: 다항 특성 생성

다중회귀모델과 특성공학

 

 다중회귀모델(MR; Mutiple Regression)


 다중회귀모델은 여러 개의 독립변수, 즉 '특성'들을 활용하여 하나의 종속변수를 예측하는 모델이다. 이 특성들은 예를 들어 생선의 '길이', '두께', '높이' 등이 될 수 있다. 이와 같이 여러 특성들을 활용하면, 각각의 특성이 생선의 '무게'에 어떤 영향을 미치는지 더욱 정확하게 파악할 수 있다. 그런데 이때 중요한 것이 바로 '특성공학'이다.

 

특성공학


 특성공학은 기존의 특성을 변형하거나, 새로운 특성을 생성하여 모델의 성능을 향상시키는 과정을 말한다. 예를 들어, '길이', '두께', '높이'를 각각 독립변수로 활용하는 대신, 이 세 가지 특성을 조합하여 '생선의 체적'이라는 새로운 특성을 생성할 수 있다. 이렇게 새로운 특성을 생성하면, 다중회귀모델의 예측 성능을 더욱 향상시킬 수 있다.

 하지만, 이때 주의해야 할 점은, 특성들이 서로 강한 상관관계를 가지면 '다중공신성' 문제가 발생할 수 있다는 것이다. 예를 들어, 생선의 '길이'와 '높이'가 서로 강한 상관관계를 가진다면, 이 두 특성을 동시에 모델에 넣어주는 것은 문제를 일으킬 수 있다. 왜냐하면, 독립변수들 간의 상관관계 때문에 각 독립변수의 계수(가중치)를 정확하게 추정하기 어렵기 때문 모델의 예측 성능을 저하시키기 때문이다. 이런 경우, 두 특성 중 하나만 선택하거나, 두 특성을 조합한 새로운 특성을 생성하는 등의 방법을 사용할 수 있다. 

 이렇게 다중회귀모델, 특성, 그리고 특성공학은 서로 밀접하게 연관되어 있다. 모델의 성능을 최대한 높이기 위해서는 이 세 요소를 모두 잘 활용해야 한다.

 


예제: 농어의 길이, 두께, 높이 값을 이용해서 무게 예측하기

다중회귀모델

 

1. 데이터 불러오기
import pandas as pd

file_path = "./data/03_농어의_길이_높이_두께_데이터.csv"
df = pd.read_csv(file_path)

df.info()
df.describe()

df - 결측치, 이상치 확인

 

2. 데이터 전처리
2.1 (독립변수로 사용할) 원본 데이터를 numpy 배열로 변환


 pandas 라이브러리의 to_numpy 함수를 사용하여 원본 데이터프레임(df)의 모든 열이 동일한 데이터 타입을 가질 경우, 원본 데이터를 공유하는 numpy 배열을 반환한다. 이를 통해, numpy 배열은 원본 데이터와 메모리 상에서 같은 위치에 저장된 데이터를 공유하게 된다.

 numpy 라이브러리의 array 함수 또한 원본 데이터프레임을 numpy 배열로 변환할 수 있으나, 공유의 개념이 아닌 새로운 배열을 생성하여, 원본 데이터와 별도의 메모리 공간에 저장된다. 즉, 데이터가 복사되어 메모리 사용량이 증가할 수 있다.

 numpy 배열로 변환된 데이터는 통계 계산, 선형 연산 등 다양한 수학적 연산을 지원하는 함수를 활용할 수 있고, 다차원의 데이터를 쉽게 처리할 수 있게 된다.

perch_full = df.to_numpy()
perch_full.shape

차원 확인

 

  • shape 속성을 활용하여 독립변수로 사용할 데이터의 numpy 배열 차원을 확인한 결과, 이는 '56'개의 행과 '3'개의 열(특성)로 구성된 2차원의 배열임을 확인하였다.

 

2.2 (종속변수로 사용할) 원본 데이터를 numpy 배열로 변환


 numpy 라이브러리의 array 함수를 사용하여 종속변수로 사용할 '무게' 데이터를 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]
                         )

perch_weight.shape

차원 확인

 

  • shape 속성을 활용하여 종속변수로 사용할 데이터의 numpy 배열 차원을 확인한 결과, 이는 '56'개의 행으로 구성된 1차원의 배열임을 확인하였다. 이때 독립변수와 종속변수의 행의 갯수는 동일해야 한다.

 

2.3 훈련 및 테스트 데이터 세트로 분리하기 


 'train_test_split'
 함수를 사용하여 원본 데이터를 훈련 데이터와 테스트 데이터 세트로 분리한다. 해당 함수에는 독립변수(길이&두께&높이), 종속변수(무게), 훈련 및 테스트 데이터의 비율(70:30), 그리고 랜덤 규칙을 인자로 전달한다. 이를 통해, 입력된 독립변수와 종속변수가 랜덤 하게 섞인 후 지정된 비율에 따라 훈련 데이터와 테스트 데이터로 분리되어, 모델 학습과 성능 평가에 사용된다.

from sklearn.model_selection import train_test_split

train_input, test_input, train_target, test_target = train_test_split(perch_full, 
                                                                      perch_weight, 
                                                                      test_size=0.3, 
                                                                      random_state=42)

train_input.shape, train_target.shape, test_input.shape, test_target.shape

독립변수: 2차원, 종속변수: 1차원 배열

 

3. 모델 구축
3.1 라이브러리 호출하기


 sklearn 라이브러리에서 회귀모델 생성을 위한 LinearRegression 모듈을 호출한다. 

from sklearn.linear_model import LinearRegression

 

3.2 다중회귀모델 생성하기


LinearRegression 함수를 사용하여 다중회귀모델을 생성한다.

lr = LinearRegression()
lr

다중회귀모델(클래스)생성

 

4. 모델 학습(훈련)


 fit 함수를 사용하여, 훈련 데이터의 독립변수와 종속변수 간의 관계를 학습한다. 이 과정에서 각 독립변수에 대한 최적의 계수(가중치)를 찾아낸다. 다중회귀모델여러 개의 독립변수를 포함하며, 각 독립변수에 대해 하나의 계수를 학습한다. 최적의 계수를 찾아내는 과정을 통해, 각 독립변수가 종속변수에 미치는 영향력을 파악한다. 또한, 독립변수가 모두 0일 때의 종속변수 값을 나타내는 y절편도 함께 학습한다. 이는 데이터의 패턴을 학습하여 모델의 예측 성능을 향상시킨다.

lr.fit(train_input, train_target)

다중회귀모델 학습(훈련)

 

5. 모델 성능 평가
5.1 훈련 및 테스트 데이터 세트의 결정계수 확인


 훈련 데이터와 테스트 데이터에 score 함수를 적용하여 다중회귀모델에 대한 결정계수를 확인한다.

train_r2 = lr.score(train_input, train_target)
test_r2 = lr.score(test_input, test_target)

print(f"훈련: {train_r2} / 테스트: {test_r2}")

훈련 및 테스트 데이터의 결정계수 확인

 

5.1.1 해석

 

  • 다중회귀모델의 훈련 데이터와 테스트 데이터에 대한 결정계수를 확인한 결과, 두 결정계수 간의 오차는 0.07 정도로 과대적합은 발생하지 않은 것으로 보임

  • 또한, 훈련 결정계수가 테스트 결정계수보다 높은 것으로 보아 과소적합 또한 발생하지 않은 일반화된 모델로 보임

  • 다만, 테스트 결정계수를 0.8대에서 0.9대로 올릴 수 있는지에 대한 고민 필요

 

5.1.2 방안

 

  • 이후, '특성공학'과 '규제방법' 중, '특성공학'을 적용하여 성능을 향상할 수 있는지 확인하기로 함

 

5.1.2 참고

 

  • 특성공학
    특성공학을 통해 특성을 생성함으로써, 모델이 데이터의 패턴을 더 잘 파악하도록 돕고, 이에 따라 결정계수를 높일 수 있다.

     
  • 규제
    규제는 계수(가중치)에 제약을 추가함으로써, 결정계수 자체를 높이지는 않지만 새로운 모델에 대한 성능, 즉 모델의 일반화 성능을 높일 수 있다.

 

6. 모델 예측
6.1 테스트 데이터로 예측하기


 
predict 함수에 테스트 데이터의 독립변수 값을 전달하여, 모델이 학습한 관계를 기반으로 해당 독립변수에 대한 종속변수의 예측값을 출력한다. 이 예측값은 모델이 학습한 패턴에 기반하여 계산된 것이며, 이를 통해 모델의 성능을 평가하거나, 실제 운영 환경에서 예측을 수행하는 데 사용할 수 있다.

test_pred = lr.predict(test_input)
test_pred

입력한 독립변수를 기반으로 한 모델의 예측값

 

7. 예측 성능 평가


 'sklearn.metrics' 패키지의 'mean_absolute_error' 함수는 '평균절대오차(MAE)'를 계산해 주는 함수이다. MAE는 실제값과 예측값의 차이를 절대값으로 변환한 후 평균을 계산하는 방법으로, 회귀 모델의 성능을 평가하는 하나의 지표이다.

 MAE를 계산할 때 함수의 첫 번째 인자로는 실제 값(테스트 데이터의 종속변수)을, 두 번째 인자로는 모델에 의해 예측된 값(테스트 데이터의 독립변수를 예측한 값) 입력하여, 둘 사이의 절대적인 차이를 평균한다. 따라서, 
MAE 값이 작을수록 모델의 성능이 좋다는 것을 의미한다.

from sklearn.metrics import mean_absolute_error

mean_absolute_error(test_target, test_pred)

평균절대오차 값

 

 

 

7.1 해석

 

  • 종속변수의 범위가 5.9에서 1100까지인데 비해, 모델이 예측한 값이 실제 값과 평균적으로 약 68.565만큼 차이가 나는 것으로 보임

  • 이는 종속변수의 전체범위에 비해 상대적으로 작은 오차로 보임

  • 따라서, 이 모델은 합리적인 성능을 보이고 있다고 판단됨
  • 다만, 테스트 결정계수의 값을 0.8대에서 0.9대로 높이기 위해 특성공학을 적용하려고 함

 


특성공학을 활용한 모델 성능 향상


 특성공학모델을 이용해 독립변수를 훈련시켜 새로운 특성들을 도출하려 한다. 이렇게 생성된 특성들은 회귀모델이 데이터의 비선형 패턴을 더욱 정확하게 학습할 수 있게 한다. 이 단계를 거쳐, 새로운 특성들을 활용하여 다중회귀모델을 추가로 학습시킬 계획이다. 그 결과, 회귀모델은 데이터 내의 비선형 패턴을 더욱 효과적으로 인식하고 학습할 것으로 예상된다.


1. 샘플 모델 구축
 1.1 라이브러리 호출하기


 sklearn 라이브러리의 PolynomialFeatures 클래스를 사용하여 다항 특성을 생성한다. 이를 통해 모델이 데이터의 비선형 패턴을 더 잘 학습할 수 있도록 도와준다.

from sklearn.preprocessing import PolynomialFeatures


 

1.2 특성공학모델 생성하기

 
 일반적으로 특성을 생성할 때 'include_bias=False'를 입력하여 y절편을 제외한다. 이는 대부분의 머신러닝 모델(선형회귀 등)이 y절편(bias, 상수항)을 자체적으로 계산하고 학습하므로, 불필요한 작업을 최소화하기 위한 것이다.

poly = PolynomialFeatures(include_bias=False)
poly

특성공학모델 생성

 

2. 샘플 모델 학습(훈련)
2.1 샘플 데이터를 통한 선행 학습 및 패턴 확인


 '2'를 길이, '3'을 두께, '4'를 높이로 간주하여, 이 샘플 데이터를 통해 학습을 진행하면서, 모델이 어떤 패턴을 가지는지 확인하려 한다.

temp_data = [[2,3,4]]
temp_data

샘플 데이터

 

2.2 샘플 데이터를 통한 모델 학습(훈련) 시키기


 특성공학모델에서 fit 함수를 사용하면, 모델은 입력 데이터의 특성과 구조를 학습한다. 여기서 '구조'란 데이터의 통계적 특성과 패턴을 포함한다. 예를 들어, PolynomialFeatures 클래스에서 fit 함수를 실행하면, 모델은 주어진 입력 특성들을 어떻게 조합하여 새로운 다항식 특성을 생성할지를 학습한다. 따라서, fit 함수를 통해 특성공학모델은 입력 데이터의 특성과 패턴을 학습하고, 이를 기반으로 데이터를 적절하게 변환하는 방법을 파악하게 된다.

poly.fit(temp_data)

특성공학모델 학습(훈련)

 

3. 데이터 전처리
3.1 특성 추가


 transform 함수는 모델이 fit 함수를 통해 학습한 정보를 바탕으로, 실제 데이터 변환을 수행한다. 해당 함수는 특성공학모델에서 입력 데이터의 각 특성을 학습된 방법에 따라 결합하여 새로운 다항식 특성을 생성한다. 이렇게 변환된 데이터는 원본 데이터보다 더 복잡한 패턴을 파악하는 데 도움이 되어, 머신러닝 모델의 성능 향상에 기여한다.

poly.transform(temp_data)

학습한 패턴을 기반으로 추가된 특성 확인

 

3.1.1 해석

 

  • 원래의 특성 [2, 3, 4]에 추가로, 이 특성들의 2차 항과 교차항이 추가된 것이 확인됨
    (ex. 2^2, 2*3, 2*4,  3^3, 3*4, 4^4)

  • 이는 PolynomialFeatures  모델이 각 특성의 제곱항과 서로 다른 특성들 간의 곱을 새로운 특성으로 추가한 결과로 보임

  • 따라서, 원래의 3개 특성 외에 새로운 6개의 특성이 추가됨으로써, 총 9개의 특성이 모델에 의해 생성됨

  • 이제 훈련 데이터의 독립변수를 특성공학모델에 훈련시켜, 결정계수와 MAE를 확인하는 과정을 통해 모델의 성능을 확인하려 함

 

4. 모델 구축
4.1 특성공학모델 생성하기


 PolynomialFeatures 클래스를 활용하여 다항 특성을 만들어 낸다. 여기서 'inclue_bias=False' 옵션을 설정하여 y절편의 생성을 제외하고, 'degree=2' 옵션을 통해 2차 다항 특성만을 생성하도록 한다.

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

특성공학모델 생성

 

5. 모델 학습(훈련)


 fit 함수에 훈련 데이터의 독립변수를 전달하여 모델을 학습(훈련)시킨다. 학습된 모델은 주어진 입력 특성들을 어떻게 조합하여 새로운 다항식 특성을 생성할지를 학습하게 된다.

poly.fit(train_input)

특성공학모델 훈련(학습)

6. 데이터 전처리
6.1 특성 추가


 transform 함수를 사용하여, 모델이 학습한 특성을 기반으로 새로운 다항식 특성을 생성한다.

train_poly = poly.transform(train_input)
test_poly = poly.transform(test_input)

print(train_poly, test_poly)

새로운 다항식 특성 생성

 

6.2 특성 확인


 get_feature_names_out 함수를 사용하여, 변환된 특성이 어떻게 구성되었는지 확인한다. 해당 함수는 데이터에 적용된 변환을 더욱 명확하게 이해하고, 모델의 해석을 돕는 역할을 한다.

poly.get_feature_names_out()

변환된 특성의 이름 확인

 


다중회귀모델 추가 학습


 특성공학모델을 통해 훈련시킨 독립변수로부터 새로운 특성들을 생성하였다. 이렇게 생성된 특성들을 활용하여 다중회귀모델을 재학습시키고자 한다. 이 과정을 통해, 회귀모델이 데이터 내의 비선형 패턴을 더욱 효과적으로 파악하고 학습할 수 있게 된다.

특성공학 적용 후 다중회귀모델 성능 검증
lr.fit(train_poly, train_target)

train_r2 = lr.score(train_poly, train_target)
test_r2 = lr.score(test_poly, test_target)

test_pred = lr.predict(test_poly)

mae = mean_absolute_error(test_target, test_pred)

print(f"훈련 결정계수:{train_r2} / 테스트 결정계수:{test_r2} / 평균절대오차: {mae}")

 

특성공학모델의 독립변수를 적용한 다중회귀모델의 성능

 

적용 전, 다중회귀 모델의 성능

 

해석

 

  • 특성공학이 적용한 모델과 그렇지 않은 다중회귀모델을 비교해 보았을 때, 특성공학을 적용한 경우 훈련 데이터와 테스트 데이터의 결정계수가 각각 0.03, 0.09 상승하였음이 확인됨

  • 또한, 오차도 38g 정도 감소한 것으로 보임

  • 이러한 결과는 과적합 없이 일반화가 잘 이루어진 모델이며, 매우 우수한 성능을 보임

  • 이 모델을 사용하기 위해서는 독립변수 중에서 세 가지 특성(길이, 높이, 두께)이 필요하며, 'degree=2' 옵션을 적용하여 2차 항 특성을 사용해야 함

  • 추가로, 회귀모델에 규제방법을 적용하여 검증 결정계수가 더 높아지는지에 대한 탐색하는 작업을 추가로 진행할 것

 


 이번 글에서는 다중회귀모델에 특성공학을 적용하여 성능 향상을 도모하는 과정에 대해 다루어 보았다. 보다 구체적으로는, 새로운 특성을 도출해 내는 특성공학을 통해 독립변수를 생성하고, 이를 다중회귀모델에 학습시킴으로써 모델 성능의 향상을 확인하였다. 다음 글에서는 이어서, 규제방법을 적용한 릿지와 라쏘 모델에 대해 살펴보도록 할 것이다.
2023.12.25 - [[파이썬]/머신러닝] - [머신러닝] 릿지·라쏘모델의 성능비교와 알파값 조정

 

[머신러닝] 릿지·라쏘모델의 성능비교와 알파값 조정

HTML 삽입 미리보기할 수 없는 소스 이번 글에서는 "규제 개념을 가진 릿지모델과 라쏘모델", 이 두가지 회귀모델에 대해 살펴보고자 한다. 이 과정에서 이전에 특성공학을 적용한 다중회귀모델

sungmin93.tistory.com