군침이 싹 도는 코딩

LinearRegression 본문

Python/Machine Learning

LinearRegression

mugoori 2022. 12. 1. 13:16

경력과 연봉이 있는 데이터 프레임을

리니어 리그레이션으로 모델링 해보자

 

 

1. nan 확인

df.isna().sum()
>>> YearsExperience    0
    Salary             0
    dtype: int64

# nan 이 없는것을 확인했다 만약 있다면 값을 바꿔줘야한다

 

 

2. X와 y로 분리

X = df.loc[:,'YearsExperience'].to_frame()
y = df['Salary']

# X는 경력 y는 연봉

 

 

 

3. 문자열 데이터를 숫자로 바꿔준다.

# 위 데이터 프레임은 문자열이 없으므로 생략

 

 

4. 피쳐 스케일링

# 리니어 리그레이션은 자체적으로 피쳐스케일링을 해주기때문에 생략

 

 

5. Training / 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=1)

train_test_split 을 import 한다
train_test_split 을 사용하여 트레이닝용 테스트용으로 분리한 4개를 변수로 저장

# random_state 는 랜덤의 시드값으로 같은값으로 설정할경우 다른컴퓨터에서도 똑같은 랜덤값이 나온다

 

 

6. 모델링한다

from sklearn.linear_model import LinearRegression

regressor = LinearRegression()

LinearRegression 을 import 한다
LinearRegression 을 변수 regressor에 저장

# 여기서 LinearRegression 을 사용하는 이유는 수치예측을 위해서이다

 

 

 

7. 인공지능을 학습시킨다

regressor.fit(X_train,y_train)

fit 함수를 이용해 분리했던 트레이닝셋을 넣어준다

# 위처럼 결과값이 나오면 성공이다

 

 

8. 학습이 끝난 인공지능을 테스트 해본다

regressor.predict(X_test)
>>> array([75074.50510972, 91873.8056381 , 62008.38247653, 81607.56642631,
           67608.14931932, 89073.92221671])
y_pred = regressor.predict(X_test)


분리한 테스트셋 X를 predict라는 예측하는 함수에 넣어서 예측값을 구한다
그 값을 y_pred에 저장

 

 

 

9. MSE ( mean  squard error) 를 구한다

y_test - y_pred
>>> 17     8013.494890
    21     6399.194362
    10     1209.617523
    19    12332.433574
    14    -6497.149319
    20     2664.077783
    Name: Salary, dtype: float64
error = y_test - y_pred
(error ** 2).mean()
>>> 51338023.49224842

실제값과 예측값을 뺀다
그 값을 error 라는 변수에 저장
error 를 제곱한 뒤 평균을 구한다

# 오차가 적을수록 그 인공지능이 유용하다 할수있는데 이를 숫자로 나타내는것이 MSE다

 

 

10. 실제값과 예측값을 차트로 그려본다

y_test
>>> 17    83088.0
    21    98273.0
    10    63218.0
    19    93940.0
    14    61111.0
    20    91738.0
    Name: Salary, dtype: float64
    
y_pred
>>> array([75074.50510972, 91873.8056381 , 62008.38247653, 81607.56642631,
           67608.14931932, 89073.92221671])
plt.plot(y_test.values)
plt.plot(y_pred)
plt.legend(['Real','Pred'])
plt.show()

실제값은 판다스 시리즈이므로 벨류값만 불러온다
예측값은 넘파이이므로 그대로 사용한다