본문 바로가기
데이터 시각화 및 애플리케이션 개발/AI 컴퓨터 비전프로젝트

[ML] 선형 회귀_Rent값 예측 모델 만들기(2)

by 바다의 공간 2024. 7. 4.

Rent값 예측 모델 만들기

전체 과정

  1. 데이터 분할: 데이터를 훈련 데이터와 테스트 데이터로 나누기.
  2. 모델 학습: 훈련 데이터를 사용해 모델을 학습시키기.
  3. 모델 평가: 테스트 데이터를 사용해 모델이 얼마나 잘 예측하는지 평가하기.
  4. 예측: 학습된 모델을 사용해 새로운 데이터의 임대료를 예측하기.

으로 구성되어있고 이번 글은  2번~4번에 해당하는 글 입니다.


 

2. 선형 회귀(Linear Regression)기법

*리니어=Linear

  • 데이터를 통해 데이터를 가장 잘 설명할 수 있는 직선으로 데이터를 분석하는 방법
    • 단순 선형 회기분석(단일 독립변수를 이용)-사실 잘 사용하지 않음(독립변수가 하나인경우는 거의 없기에..)
    • 다중 선형 회기분석(다중 독립변수를 이용)
from sklearn.linear_model import LinearRegression

사이킷런 안에있는 리니어 모델안에있는 리니어 레그레션을 이용하려 합니다.

lr = LinearRegression()

lr.fit(X_train, y_train)

객체를 만들고 fit(,학습) 시켜줄겁니다.

pred = lr.predict(X_test)

 

예측하기까까지 만들어줍니다.

 


3. 머신러닝 평가 지표 만들기 

-머신러닝, 딥러닝은 숫자이기때문에 숫자가 낮아지게 만드는게 더 좋다.

 

 

3-1. MSE(Mean Squared Error) (★)
  • 예측값과 실제값의 차이에 대한 제곱에 대해 평균을 낸 값
  • (1n)ni=1(yixi)2
  • 마이너스가 생기게되면 안되기에 제곱을 해줌

예측값과 실제값 제공

p = np.array([3,4,5]) #예측값
act = np.array([1,2,3]) #실제값

예측값과 실제값이 이미 틀려있습니다.

 

mse를 이용한 함수 만들기

def my_mse(pred, actual):
    return((pred - actual) **2).mean()

 

결과값 확인하기

my_mse(p, act)

# 4.0

4.0으로 나왔지만 숫자가 작아져야하기때문에 더 낮아지게 만들어야합니다.


3-2. MAE(Mean Absolute Error)

  • 예측값과 실제값의 차이에 대한 절대값에 대해 평균을 낸 값
  • (1n)ni=1|yixi|

 

def my_mae(pred, actual):
    return(pred - actual).mean()
   
my_mae(p, act)

#2.0

 

2가 나옵니다. 절대값을 씌었으니 제곱보다는 값이 적게 나옵니다.


3-3. RMSE(Root Mean Squared Error) (★)

  • 예측값과 실제값의 차이에 대한 제곱에 대해 평균을 낸 후 루트를 씌운 값

def my_rmse(pred, actual):
    return np.sqrt(my_mse(pred, actual))
    
    
my_rmse(p, act)
#2.0

 


사이킷런에있는 모듈 사용하기

from sklearn.metrics import mean_absolute_error, mean_squared_error

 

MAE

mean_absolute_error(p, act)

결과는 2.0이 나옵니다.

 

MSE

mean_squared_error(p, act)

결과는 4.0이 나옵니다.

 

 

RMSE

mean_squared_error(p, act, squared=False)

 

결과는 2.0이 나옵니다.


학습이 끝난 상태에서 얼마만큼 오차가 나 있는지 데이터를 가지고 확인하도록 하겠습니다

3-4. 평가지표 적용하기

mean_squared_error(y_test, pred)

#1426204740.330996
mean_absolute_error(y_test, pred)

#21997.237341647397
mean_squared_error(y_test, pred, squared=False)

#37765.125980605386

만큼의 오차가 발생했다고 합니다.

 

여기까지 예측선을 만들어놓은거라고 할 수 있습니다.


이상치에 대한 값을 뺀 후 학습 및 평가 해보기

-전처리를 조금 다르게 했을때의 차이를 알아보기

 

위에서 발견한 이상치인 1837을 drop해보려고 합니다.

만약 1837이 train에 있으면 잘 지워질거고 train에 없으면 에러가 나겠죠!

먼저 지워보겠습니다

X_train.drop(1837, inplace=True)
y_train.drop(1837, inplace=True)

에러가 나지 않았습니다. 즉 데이터에는 1837이 있다는것을 확인할 수 있었습니다.

 

이제는 train쪽에서 값을 지웠으니 이상치에 대한 값이 없다는거겠죠?

이상치가 사라진 값으로 다시 객체를 새롭게 만들어보겠습니다.

lr2 = LinearRegression()

새로 만든 이유는

전야학습때문에 그렇습니다. 기존에 있던 학습을 기반으로 해서 추가학습을 하게되면 성능이 좋아지니 

전처리를 다르게 한 의미가 없으니까 새로 만들었습니다.

그 후 다시 fit(학습) 하겠습니다.

lr2.fit(X_train, y_train)

 

 

 

4. 예측하기

pred2 =lr2.predict(X_test)

 

mean_squared_error(y_test, pred2, squared=False)

#37731.275512059074

 

이제 위에서 이상치가 있는 값이 있는 학습과

이상치를 뺀 학습의 비교를 해보겠습니다.

rmse   이상치 유 이상치 무
이름 pred rmse pred2 rmse
37765.125980605386 37731.275512059074
오차 차이 33.850468546423286

33.85정도로 오차값이 줄어든 이상치 무 가 더 성능이 좋다는것을 알게 되었습니다.

이로써 데이터 전처리가 왜 중요한지 알 수 있었습니다

 

 

 

리뷰

공부할 설명
lr.fit(X_train, y_train) 넣고픈 x,y레이블값을 넣으면 학습이 끝남