
In [1]:
# Importing the libraries
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
In [2]:
df = pd.read_csv("../data/Salary_Data.csv")
In [3]:
df
Out[3]:
YearsExperience | Salary | |
---|---|---|
0 | 1.1 | 39343.0 |
1 | 1.3 | 46205.0 |
2 | 1.5 | 37731.0 |
3 | 2.0 | 43525.0 |
4 | 2.2 | 39891.0 |
5 | 2.9 | 56642.0 |
6 | 3.0 | 60150.0 |
7 | 3.2 | 54445.0 |
8 | 3.2 | 64445.0 |
9 | 3.7 | 57189.0 |
10 | 3.9 | 63218.0 |
11 | 4.0 | 55794.0 |
12 | 4.0 | 56957.0 |
13 | 4.1 | 57081.0 |
14 | 4.5 | 61111.0 |
15 | 4.9 | 67938.0 |
16 | 5.1 | 66029.0 |
17 | 5.3 | 83088.0 |
18 | 5.9 | 81363.0 |
19 | 6.0 | 93940.0 |
20 | 6.8 | 91738.0 |
21 | 7.1 | 98273.0 |
22 | 7.9 | 101302.0 |
23 | 8.2 | 113812.0 |
24 | 8.7 | 109431.0 |
25 | 9.0 | 105582.0 |
26 | 9.5 | 116969.0 |
27 | 9.6 | 112635.0 |
28 | 10.3 | 122391.0 |
29 | 10.5 | 121872.0 |
In [4]:
df.shape
Out[4]:
(30, 2)
In [6]:
df.describe()
Out[6]:
YearsExperience | Salary | |
---|---|---|
count | 30.000000 | 30.000000 |
mean | 5.313333 | 76003.000000 |
std | 2.837888 | 27414.429785 |
min | 1.100000 | 37731.000000 |
25% | 3.200000 | 56720.750000 |
50% | 4.700000 | 65237.000000 |
75% | 7.700000 | 100544.750000 |
max | 10.500000 | 122391.000000 |
In [8]:
# 기본적인 순서
# 1. nan 확인
df.isna().sum()
Out[8]:
YearsExperience 0 Salary 0 dtype: int64
In [ ]:
# 2. X와 y로 분리
In [11]:
X = df.loc[ : ,"YearsExperience"].to_frame()
In [12]:
X
Out[12]:
YearsExperience | |
---|---|
0 | 1.1 |
1 | 1.3 |
2 | 1.5 |
3 | 2.0 |
4 | 2.2 |
5 | 2.9 |
6 | 3.0 |
7 | 3.2 |
8 | 3.2 |
9 | 3.7 |
10 | 3.9 |
11 | 4.0 |
12 | 4.0 |
13 | 4.1 |
14 | 4.5 |
15 | 4.9 |
16 | 5.1 |
17 | 5.3 |
18 | 5.9 |
19 | 6.0 |
20 | 6.8 |
21 | 7.1 |
22 | 7.9 |
23 | 8.2 |
24 | 8.7 |
25 | 9.0 |
26 | 9.5 |
27 | 9.6 |
28 | 10.3 |
29 | 10.5 |
In [16]:
y = df['Salary']
In [17]:
y
Out[17]:
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
In [ ]:
# 3. 문자열 데이터는 숫자로 바꿔준다.
In [27]:
X.info()
<class 'pandas.core.frame.DataFrame'> RangeIndex: 30 entries, 0 to 29 Data columns (total 1 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 YearsExperience 30 non-null float64 dtypes: float64(1) memory usage: 368.0 bytes
In [28]:
y.info()
<class 'pandas.core.series.Series'> RangeIndex: 30 entries, 0 to 29 Series name: Salary Non-Null Count Dtype -------------- ----- 30 non-null float64 dtypes: float64(1) memory usage: 368.0 bytes
In [ ]:
# 4. 피처 스케일링
In [ ]:
# 지금 배우는 리니어 리그레션은
# 자체적으로 피쳐스케일링을 해줍니다.
# 따라서, 우리가 피처스케일링 할 필요가 없습니다.
In [ ]:
# 5. Traning / Test 셋으로 분리
In [21]:
from sklearn.model_selection import train_test_split
In [23]:
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=1)
In [ ]:
In [ ]:
# 모델링 한다!!!!
In [24]:
### 리니어 리그레이션으로 모델링 => 이것을 사용하는 이유?? 수치 예측이라서.
In [25]:
from sklearn.linear_model import LinearRegression
In [26]:
regressor = LinearRegression()
In [ ]:
# 인공지능을 학습시킨다.
In [29]:
X_train
Out[29]:
YearsExperience | |
---|---|
26 | 9.5 |
3 | 2.0 |
24 | 8.7 |
22 | 7.9 |
23 | 8.2 |
4 | 2.2 |
2 | 1.5 |
25 | 9.0 |
6 | 3.0 |
18 | 5.9 |
13 | 4.1 |
7 | 3.2 |
27 | 9.6 |
1 | 1.3 |
16 | 5.1 |
0 | 1.1 |
15 | 4.9 |
29 | 10.5 |
28 | 10.3 |
9 | 3.7 |
8 | 3.2 |
12 | 4.0 |
11 | 4.0 |
5 | 2.9 |
In [30]:
y_train
Out[30]:
26 116969.0 3 43525.0 24 109431.0 22 101302.0 23 113812.0 4 39891.0 2 37731.0 25 105582.0 6 60150.0 18 81363.0 13 57081.0 7 54445.0 27 112635.0 1 46205.0 16 66029.0 0 39343.0 15 67938.0 29 121872.0 28 122391.0 9 57189.0 8 64445.0 12 56957.0 11 55794.0 5 56642.0 Name: Salary, dtype: float64
In [31]:
regressor.fit(X_train, y_train)
Out[31]:
LinearRegression()In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
LinearRegression()
In [ ]:
# y = ax + b
# 랜덤으로 a 와 b 셋팅
# fit 함수를 실행하면,
# X_train, y_train 가지고
# 오차를 찾아서
# 오차가 최소가 되도록
# a와b 값을 세팅한다.!!
In [32]:
regressor.coef_ # coef == 계수 == a
Out[32]:
array([9332.94473799])
In [33]:
regressor.intercept_ # intercept == 상수 == b
Out[33]:
25609.89799835482
In [ ]:
# y = 9332.94473799 * x + 25609.89799835482
In [34]:
9332.94473799 * 1.2 + 25609.89799835482
Out[34]:
36809.43168394282
In [ ]:
# 학습이 끝나면, 이 인공지능이 얼마나 똑똑한지
# 테스트 해야 한다.
# 따라서, 테스트용 데이터인 X_test 로 테스트한다.
In [35]:
X_test
Out[35]:
YearsExperience | |
---|---|
17 | 5.3 |
21 | 7.1 |
10 | 3.9 |
19 | 6.0 |
14 | 4.5 |
20 | 6.8 |
In [37]:
y_pred = regressor.predict(X_test)
In [38]:
y_pred # 변수명은 이렇게 많이쓴다.
Out[38]:
array([75074.50510972, 91873.8056381 , 62008.38247653, 81607.56642631, 67608.14931932, 89073.92221671])
In [39]:
y_test
Out[39]:
17 83088.0 21 98273.0 10 63218.0 19 93940.0 14 61111.0 20 91738.0 Name: Salary, dtype: float64
In [41]:
# 오차 ( error ) 의 정의 : 실제값 - 예측값
# 똑똑한 인공지능이란?? 오차가 적은것!!!
In [43]:
y_test - y_pred
Out[43]:
17 8013.494890 21 6399.194362 10 1209.617523 19 12332.433574 14 -6497.149319 20 2664.077783 Name: Salary, dtype: float64
In [ ]:
# 성능 측정을 하기 위해서는
# 그냥 오차를 사용하면, 부호때문에, 이상하게 계산이 된다.
# 따라서 성능측정을 위해서는, 부호를 없애기 위해서
# 오차를 제곱해준다.
In [44]:
error = y_test - y_pred
In [45]:
error ** 2
Out[45]:
17 6.421610e+07 21 4.094969e+07 10 1.463175e+06 19 1.520889e+08 14 4.221295e+07 20 7.097310e+06 Name: Salary, dtype: float64
In [ ]:
# 마지막으로 제곱한 오차를 더하고, 평균을구한다.
In [47]:
(error ** 2).mean()
Out[47]:
51338023.49224842
In [48]:
# 오차를 구하고, 오차를 제곱한후에, 평균을 구한 값
# mean squared error => MSE
# MSE로 성능평가해서, 수치가 작을수록 좋은 인공지능이라는 뜻.
In [ ]:
In [49]:
# 실제값과 예측값을 차트로 그려본다.
In [50]:
y_test
Out[50]:
17 83088.0 21 98273.0 10 63218.0 19 93940.0 14 61111.0 20 91738.0 Name: Salary, dtype: float64
In [51]:
y_pred
Out[51]:
array([75074.50510972, 91873.8056381 , 62008.38247653, 81607.56642631, 67608.14931932, 89073.92221671])
In [52]:
y_test.values # 인덱스 제거
Out[52]:
array([83088., 98273., 63218., 93940., 61111., 91738.])
In [57]:
plt.plot(y_test.values)
plt.plot(y_pred)
plt.legend(["Real","Pred"])
plt.show()
'DataScience > MachineLearning' 카테고리의 다른 글
Machine 예측 모델 실습, 배포를 위한 저장 (0) | 2022.12.01 |
---|---|
Machine Multiple Linear Regression (0) | 2022.12.01 |
Machine preprocessing, Feature Scaling, Dataset Training & Test (0) | 2022.12.01 |
Machine 원핫 인코딩 (One Hot Encoding) (0) | 2022.12.01 |
Machine 레이블인코딩(Label Encoding) (0) | 2022.12.01 |