ML (MachineLearning)

Linear regression을 사용하여 신규 데이터 입력 시, 데이터 기반 예측 값 알려주기

567Rabbit 2024. 4. 15. 10:30

Simple linear regression

하나의 변수로 X -> y를 알아낸다

 

Multiple linear regression

여러개의 변수로  X1, X2, X3 ... -> y를 알아낸다

 

 

여기서는 Multiple linear regression로 데이터 기반 예측값을 알아보도록 하겠다.

 

 

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

 

 

여러개의 데이터를 기반으로 Profit (수익)을 예측하려 한다.

 

df

  R&D Spend Administration Marketing Spend State Profit
0 165349.20 136897.80 471784.10 New York 192261.83
1 162597.70 151377.59 443898.53 California 191792.06
2 153441.51 101145.55 407934.54 Florida 191050.39
3 144372.41 118671.85 383199.62 New York 182901.99
4 142107.34 91391.77 366168.42 Florida 166187.94
5 131876.90 99814.71 362861.36 New York 156991.12
6 134615.46 147198.87 127716.82 California 156122.51
7 130298.13 145530.06 323876.68 Florida 155752.60
8 120542.52 148718.95 311613.29 New York 152211.77
9 123334.88 108679.17 304981.62 California 149759.96
10 101913.08 110594.11 229160.95 Florida 146121.95
11 100671.96 91790.61 249744.55 California 144259.40
12 93863.75 127320.38 249839.44 Florida 141585.52
13 91992.39 135495.07 252664.93 California 134307.35
14 119943.24 156547.42 256512.92 Florida 132602.65
15 114523.61 122616.84 261776.23 New York 129917.04
16 78013.11 121597.55 264346.06 California 126992.93
17 94657.16 145077.58 282574.31 New York 125370.37
18 91749.16 114175.79 294919.57 Florida 124266.90
19 86419.70 153514.11 0.00 New York 122776.86
20 76253.86 113867.30 298664.47 California 118474.03
21 78389.47 153773.43 299737.29 New York 111313.02
22 73994.56 122782.75 303319.26 Florida 110352.25
23 67532.53 105751.03 304768.73 Florida 108733.99
24 77044.01 99281.34 140574.81 New York 108552.04
25 64664.71 139553.16 137962.62 California 107404.34
26 75328.87 144135.98 134050.07 Florida 105733.54
27 72107.60 127864.55 353183.81 New York 105008.31
28 66051.52 182645.56 118148.20 Florida 103282.38
29 65605.48 153032.06 107138.38 New York 101004.64
30 61994.48 115641.28 91131.24 Florida 99937.59
31 61136.38 152701.92 88218.23 New York 97483.56
32 63408.86 129219.61 46085.25 California 97427.84
33 55493.95 103057.49 214634.81 Florida 96778.92
34 46426.07 157693.92 210797.67 California 96712.80
35 46014.02 85047.44 205517.64 New York 96479.51
36 28663.76 127056.21 201126.82 Florida 90708.19
37 44069.95 51283.14 197029.42 California 89949.14
38 20229.59 65947.93 185265.10 New York 81229.06
39 38558.51 82982.09 174999.30 California 81005.76
40 28754.33 118546.05 172795.67 California 78239.91
41 27892.92 84710.77 164470.71 Florida 77798.83
42 23640.93 96189.63 148001.11 California 71498.49
43 15505.73 127382.30 35534.17 New York 69758.98
44 22177.74 154806.14 28334.72 California 65200.33
45 1000.23 124153.04 1903.93 New York 64926.08
46 1315.46 115816.21 297114.46 Florida 49490.75
47 0.00 135426.92 0.00 California 42559.73
48 542.05 51743.15 0.00 New York 35673.41
49 0.00 116983.80 45173.06 California 14681.40

 

 

 

 

1. nan 처리

 

df.isna().sum()

R&D Spend          0
Administration     0
Marketing Spend    0
State              0
Profit             0
dtype: int64

 

 

 

 

2. X,y로 분리

 

y = df['Profit']

 

X = df.loc[ : , 'R&D Spend':'State' ]

 

 

 

 

 

3. 문자열 데이터는 숫자로 

 

df['State'].unique()

array(['New York', 'California', 'Florida'], dtype=object)

 

 

# 원핫 인코딩

-원 핫 인코딩하면 원 핫 인코딩된 컬럼이 항상 맨 왼쪽에 위치하게 된다

 

from sklearn.preprocessing import OneHotEncoder
from sklearn.compose import ColumnTransformer

 

ct = ColumnTransformer( [ ('encoder', OneHotEncoder() , [3] ) ] , remainder= 'passthrough' ) 

X = ct.fit_transform(X)

 

X = ct.fit_transform(X)

 

# 피처 스케일링은 linear이므로 패스한다

(만약 피처스케일링을 해야한다면 이전 글을 참조하길 바란다)

 

 

 

 

 

4. traing과 test로 나누고 regression 모델을 만든다

from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(X, y , test_size=0.2, random_state=65)  
#항상 이 형태여야 한다

 

test_size=0.2는 test 2 : traning 8 의 비율로 한다는 뜻이다. 실무에서는 주로 2 또는 2.5로 쓴다

random_state는 random의 seed값과 비슷한 개념이다

 

from sklearn.linear_model import LinearRegression

regressor = LinearRegression()

regressor.fit(X_train, y_train)

 

 

 

 

 

5. regression 모델의 식 알아보기

 

Multiple linear regression에서는 여러개의 변수를 쓰는데, 이 예제에서는 변수가 아래와 같다.

R&D Spend Administration Marketing Spend State

 

그런데, state는 원 핫 인코딩으로 문자열을 New York, California, Florida 세개로 나누었기 때문에,

 

아래와 같이 여섯개의 변수라고 할 수 있다.

 

R&D Spend

Administration

Marketing Spend

California (1, 0, 0)

Florida (0, 1, 0)

New York (0, 0, 1) 

 

X가 총 6개의 변수이므로

y = aX1 + bX2  +  cX3  +  dX4 + eX5  +  fX6  +  g 와 같은 식을 사용한다고 할 수 있다. 

 

여기서,

regressor.coef_
array([ 8.29736108e+00,  1.35646415e+03, -1.36476151e+03,  8.24637324e-01,
       -1.12195852e-02,  2.80920611e-02])

 

coef는 계수를 뜻하며 a, b, c, d, e, f에 해당한다.

 

regressor.intercept_
46989.22920268966

 

intercept는 상수항을 뜻하며 g에 해당한다

 

즉, 

y = 8.29736108e+00X1+  1.35646415e+03X2 + -1.36476151e+03X3 + 8.24637324e-01X4 +
       -1.12195852e-02X5 +  2.80920611e-02X6 + 46989.22920268966

이라는 식이 나온 것이다.

 

 

 

 

 

6.  데이터 입력받기 전, 임의로 테스트(test)해보고 오차 구해보기

 

y_pred =  regressor.predict(X_test)

 

#MSE(오차 구하기)

((y_test - y_pred) **2).mean

 

df_test = y_test.to_frame()

df_test.reset_index(drop=True, inplace=True)

df_test['y_pred'] = y_pred

 

#도표로 확인하기

df_test.plot(kind='bar')
plt.savefig('test.jpg')
plt.show()

 

 

 

 

 

 

 

7. 데이터를 입력받는  실서버에 배포하기 위해서 regressor과 ct를 저장하기 

 

import joblib

joblib.dump( regressor , 'regressor.pkl' )

joblib.dump(ct, 'ct.pkl' )

 

 

 

 

 

8. X를 입력받아서 y 예측하기

 

위의 re파일로 저장해서 실서버에 배포한 후에,

아래와 같은 새로운 데이터를 받았다. 이 데이터를 바탕으로 회사의 수익을 예측할 것이다

운영비는 15만달러, 마케팅비는 40만달러, 연구개발비 13만달러이고 회사위치는 Florida에 있다.

 

data = {'R&D Spend' : [130000,150000], 'Administration':[150000,110000],'Marketing Spend':[400000,600000], 'State':['Florida','New York']}

 

new_data = pd.DataFrame(data)     #데이터프레임으로 꼭 만들어야 한다!

new_data

  R&D Spend Administration Marketing Spend State
0 130000 150000 400000 Florida
1 150000 110000 600000 New York

 

 

new_data = ct.transform( new_data )

regressor.predict( new_data )

array([165102.43212675, 184941.14856592])

 

이를 통해서, 

  R&D Spend Administration Marketing Spend State
0 130000 150000 400000 Florida

 

의 수익(Profit)은 165102.43212675이고,

 

  R&D Spend Administration Marketing Spend State
1 150000 110000 600000 New York

 

의 수익(Profit)은 184941.14856592 라는 것을 알 수 있다.