[머신러닝] 다중 회귀
다중 회귀
다중 회귀란?
하나의 특성으로 선형 회귀 모델을 훈련 시키는 것을 선형 회귀라고 부른다.
이때 여러개의 특성을 사용하는 선형 회귀를 다중 회귀(multiple regression)라고 부른다.
선형 회귀(Linear Regression)
아래 마인드 맵에 나와있는 것 처럼 선형 회귀는 지도 학습의 대표적인 회귀 알고리즘이다.
(Machine Learning -> Unsupervised Learning -> Linear Regression)
선형 회귀는 특성과 타깃 사이의 관계를 가장 잘 나타내는 선형 방정식을 찾는다.
특성이 하나인 경우 어떤 직선을 학습하는 알고리즘이다.
특성 공학이란?
다중 회귀를 사용하기 위해서 3개의 특성(length, height, width)를 사용 할 거다. 이때 3개의 특성을 각각 제곱 하여 추가한다. 또한 각 특성을 서로 곱해서 새로운 특성을 만들 거다. 이처럼 기존 특성을 사용하여 새로운 특성을 만들어내는 작업을 특성 공학(feature engineering)이라고 부른다.
데이터 준비
CSV 를 불러와서 3개의 특성을 준비하자.
pandas 는 데이터 분석 라이브러리다. 넘파이와 비슷한 다차원 배열을 다룰 수도 있고 더 많은 기능을 제공한다.
또한 CSV 파일을 가져와 데이터 프레임을 만들 수 있다.
import pandas as pd
df = pd.read_csv('https://bit.ly/perch_csv_data')
perch_full = df.to_numpy()
아래 링크가 CSV 파일의 내용이다.
타깃 데이터
타깃 데이터는 weight로 준비한다.
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)라고 부른다.
PolynomialFeatures 클래스 사용법
PolynomialFeatures 클래스는 사용하여 예제의 특성들을 늘릴거다. 우선 PolynomialFeatures 클래스 사용법에 대해 알아보자. 2개의 특성을 넣어도 여러 개의 특성을 출력한다. [2,3] 두개의 특성을 넣었는데 transform 메서드에게 [2,3]을 전달하니 6개의 특성으로 늘어났다. 자세하게 살펴보자.
from sklearn.preprocessing import PolynomialFeatures
poly = PolynomialFeatures()
poly.fit([[2,3]])
print(poly.transform([[2,3]]))
결과 : [[1. 2. 3. 4. 6. 9.]]
fit([[2,3]])
fit() 메서드는 특성들을 훈련하여 새롭게 만들 특성 조합을 찾는다.
transform([[2,3]])
fit() 메서드에서 찾은 특성 조합들을 실제 데이터로 변환한다.
[[1. 2. 3. 4. 6. 9.]]
결과를 보면 1 2 3 4 6 9 라는 새로운 원소가 생겼다.
각각의 원소가 나온 이유를 알아보자.
PolynomialFeatures 클래스는 각 특성을 제곱 한 항과 특성끼리 서로 곱한 항 을 추가한다.
즉 2, 3을 제곱한 4, 9가 추가되고 2와 3을 곱한 6이 추가되었다.
1은 어떻게 추가 됐을까? 아래에 식을 보자.
weight = a x length x height + c x width + d x 1
선형 방정식은 항상 1이 곱해진다. 따라서 1의 값이 항상 추가 된다.
1 없애기
사이킷런 모델이 자동으로 특성에 추가된 절편 항을 무시하여 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.]]
특성 만들기
예제로 돌아와서 PolynomialFeatures 클래스를 사용하여 특성을 만들자.
shape로 배열의 크기를 확인해 보면 9개의 특성이 만들어 진 것을 알 수 있다.
poly = PolynomialFeatures(include_bias=False)
poly.fit(train_input)
train_poly = poly.transform(train_input)
#배열 크기 확인
print(train_poly.shape)
결과 : (42, 9)
특성 확인
아래 예제로 특성이 어떤 조합으로 만들어 졌는지 확인 가능하다.
print(poly.get_feature_names_out())
결과 : ['x0' 'x1' 'x2' 'x0^2' 'x0 x1' 'x0 x2' 'x1^2' 'x1 x2' 'x2^2']
모델 훈련하기
다중 회귀는 단지 여러 개의 특성으로 선형 회귀를 훈련하는 것 뿐이니 모델 훈련은 선형 회귀와 같다.
from sklearn.linear_model import LinearRegression
lr = LinearRegression()
lr.fit(train_poly, train_target) #선형 회귀 모델 훈련
모델 평가
괜찮은 점수가 나온다.
print(lr.score(train_poly, train_target))
결과 : 0.9903183436982126
테스트 세트 평가
괜찮은 점수가 나온다.
test_poly = poly.transform(test_input)
print(lr.score(test_poly, test_target))
결과 : 0.9714559911594125
전체 소스코드
import pandas as pd
#특성 가져오기
df = pd.read_csv('https://bit.ly/perch_csv_data')
perch_full = df.to_numpy()
#print(perch_full)
#타깃 데이터
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)
#PolynomialFeatures 사용 예제
from sklearn.preprocessing import PolynomialFeatures
poly = PolynomialFeatures(include_bias=False)
poly.fit([[2,3]])
print(poly.transform([[2,3]]))
# 특성 만들기
poly = PolynomialFeatures(include_bias=False)
poly.fit(train_input)
train_poly = poly.transform(train_input)
print(train_poly.shape) #배열 크기 확인
#특성 확인하기
print(poly.get_feature_names_out())
#모델 훈련 시키기
from sklearn.linear_model import LinearRegression
lr = LinearRegression()
lr.fit(train_poly, train_target) #선형 회귀 모델 훈련
#모델 평가
print(lr.score(train_poly, train_target))
#테스트 세트 평가
test_poly = poly.transform(test_input)
print(lr.score(test_poly, test_target))
참조
혼자 공부하는 머신러닝 + 딥러닝(박해선, 한빛 미디어) : https://hongong.hanbit.co.kr/%ED%98%BC%EC%9E%90-%EA%B3%B5%EB%B6%80%ED%95%98%EB%8A%94-%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D-%EB%94%A5%EB%9F%AC%EB%8B%9D/
혼자 공부하는 머신러닝 + 딥러닝(깃 허브) : https://github.com/rickiepark/hg-mldl
댓글
댓글 쓰기