머신러닝

Linear Regression

HooSL 2022. 3. 28. 11:08

Linear Regression 이란?

경력과 연봉의 관계를 분석하여, 경력이 주어졌을때 연봉을 예측하려 합니다.

데이터를 살펴보니, 아래와 같은 그래프로 나왔다고 가정했을 때,

아래 그림처럼, 해당 분포를 만족하는 직선을 찾으려 하는것이 목표입니다.

직선을 찾기 위해서는, 우리가 잘 아는 직선의 방정식을 이용하여, 직선의 기울기와 y절편을 구하면 되는 것입니다.

오차 = 실제값 - 예측값

 

여기에서 주의해야 할 점! x,y가 우리에게 데이터셋으로 주어졌습니다.

따라서 우리는 b을 찾아야하는 것입니다.

즉, b0, b1의 값을 찾아 가는 과정을 학습이라고 부릅니다.

그렇다면 학습이란 바로(오차)를 줄여 나가는 것입니다.

 

 

아래는 오차를 나타냅니다.

그렇다면 오차란?

그리고 직선은 처음에 어디서 가져올까요?

 

모든 관측점(Observation) 에서의 y값의 error(오차)가 존재하고, 이 오차들의 총 합을 줄여 나가면 된다.
제곱을 하는 이유는? 5와 -5일 경우 오차가 0이 되기 때문에 버그가 일어난다 오차가 적을수록 똑똑한 인공지능이다

오차를 줄여 나가서, 최소값이 되는 직선을 찾으면 끝난다.

최소값이 될때의 어떤 값을 찾는 것일까

 

구글드라이브 import

from google.colab import drive
drive.mount('/content/drive')

필요한 라이브러리 import

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

Salary_Data.csv를 읽어 경력과 연봉의 관계 분석을 통해, 누군가 입사했을 때, 그 사람의 경력에 맞는 연봉을 제시해 줄 수 있도록 합니다.

Salary_Data.csv
0.00MB

df=pd.read_csv('/content/drive/MyDrive/위치/Salary_Data.csv')
#비어있는 데이터 확인
df.isna().sum()

# 없으면 X와 y로 분리
# X는 무조건 2차원이어야 합니다 따라서 슬라이싱 기호를 쓰면 2차원 데이터를 가져옵니다.
X=df.iloc[:,:-2+1]

#y는 1차원입니다. 그래서 소문자를 사용합니다.
y=df['Salary']

 

피쳐스케일링 합니다.

리니어 리그레션은 자체에서 피쳐스케일링을 해줍니다.

따라서 피쳐스케일링 하지않고 바로 데이터를 사용해도 됩니다.

 

학습용과 테스트용으로 데이터를 분리

Train / 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=21)
#test_size = 0.2는 만약 100개의 데이터가 있다면 80개는 train 20개는 test를 뜻합니다.
#random_state=21는 원하는 값 넣으시면 됩니다.

 

리니어 리그레션으로 모델링합니다.

from sklearn.linear_model import LinearRegression

인공지능을 우리 메모리에 생성해줍니다.

regressor = LinearRegression()

이 인공지능을 학습시킵니다.(학습은 X_train, y_train으로 학습시킵니다.)

regressor.fit(X_train,y_train)
학습이 끝나면, 이 인공지능이 얼마나 똑똑한지 테스트 해야합니다.
따라서 X_test 테스트용 데이터로 예측한 결과를 가져옵니다.
y_pred = regressor.predict(X_test)

 

MSE를 구합니다.

 

1. 오차(error) = 실제값 - 예측값

error = y_test - y_pred
error

2. 오차를 제곱하여 다 더합니다.

(error ** 2).sum()

3. 다 더한 값의 평균을 구한다 => MSE(Mean Sum of Squared Error)

   MSE가 작은 사람이 더 좋은 인공지능을 만든 것입니다.

(error ** 2).mean()

plt.plot(y_test.values)
plt.plot(y_pred)
plt.legend(['Real','Pred'])
plt.show()