다중 선형 회귀

·2021년 12월 7일
0

NIPA AI 교육

목록 보기
9/31

1. 다중 선형 회귀 모델 이해하기

하나의 Label 데이터를 예측하기 위해 하나보다 많은 수의 Feature데이터, 값들이 들어갈 때

각각의 입력값 X에 맞는 기울기값들을 찾아주어야 함.

2. 다중 선형 회귀 모델의 경사 하강법

3. 다중 선형 회귀 특징

  • 여러 개의 입력값과 결과값 간의 관계 확인 가능
  • 어떤 입력값이 결과값에 어떠한 영향을 미치는지 알 수 있음(각 X들의 기울기값들을 비교해서)
  • 여러 개의 입력값 사이 간의 상관 관계가 높을 경우 결과에 대한 신뢰성을 잃을 가능성이 있음.
    ** 상관관계: 두가지 것의 한쪽이 변화하면 다른 한쪽도 따라서 변화하는 관계

4. 실습

  • 페이스북, TV, 신문광고량에 따른 Sales값 구하기

1. 데이터 전처리

다중 회귀 분석(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())

2. 학습

다중 선형 회귀 모델의 형태는 아래 수식과 같습니다.

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)

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))
profile
백엔드 개발자. 공동의 목표를 함께 이해한 상태에서 솔직하게 소통하며 일하는 게 가장 즐겁고 효율적이라고 믿는 사람.

0개의 댓글