ML (MachineLearning)

Regressor(회귀모델) 생성하고, MSE(평균제곱오차)구하는 방법

567Rabbit 2024. 4. 12. 16:09

Prediction

- regressor (회귀모델)

 

머신러닝 regressor는 지도(학습)모델로 과거 데이터를 입력시켜주면 그에 대한 예측값을 알려주는 모델이다.

회귀 모델은 주로 예측하려는 값이 연속형 데이터인 경우에 사용되며 특정한 데이터에 대한 패턴을 학습하고, 그 패턴을 기반으로 새로운 입력에 대한 값을 예측한다

 

 

 

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

 

 

문제 ) 머신러닝을 통해 Purchased 값을 알고싶다.  

 

df

  Country Age Salary Purchased
0 France 44.000000 72000.000000 No
1 Spain 27.000000 48000.000000 Yes
2 Germany 30.000000 54000.000000 No
3 Spain 38.000000 61000.000000 No
4 Germany 40.000000 Nan Yes
5 France 35.000000 58000.000000 Yes
6 Spain Nan 52000.000000 No
7 France 48.000000 79000.000000 Yes
8 Germany 50.000000 83000.000000 No
9 France 37.000000 67000.000000 Yes

 

먼저 nan처리를 해준다

1) 삭제전략 dropna

2) 채우는전략 fillna

 

중, 1번 삭제전략을 통해 nan을 처리하면 아래와 같다

 

df.dropna()

 

df

  Country Age Salary Purchased
0 France 44.000000 72000.000000 No
1 Spain 27.000000 48000.000000 Yes
2 Germany 30.000000 54000.000000 No
3 Spain 38.000000 61000.000000 No
5 France 35.000000 58000.000000 Yes
7 France 48.000000 79000.000000 Yes
8 Germany 50.000000 83000.000000 No
9 France 37.000000 67000.000000 Yes

 

 

학습데이터 X와 결과데이터 y로 분리

먼저, 머신러닝을 학습시킬 데이터 X와 결과를 도출시키는 테스트 데이터 y로 분리한다

 

y

  Purchased
0 No
1 Yes
2 No
3 No
5 Yes
7 Yes
8 No
9 Yes

 

 

 

X

  Country Age Salary
0 France 44.000000 72000.000000
1 Spain 27.000000 48000.000000
2 Germany 30.000000 54000.000000
3 Spain 38.000000 61000.000000
5 France 35.000000 58000.000000
7 France 48.000000 79000.000000
8 Germany 50.000000 83000.000000
9 France 37.000000 67000.000000

 

 

문자열을 숫자로 바꿔주기

-컴퓨터가 이해할 수 있도록 문자로 된 데이터는 숫자로 변경해주어야 하는데, 이를 원 핫 인코딩이라고 한다.

 

원핫 인코딩의 예상 결과를 작성해보았다

 

# France    Germany     Spain    Age       Salary
#   1             0                 0           44         72000
#   0             0                 1           27         48000
#   0             1                 0           30         54000
#   0             0                 1           38         61000
#   1             0                 0           35         58000
#   1             0                 0           48         79000
#   0             1                 0           50         83000
#   1             0                 0           37         67000

 

 

from sklearn.preprocessing import LabelEncoder, OneHotEncoder

from sklearn.compose import ColumnTransformer

 

<원핫 인코딩 공식>

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

[]안에 있는 인덱스 번호는 원핫인코딩하고, remainder 나머지는 passthrough 변형시키지말고 지나쳐라

 

 

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

X = ct.fit_transform(X)   

array([[1.0e+00, 0.0e+00, 0.0e+00, 4.4e+01, 7.2e+04],
       [0.0e+00, 0.0e+00, 1.0e+00, 2.7e+01, 4.8e+04],
       [0.0e+00, 1.0e+00, 0.0e+00, 3.0e+01, 5.4e+04],
       [0.0e+00, 0.0e+00, 1.0e+00, 3.8e+01, 6.1e+04],
       [1.0e+00, 0.0e+00, 0.0e+00, 3.5e+01, 5.8e+04],
       [1.0e+00, 0.0e+00, 0.0e+00, 4.8e+01, 7.9e+04],
       [0.0e+00, 1.0e+00, 0.0e+00, 5.0e+01, 8.3e+04],
       [1.0e+00, 0.0e+00, 0.0e+00, 3.7e+01, 6.7e+04]])

 

설명 ) 4.4e+01은 4.4*10=44   ,   7.2e+04는 7.2 * 10000 = 72000을 표현한 것이다.

 

 

 

y는 No, Yes로 0과 1 두개로 표현할 수 있으므로 그냥 인코딩한다

  Purchased
0 No
1 Yes
2 No
3 No
4 Yes
5 Yes
6 No
7 Yes
8 No
9 Yes

 

sorted(y.unique())

 

y = encoder.fit_transform(y)

array([0, 1, 0, 0, 1, 1, 0, 1])

 

 

Feature Scaling

딥러닝 등과 같은 경우에는 feature scaling을 통해 데이터의 스케일을 조정하여 모델의 안정성을 향상시키고 성능을 향상시켜야 한다.

 

방법은 두가지이다. (두가지 중 하나를 선택하여 사용하면 된다)

 

  • 표준화 : 평균을 기준으로 얼마나 떨어져 있느냐? 같은 기준으로 만드는 방법, 음수도 존재, 데이터의 최대최소값 모를때 사용. ( StandardScaler )
  • 정규화 : 0 ~ 1 사이로 맞추는 것. 데이터의 위치 비교가 가능, 데이터의 최대 최소값 알떄 사용 ( MinMaxScaler )
from sklearn.preprocessing import StandardScaler, MinMaxScaler

 

 

 

# 방법1. 표준화
X_scaler = StandardScaler()

X_scaler.fit_transform( X )

array([[ 1.        , -0.57735027, -0.57735027,  0.69985807,  0.58989097],
       [-1.        , -0.57735027,  1.73205081, -1.51364653, -1.50749915],
       [-1.        ,  1.73205081, -0.57735027, -1.12302807, -0.98315162],
       [-1.        , -0.57735027,  1.73205081, -0.08137885, -0.37141284],
       [ 1.        , -0.57735027, -0.57735027, -0.47199731, -0.6335866 ],
       [ 1.        , -0.57735027, -0.57735027,  1.22068269,  1.20162976],
       [-1.        ,  1.73205081, -0.57735027,  1.48109499,  1.55119478],
       [ 1.        , -0.57735027, -0.57735027, -0.211585  ,  0.1529347 ]])

 

y         # y는 0과 1로만 표현되므로 스케일링 과정을 거치지 않아도 된다

array([0, 1, 0, 0, 1, 1, 0, 1])

 

 

# 방법2. 정규화

X_scaler = MinMaxScaler()

X = X_scaler.fit_transform( X )

array([[1.        , 0.        , 0.        , 0.73913043, 0.68571429],
       [0.        , 0.        , 1.        , 0.        , 0.        ],
       [0.        , 1.        , 0.        , 0.13043478, 0.17142857],
       [0.        , 0.        , 1.        , 0.47826087, 0.37142857],
       [1.        , 0.        , 0.        , 0.34782609, 0.28571429],
       [1.        , 0.        , 0.        , 0.91304348, 0.88571429],
       [0.        , 1.        , 0.        , 1.        , 1.        ],
       [1.        , 0.        , 0.        , 0.43478261, 0.54285714]])

 

y

array([0, 1, 0, 0, 1, 1, 0, 1])

 

 

Dataset을 Training 용과 Test용으로 나눈다.

 

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=32)

 

# 80%는 학습용으로 하고, 20%는 테스트용으로 해라 (0.2 또는 0.25로 주로 사용한다)
# random_state 는 random seed값과 비슷한것이다

 

from sklearn.linear_model import LinearRegression

regressor = LinearRegression()

regressor.fit(X_train, y_train)

 

 

 

 

검증하기 : MSE(mean squared error) 구하기

 

y_pred = regressor.predict(X_test)

 

# MSE

error = y_test - y_pred

(error ** 2).mean()

 

# 성능을 측정하기 위해서는 오차를 제곱해서, 부호를 먼저 없앤 후에 평균을 구한다

 

# RMSE (루트를 씌운 값이다)
np.sqrt((error ** 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()