경력과 연봉의 관계를 분석하여, 경력이 주어졌을때 연봉을 예측하려 한다.
데이터를 살펴보니, 아래와 같은 그래프로 나왔다고 가정했을 때,
아래 그림처럼, 해당 분포를 만족하는 직선을 찾으려 하는것이 목표다
직선을 찾기 위해서는, 우리가 잘 아는 직선의 방정식을 이용하여, 직선의 기울기와 y절편을 구하면 되는것이다.
여기에서 주의! x, y 가 우리에게 데이터셋으로 주어졌다. 따라서 우리는 b 를 찾아야 하는것이다.
즉, b0, b1 의 값을 찾아 가는 과정을 학습이라고 부른다!
#그렇다면 학습이란??? 바로 error(오차)를 줄여 나가는 것이다.
아래는 오차를 나타낸다.
그렇다면 오차란?
그리고 직선은 처음에 어디서 가져오지?
모든 관측점(Observation) 에서의 y값의 error(오차)가 존재하고, 이 오차들의 총 합을 줄여 나가면 된다.
제곱을 하는 이유는?
오차를 줄여 나가서, 최소값이 되는 직선을 찾으면 끝난다.
최소값이 될때의 어떤 값을 찾는 것인가?
# Importing the libraries
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
‘Salary_Data.csv’ 를 읽으세요. 경력과 연봉의 관계 분석을 통해, 누군가 입사했을 때, 그사람의 경력에 맞는 연봉을 제시해 줄 수 있도록 합니다.
df = pd.read_csv('Salary_Data.csv')
# 비어있는 데이터 확인
df.isna().sum()
YearsExperience 0
Salary 0
dtype: int64
# X와 y 로 분리
# X 는 무조건 2차원 배열이여야 한다.
# 슬라이싱하여 2차원 데이터로 가져옴
X = df.iloc[:, :-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 = 3)
## 리니어 리그레이션으로 모델링한다.
from sklearn.linear_model import LinearRegression
# 인공지능을 메모리에 생성해준다.
regressor = LinearRegression()
# 이 인공지능을 학습시킨다. 학습은, X_train , y_train 으로 학습시킨다.
regressor.fit(X_train, y_train)
LinearRegression()
# 학습이 끝나면, 이 인공지능이 얼마나 똑똑한지 테스트를 해야한다.
# 따라서 X_test 테스트용 데이터로 예측한 결과를 가져온다.
y_pred = regressor.predict(X_test)
# MSE 를 구한다.
# 1. 오차(error) = 실제값 - 예측값
error = y_test - y_pred
# 2. 오차를 제곱하여 다 더한다.
(error ** 2).sum()
87386341.84040895
# 3. 다 더한값의 평균을 구한다. => MSE (Mean Sum of Squared Error)
# MSE 가 작은 사람이 더 좋은 인공지능 만든 것
(error ** 2).mean()
14564390.306734825
y_test
15 67938.0
5 56642.0
22 101302.0
26 116969.0
18 81363.0
14 61111.0
Name: Salary, dtype: float64
y_pred
array([ 52102.91433294, 102050.58797689, 99223.36116686, 121841.17564714,
37024.37134609, 91684.08967343])
# 테스트 시각화
plt.plot(y_test.values)
plt.plot(y_pred)
plt.legend(['Real','Pred'])
plt.show()