파이썬 - Linear-Regression
Linear Regression 이란
경력과 연봉의 관계를 분석하여, 경력이 주어졌을때 연봉을 예측하려 한다.
데이터를 살펴보니, 아래와 같은 그래프로 나왔다고 가정했을 때,
아래 그림처럼, 해당 분포를 만족하는 직선을 찾으려 하는것이 목표다
직선을 찾기 위해서는, 우리가 잘 아는 직선의 방정식을 이용하여, 직선의 기울기와 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')
1. 비어있는 데이터 확인
# 비어있는 데이터 확인
df.isna().sum()
YearsExperience 0
Salary 0
dtype: int64
2. 데이터 가공
# X와 y 로 분리
# X 는 무조건 2차원 배열이여야 한다.
# 슬라이싱하여 2차원 데이터로 가져옴
X = df.iloc[:, :-1]
# y는 1차원 배열이다. 따라서 소문자를 사용한다.
y = df['Salary']
# 피쳐 스케일링 한다.
### 리니어 리그레션은 자체에서 피쳐스케일링 해 주므로
### 따로 피쳐스케일링 하지 않고 데이터를 사용해도 된다.
3. 데이터 분리 및 모델링 학습
# 학습용과 테스트용으로 데이터를 분리!
# 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()
4. 모델링 테스트
# 학습이 끝나면, 이 인공지능이 얼마나 똑똑한지 테스트를 해야한다.
# 따라서 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()
댓글남기기