AI 이론/Prediction (supervised)

[머신러닝] Linear Regression

jasonshin 2021. 11. 24. 17:41

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

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

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

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

여기에서 주의! x, y 가 우리에게 데이터셋으로 주어졌다. 따라서 우리는 b 를 찾아야 하는것이다.

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

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

아래는 오차를 나타낸다.

그렇다면 오차란?

그리고 직선은 처음에 어디서 가져오지?

모든 관측점(Observation) 에서의 y값의 error(오차)가 존재하고, 이 오차들의 총 합을 줄여 나가면 된다.

제곱을 하는 이유는?

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

최소값이 될때의 어떤 값을 찾는 것인가?

Type Markdown and LaTeX: 𝛼2

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

# 비어있는 데이터가 있는 지 확인
df.isna().sum()

YearsExperience    0
Salary             0
dtype: int64

# 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=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

 

error

15   -4410.745198
5     3130.388749
22     697.553880
26    1294.846723
18    -404.312172
14   -7470.318409
Name: Salary, dtype: float64

 

# 2. 오차를 제곱하여 다 더한다.
(error ** 2).sum()

87386341.84040895

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

 

(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([ 72348.74519846,  53511.61125108, 100604.44611953, 115674.15327744,
        81767.31217215,  68581.31840899])

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

반응형