개발학습일지

[AI] 머신 러닝 Multiple Linear Regression 순서 및 과정 본문

AI/Machine Learning

[AI] 머신 러닝 Multiple Linear Regression 순서 및 과정

처카푸 2024. 4. 14. 19:34

여러개의 변수가 있을때의 leaner regression

 -  2차원에서는 선 이지만, 3차원에서는 평면이 된다.

 - 구해야 할 b 가 많다

 

 

이제 하나의 예시 데이터로 Multiple Linear Regression 을 해보자

기본 임폴트

# Importing the libraries
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

기본 데이터

   - Profit 수익을 예측하려 한다.

df = pd.read_csv('50_Startups.csv')
df.head()

1. nan 처리

   - isna().sum() 을 통해 각 컬럼 마다 nan의 갯수를 확인한다

   - nan 이 있으면 dorpna() 또는 fillna() 를 사용하여 해결한다

df.isna().sum()
>>>
    R&D Spend          0
    Administration     0
    Marketing Spend    0
    State              0
    Profit             0
    dtype: int64

2. X와 y로 분리

   - X 가 여러개이기때문에 .loc[ , ] 또는 .iloc[ , ] 로 추출해준다

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

 

3. 문자열 데이터를 숫자로 바꾼다.

   - y 데이터에서는 모든 데이터가 다 숫자이다

   - X 데이터에서 'State' 컬럼 문자열 숫자로 바꿔준다 OneHotEncoder 사용

      -- 임폴트

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

      --  'State'  컬럼 데이터 확인

X['State'].nunique()
# 3
sorted(X['State'].unique())
# ['California', 'Florida', 'New York']

      -- ColumnTransformer([('encoder', OneHotEncoder(), [*])], remainder='passthrough') 사용

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

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

# 변수 ct 에 데이터 정보는 학습(fit) 시켰다 
X = ct.fit_transform(X)
X
>>>
    array([[0.0000000e+00, 0.0000000e+00, 1.0000000e+00, 1.6534920e+05,
            1.3689780e+05, 4.7178410e+05],
           [1.0000000e+00, 0.0000000e+00, 0.0000000e+00, 1.6259770e+05,
            1.5137759e+05, 4.4389853e+05],
           [0.0000000e+00, 1.0000000e+00, 0.0000000e+00, 1.5344151e+05,
            1.0114555e+05, 4.0793454e+05],
            ...
           [0.0000000e+00, 0.0000000e+00, 1.0000000e+00, 5.4205000e+02,
            5.1743150e+04, 0.0000000e+00],
           [1.0000000e+00, 0.0000000e+00, 0.0000000e+00, 0.0000000e+00,
            1.1698380e+05, 4.5173060e+04]])

4. 피처 스케일링 한다

   -  Linear Regression 에서는 자체적으로 피처 스케일링은 하므로 따로 해줄 필요가 없지만, 딥러닝에서는 필요하다

 

5. Training 과 Test 용으로 데이터를 분리

   -  sklearn 모듈 임폴트 from sklearn.model_selection import train_test_split

from sklearn.model_selection import train_test_split

   - 데이터 프리포셋 train_test_split(X, y, test_size=*) 를 사용하여 X_train, X_test, y_train, y_test 4가지 변수 만들기

X_train, X_test, y_train, y_test= train_test_split(X, y, test_size=0.2, random_state=65 )

6. 인공지능 모델링한다 _연봉을 예측하는 것은 수치로 나오는 것이기 때문에 Regression 으로 학습시킨다

   - sklearn 모듈 임폴트 및 인공지능을 변수로 만들기

from sklearn.linear_model import LinearRegression
regressor = LinearRegression()

7. 인공지능을 학습시키다

   - 리니어레그레이션 자체가 인공지능인데 지금은 아무것도 학습되어있는 상태가 아니여서 데이터로 학습(fit)시켜야한다

regressor.fit(X_train, y_train)

   - coef_, intercept_ 를 사용하여 학습한 결과 a, b 를 물어본다

regressor.coef_
# array([ 8.29736108e+00,  1.35646415e+03, -1.36476151e+03,  8.24637324e-01,
      #  -1.12195852e-02,  2.80920611e-02])
# 방정식의 맨 마지막 상수항
regressor.intercept_
# 46989.22920268966

8. 검증하기 학습이 끝나면, 이 인공지능이 얼마나 똑똑한지 테스트 해야한다.

   - predict() 으로 테스트용 데이터인 X_test로 데스트 한다.

   - 예측한 후 예측 변수로 저장

y_pred = regressor.predict(X_test)
y_pred
>>>
    array([ 75017.13778857, 129992.67932128, 116991.86227872,  45109.83439244,
           111410.63726075, 152704.94532349, 104084.06108572,  45478.09269869,
            99131.67843245, 131009.36870589])

  - 실제 데이터와, 예측 데이터를 비교하여 테스트하면 된다.오차(실제값 - 예측값)를 구한다

  - 오차가 작으면, 똑똑한 인공지능 만든 것이다!  오차의 제곱에서, 평균을 구한다

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

  - 리그레이션 성능평가 방법 중 한개 Mean Squared Error (MSE) 이다

error = y_test - y_pred
# MSE
( error ** 2 ).mean()
# 89277416.70428361
#RMSE -> 숫자가 너무 커서 Root 씌운 값
np.sqrt(( error ** 2 ).mean())
# 9448.672748290292

 

9. 실제값과 예측값을 차트로 그려본다.

   - 시리즈와 넘파이 합치기

df_test = y_test.to_frame()
df_test['y_pred'] = y_pred
# 인덱스가 뒤죽박죽이라 그래프가 이상하게 나와서 리셋인덱스를 해준다
df_test.reset_index(drop=True, inplace=True)

   - 바의 형태의 그래프로 오차범위를 한눈에 확인 할 수 있다

   - plt.savefig('test.jpg') 로 그래프 jpg 형태로 저장할 수 있다

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