여러개의 변수가 있을때의 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()
'MACHINE | DEEP LEARNING > Machine Learning Project' 카테고리의 다른 글
[AI] 머신러닝 Supervised. 학습된 인공지능을 가지고, 신규 데이터 처리 방법 (0) | 2024.04.14 |
---|---|
[AI] 머신 러닝 Linear Regression 후 메모리 파일 저장 _joblib, 피클파일 저장 (0) | 2024.04.14 |
[AI] 머신 러닝 Simple Linear Regression 순서 및 과정 (0) | 2024.04.14 |
[AI] 머신러닝 Feature Scaling(StandardScaler(), MinMaxScaler()) / Dataset을 Training과 Test로 나누는 방법 (2) | 2024.04.12 |
[AI] 머신러닝 문자열 데이터를 숫자로 바꾸는 방법_Label Encoding, One Hot Encoding (0) | 2024.04.12 |