개발공부

Linear Regression 본문

Python/Machine Learning

Linear Regression

mscha 2022. 5. 9. 18:00

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

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

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

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

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

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

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

아래는 오차를 나타낸다. 

 

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

 

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

 

이제 실제 데이터를 가지고 실습해보자.

Salary_Data.csv
0.00MB

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

df = pd.read_csv('data/Salary_Data.csv')
df.head()

>>> df.shape
(30, 2)

# Nan 값이 있는지 찾기
>>> df.isna().sum()
YearsExperience    0
Salary             0
dtype: int64
# YearsExperience의 데이터를 X로 만들기
>>> X = df.iloc[:, 0]

>>> X.shape
(30,)

# X 2차원이어야 학습이 가능하다
# 왜냐하면 인공지능 학습하는 함수인 fit 함수는
# X값은 2차원으로 넣어야 동작하기 때문이다.
>>> X = X.values.reshape(30, 1)
>>> X

array([[ 1.1],
       [ 1.3],
       [ 1.5],
       [ 2. ],
       [ 2.2],
       [ 2.9],
       [ 3. ],
       [ 3.2],
       [ 3.2],
       [ 3.7],
       [ 3.9],
       [ 4. ],
       [ 4. ],
       [ 4.1],
       [ 4.5],
       [ 4.9],
       [ 5.1],
       [ 5.3],
       [ 5.9],
       [ 6. ],
       [ 6.8],
       [ 7.1],
       [ 7.9],
       [ 8.2],
       [ 8.7],
       [ 9. ],
       [ 9.5],
       [ 9.6],
       [10.3],
       [10.5]])
# Salary의 데이터를 y로 만들기

y = df['Salary']
0      39343.0
1      46205.0
2      37731.0
3      43525.0
4      39891.0
5      56642.0
6      60150.0
7      54445.0
8      64445.0
9      57189.0
10     63218.0
11     55794.0
12     56957.0
13     57081.0
14     61111.0
15     67938.0
16     66029.0
17     83088.0
18     81363.0
19     93940.0
20     91738.0
21     98273.0
22    101302.0
23    113812.0
24    109431.0
25    105582.0
26    116969.0
27    112635.0
28    122391.0
29    121872.0
Name: Salary, dtype: float64
# 피처스케일링한다.
#### 리니어 리그레이션 라이브러리는, 자체에서 피처스케일링을 해준다
#### 따라서 바로 데이터를 사용해도 된다,.

# 학습용과 테스트용으로 데이터 분리한다.

>>> 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()
LinearRegression()

 

# 학습이 끝나면, 
# 이 인공지능이 얼마나 똑똑한 인공지능인지 테스트 해야 한다.

# 리그레션의 테스트는 MSE를 구해본다.
# 인공지능한테, 우리가 학습에 사용하지 않는 데이터를
# 넣어서 결과를 가져온다, 이 값이 바로 y hat이다.

>>> y_pred = regressor.predict(X_test)
>>> y_pred
array([ 72348.74519846,  53511.61125108, 100604.44611953, 115674.15327744,
        81767.31217215,  68581.31840899])
>>> y_test
15     67938.0
5      56642.0
22    101302.0
26    116969.0
18     81363.0
14     61111.0
Name: Salary, dtype: float64

# 오차를 구해본다.
# 오차 = 실제값 - 예측값
>>> error = y_test - y_pred

# MSE 값이 적을수록 성능이 좋다고 할 수 있다.
# MSE = Mean Squared Error
>>> (error ** 2).mean()
14564390.306734825

이를 차트로 확인해보자.

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