하나의 Label 데이터를 예측하기 위해 하나보다 많은 수의 Feature데이터, 값들이 들어갈 때
각각의 입력값 X에 맞는 기울기값들을 찾아주어야 함.
다중 회귀 분석(Multiple Linear Regression)은 데이터의 여러 변수(features) XXX를 이용해 결과 YYY를 예측하는 모델입니다.
마케터들에게는 광고 비용에 따른 수익률을 머신러닝을 통해서 예측할 수 있다면 어떤 광고 플랫폼이 중요한 요소인지 판별할 수 있을 것입니다.
아래와 같이 FB, TV, Newspaper 광고에 대한 비용 대비 Sales 데이터가 주어졌을 때, 이를 다중 회귀 분석으로 분석해봅시다.
우선 데이터를 전 처리 하기 위해서 3개의 변수를 갖는 feature 데이터와 Sales 변수를 label 데이터로 분리하고 학습용, 평가용 데이터로 나눠봅시다.
지시사항
DataFrame으로 읽어 온 df에서 Sales 변수는 label 데이터로 Y에 저장하고 나머진 X에 저장합니다.
train_test_split를 사용하여 X, Y를 학습용:평가용=8:2학습용 : 평가용 = 8:2학습용:평가용=8:2 비율로 분리합니다. (random_state=42는 고정합니다.)
import numpy as np
import pandas as pd
from sklearn.linear_model import LinearRegression
from sklearn.metrics import r2_score
from sklearn.model_selection import train_test_split
df = pd.read_csv("data/Advertising.csv")
print('원본 데이터 샘플 :')
print(df.head(),'\n')
# 입력 변수로 사용하지 않는 Unnamed: 0 변수 데이터를 삭제합니다
df = df.drop(columns=['Unnamed: 0'])
"""
1. Sales 변수는 label 데이터로 Y에 저장하고 나머진 X에 저장합니다.
"""
X = df.drop(columns=['Sales'])
Y = df['Sales']
"""
2. 학습용 평가용 데이터로 분리합니다.
"""
train_X, test_X, train_Y, test_Y = train_test_split(X, Y, test_size=0.2, random_state=42)
# 전 처리한 데이터를 출력합니다
print('train_X : ')
print(train_X.head(),'\n')
print('train_Y : ')
print(train_Y.head(),'\n')
print('test_X : ')
print(test_X.head(),'\n')
print('test_Y : ')
print(test_Y.head())
다중 선형 회귀 모델의 형태는 아래 수식과 같습니다.
Sales=β0+β1X1+β2X2+β3X3
여기서 X1은 페이스북, X2는 TV, X3은 신문 광고를 의미합니다.
다중 선형 회귀 또한 선형 회귀 모델과 같은 방식으로 LinearRegression을 사용할 수 있습니다.
이번 실습에서는 학습용 데이터를 다중 선형 회귀 모델을 사용하여 학습하고, 학습된 파라미터를 출력해봅시다.
LinearRegression의 beta와 같은 파라미터들은 아래 코드와 같이 구할 수 있습니다.
lrmodel = LinearRegression()
lrmodel.intercept_
lrmodel.coef_[i]
intercept는 β0에 해당하는 값이고, coef[i]는 i+1 번째 변수에 곱해지는 파라미터 값을 의미합니다.
지시사항
다중 선형 회귀 모델 LinearRegression을 불러와 lrmodel에 초기화하고 fit을 사용하여 train_X, train_Y데이터를 학습합니다.
학습된 모델 lrmodel에서 beta_0, beta_1, beta_2, beta_3에 해당하는 파라미터를 불러와 저장합니다.
import numpy as np
import pandas as pd
from sklearn.linear_model import LinearRegression
from sklearn.metrics import r2_score
from sklearn.model_selection import train_test_split
# 데이터를 읽고 전 처리합니다
df = pd.read_csv("data/Advertising.csv")
df = df.drop(columns=['Unnamed: 0'])
X = df.drop(columns=['Sales'])
Y = df['Sales']
train_X, test_X, train_Y, test_Y = train_test_split(X, Y, test_size=0.2, random_state=42)
# train data size:test size를 8:2로 설정
"""
1. 다중 선형 회귀 모델을 초기화 하고 학습합니다
"""
lrmodel = LinearRegression()
lrmodel.fit(train_X, train_Y)
"""
2. 학습된 파라미터 값을 불러옵니다
"""
beta_0 = lrmodel.intercept_ # y절편 (기본 판매량)
beta_1 = lrmodel.coef_[0] # 1번째 변수에 대한 계수 (페이스북)
beta_2 = lrmodel.coef_[1] # 2번째 변수에 대한 계수 (TV)
beta_3 = lrmodel.coef_[2] # 3번째 변수에 대한 계수 (신문)
print("beta_0: %f" % beta_0)
print("beta_1: %f" % beta_1)
print("beta_2: %f" % beta_2)
print("beta_3: %f" % beta_3)
[실습5]에서 학습한 다중 선형 회귀 모델을 바탕으로 이번엔 새로운 광고 비용에 따른 Sales 값을 예측해봅시다.
LinearRegression (sklearn)
LinearRegression을 사용하여 예측을 해야한다면 아래와 같이 predict 함수를 사용합니다.
pred_X = lrmodel.predict(X)
지시사항
lrmodel을 학습하고 test_X의 예측값을 구하여 pred_X에 저장합니다.
lrmodel을 학습하고 주어진 데이터 df1의 예측값을 구하여 pred_df1에 저장합니다.
import numpy as np
import pandas as pd
from sklearn.linear_model import LinearRegression
from sklearn.metrics import r2_score
from sklearn.model_selection import train_test_split
# 데이터를 읽고 전 처리합니다
df = pd.read_csv("data/Advertising.csv")
print(df)
df = df.drop(columns=['Unnamed: 0'])
X = df.drop(columns=['Sales'])
Y = df['Sales']
train_X, test_X, train_Y, test_Y = train_test_split(X, Y, test_size=0.2, random_state=42)
# 다중 선형 회귀 모델을 초기화 하고 학습합니다
lrmodel = LinearRegression()
lrmodel.fit(train_X, train_Y)
print('test_X : ')
print(test_X)
"""
1. test_X에 대해서 예측합니다.
"""
pred_X = lrmodel.predict(test_X)
print('test_X에 대한 예측값 : \n{}\n'.format(pred_X))
print(test_Y) # 예측값을 실제 테스트 데이터의 Y값(Sales)과 얼마나 맞는지 비교하기 위해 추가
# 새로운 데이터 df1을 정의합니다
df1 = pd.DataFrame(np.array([[0, 0, 0], [1, 0, 0], [0, 1, 0], [0, 0, 1], [1, 1, 1]]), columns=['FB', 'TV', 'Newspaper'])
print('df1 : ')
print(df1)
"""
2. df1에 대해서 예측합니다.
"""
pred_df1 = lrmodel.predict(df1)
print('df1에 대한 예측값 : \n{}'.format(pred_df1))