본문 바로가기

딥러닝과 머신러닝

Linear Regression, MSE, MAE, RMSE(2024-06-11)

 1. Rent 데이터셋

 
import numpy as np
import pandas as pd
import seaborn as sns
 

 

데이터 설정

 
rent_df = pd.read_csv('/content/drive/MyDrive/KDT 국비지원/6. 머신러닝과 딥러닝/Data/rent.csv')
 

 

 
rent_df.head()
 

 
rent_df.info()
 

 

 

 
round(rent_df.describe(), 2) # 소수점 2자리까지 반올림
 

 

 
rent_df['Rent'].sort_values()
 

 

 
sns.boxplot(rent_df['Rent'])
 

 

 
rent_df.isna().sum() # null값  확인
 

 

 
rent_df.dropna(subset= ['BHK']) # BHK 값이 null인  데이터를 삭제
 
 
na_index = rent_df[rent_df['Size'].isna()].index # Size값이 null인 index값
na_index
 

 

 

 
rent_df['Size'].fillna(rent_df['Size'].median()).loc[na_index]
 

 

 

 

 
rent_df.info()
 

 

 

 
rent_df = pd.get_dummies(rent_df, columns=['Area Type', 'City', 'Furnishing Status'])
 

 

# 차원이 있는 행렬값은 대문자
# 1차원은 소문자 (리스트여도)
# 관례적임

X = rent_df.drop('Rent',axis=1) # 독립변수
y = rent_df['Rent'] # 종속변수

 

 

 
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=2024)
X_train.shape, X_test.shape, y_train.shape, y_test.shape
 

 2. 선형 회귀(Linear Regression)

* 데이터를 통해 데이터를 가장 잘 설명할 수 있는 직선으로 데이터를 분석하는 방법
  * 단순 선형 회귀분석(단일 독립변수를 이용)
  * 다중 선형 회귀분석(다중 독립변수를 이용)

 

 
from sklearn.linear_model import LinearRegression
lr = LinearRegression() #객체
lr.fit(X_train, y_train) #학습
pred = lr.predict(X_test
 

 

 3. 평가지표 만들기

 3-1. MSE(Mean Squared Error)

* 예측값과 실제값의 차이에 대한 제곱에 대해 평균을 낸 값
  * 실제값이 예측값보다 클 수도 작을 수도 있으니 제곱을 안하면 음수/양수 구분이 안됨

 

 
p = np.array([3, 4, 5]) # 예측값
act = np.array([1, 2, 3]) # 실제값
 
 
def my_mse(pred, actual):
  return ((pred- actual) **2).mean()
 
 
my_mse(p, act) # 4.0
 

 3-2. MAE(Mean Absolute Error)

* 예측값과 실제값의 차이에 대한 절대값에 대해 평균을 낸 값
  * 오차 값을 줄이기 위해 기울기를 수정하는 과정에서 미분 연산을 하는데 절대값은 미분이 어렵기 때문에 잘 사용하지 않음
  * 장점 : 제곱을 하지 않기 때문에 숫자가 작아서 컴퓨터가 연산할 때 부담이 적다

 

 
# abs = 절대값
def my_mae(pred, actual):
  return np.abs(pred - actual).mean()
 
 
my_mae(p, act)
 

 3-3. RMSE(Root Mean Squared Error)

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

 

 
# sqrt = 루트  /  squared true 인것 같은
def my_rmse(pred, actual):
  return np.sqrt(my_mse(pred, actual))
 
 
my_rmse(p, act)
 

 

 

 

 
from sklearn.metrics import mean_absolute_error, mean_squared_error
 
mean_absolute_error(p, act) # MAE 2.0
 
mean_squared_error(p, act) # MSE 4.0
 
mean_squared_error(p, act, squared=False) # RMSE 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

 

# 아웃라이어로 생각되는 데이터를 삭제 시킨 후 학습을 다시하고 평가지표 변화 체크
X_train.drop(1837, inplace=True)
y_train.drop(1837, inplace=True)
# 1837이 train 즉 학습하는 데이터 안에 있다면 실행이 되고 오류가 발생하면 X_test안에 들어있었을 것
 
lr.fit(X_train, y_train) #다시 학습
 
pred = lr.predict(X_test)
mean_squared_error(y_test, pred, squared=False) # 37731.275512059074
 
# 1837 삭제전 : 37765.125980605386
# 1837 삭제후 : 37731.275512059074
37765.125980605386 - 37731.275512059074
# 33.850468546312186 만큼 오차가 줄었음