AI SCHOOL

[ML] ExtraTreesRegressor / 회귀 모델 평가 지표(MAE, MSE, RMSE, r2_Score)

moru_xz 2023. 3. 18. 19:00
  • Ordinal Encoding
train['YME'] = train['YM'].astype('category').cat.codes
  • ExtraTreesRegressor
from sklearn.ensemble import ExtraTreesRegressor
model = ExtraTreesRegressor(random_state=42)
  • 평가
# R-squared(결정계수)
from sklearn.metrics import r2_score
r2_score(y_train, y_valid_predict)

# MAE(Mean Absolute Error)
# 틀린 값에 대한 절대값만 보고자 한다면
from sklearn.metrics import mean_absolute_error
mean_absolute_error(y_train, y_valid_predict)

# MSE(Mean Squared Error)
# 많이 틀릴 수록 패널티를 더 주고자 하면
from sklearn.metrics import mean_squared_error
mean_squared_error(y_train, y_valid_predict)

# RMSE(Root Mean Squared Error)
# 틀린 값에 대한 편차를 보고자 한다면
mean_squared_error(y_train, y_valid_predict)**0.5

# RMSLE(Root Mean Squared Logarithmic Error)
# 적게 틀린 것에 더 패널티를 주고 아주 많이 틀린 것에 좀 더 적게 패널티를 주고자 한다면
from sklearn.metrics import mean_squared_log_error
np.sqrt(mean_squared_log_error(y_train, y_valid_predict))
  • kaggle 제출
# 답안지 양식을 불러오기
submit = pd.read_csv('data/bike/sampleSubmission.csv')

# 예측한 값을 답안지에 옮겨 적기
submit['count'] = y_predict

# 캐글에 제출하기 위해 csv 파일로 저장
file_name = f'data/bike/sumbit_{rmsle:.5f}.csv'
submit.to_csv(file_name, index = False)

 


데이터셋 확인 및 전처리

데이터셋:  Bike Sharing Demand - Bike Sharing Demand | Kaggle 

train = pd.read_csv('data/bike/train.csv')
test = pd.read_csv('data/bike/test.csv')
set(train.columns) - set(test.columns)

-> test 데이터에 정답값 없음

 

  • Ordinal-Encoding

- 범주형 변수를 순서 고려한 숫자로 인코딩 하는 방법

- 예를 들어, 학생들의 성적을 A, B, C, D, F로 나타내는 등급 변수가 있다면, 이를 1, 2, 3, 4, 5와 같은 숫자로 변환 -> 이때 숫자는 등급이 높아질수록 증가하도록 부여

- Ordinal Encoding은 One-Hot Encoding과는 달리, 각 범주형 변수마다 새로운 컬럼을 생성하지 않음 -> 데이터 차원 줄일 수 있음 

- 범주형 변수의 값이 순서에 따라 일정한 의미를 가질 때(등급, 크기, 순서)에 효과 but, 범주형 변수의 값이 순서와 상관 없는 경우(색상, 국가, 동물)에는 성능 떨어질 수 있음 

train["datetime"] = pd.to_datetime(train["datetime"])

train["year"] = train["datetime"].dt.year
train["month"] = train["datetime"].dt.month
train["day"] = train["datetime"].dt.day
train["hour"] = train["datetime"].dt.hour
train["minute"] = train["datetime"].dt.minute
train["second"] = train["datetime"].dt.second
train["dayofweek"] = train["datetime"].dt.dayofweek
train["YM"] = train["datetime"].astype(str).str[:7]

train["YME"] = train["YM"].astype("category").cat.codes

train.iloc[:2, -8:]

-> test도 똑같이 해야

 

EDA

- histogram 그리기

- 서로 상관관계가 높을 것으로 보이는 열들로 scatter plot 그리기

train[["temp", "atemp"]].corr()

sns.scatterplot(data=train, x="temp", y="atemp")

train[(train["temp"] > 25) & (train["atemp"] < 20)]

-> 2012-08-17 0~23 시까지 측정이 잘못되었다고 보여짐

 

sns.barplot(data=train, x="month", y="count", errorbar=None)

sns.barplot(data=train, x="hour", y="count", errorbar=None)

-> y축의 값의 default는 평균 -> count로 시각화하니 전혀 다른 모습을 보임

sns.barplot(data=train, x="day", y="count", errorbar=None)

-> 19일까지 밖에 없음

학습, 예측 데이터셋 나누기

# 정답값
label_name = "count"

# feature_names : 학습, 예측에 사용할 컬럼명(변수)
feature_names = train.columns.tolist()
feature_names.remove(label_name)
feature_names.remove('casual')
feature_names.remove('registered')
feature_names.remove('datetime')
feature_names.remove('minute')
feature_names.remove('second')

feature_names = ['season', 'holiday', 'workingday', 'weather', 'temp',
       'atemp', 'humidity', 'windspeed', 'year', 'hour', 'dayofweek']
       
# 학습에 사용할 데이터셋
X_train = train[feature_names]

# 학습에 사용할 정답값
y_train = train[label_name]

# 예측에 사용할 데이터셋
X_test = test[feature_names]

 

ExtraTreesRegressor

from sklearn.ensemble import ExtraTreesRegressor

model = ExtraTreesRegressor(random_state=42)

 

교차검증

from sklearn.model_selection import cross_val_predict

y_valid_predict = cross_val_predict(model, X_train, y_train, 
                                    cv=5, n_jobs=-1, verbose=2)
y_valid_predict[:2]

평가

- 회귀 문제는 Accuracy 로 평가가 적합하지 않음

-> 예를 들어 부동산 가격을 예측한다고 했을 때,  억단위 부동산이라면 정확하게 원단위까지 예측하기가 어려움

  • R-squared (결정 계수, Coefficient of Determination)
    : R-squared는 모델이 실제 데이터를 얼마나 잘 설명하는지를 나타내는 지표
    1에 가까울수록 모델이 데이터를 잘 설명한다는 의미입니다. R-squared가 높을수록 모델의 성능이 좋다고 판단
  • MAE (Mean Absolute Error)
    : MAE는 실제값과 예측값의 차이를 절대값으로 평균한 값
    MAE가 작을수록 모델의 성능이 좋다고 판단
    틀린 값에 대해 절댓값만 볼 때
  • MSE (Mean Squared Error)
    : MSE는 실제값과 예측값의 차이를 제곱하여 평균한 값
    MSE가 작을수록 모델의 성능이 좋다고 판단
    많이 틀릴 수록 패널티를 줄 때 -> 오차에 제곱을 하기 때문
  • RMSE (Root Mean Squared Error)
    : RMSE는 MSE의 제곱근
    따라서 MSE와 달리 단위가 원래 단위로 돌아옴
    RMSE가 작을수록 모델의 성능이 좋다고 판단
    틀린 값에 대해 편차를 볼 때 -> 루트를 씌워줘서 MSE보다 이상치에 덜 민감 => 이상치가 크게 중요하지 않을 분야에서 평가할 때 
  • RMSLE(Root Mean Squared Logarithmic Error)

 

  • 교차 검증한 결과를 평가
# R-squared(결정계수)
from sklearn.metrics import r2_score
r2_score(y_train, y_valid_predict)

# MAE(Mean Absolute Error)
# 틀린 값에 대한 절대값만 보고자 한다면
from sklearn.metrics import mean_absolute_error
mean_absolute_error(y_train, y_valid_predict)

# MSE(Mean Squared Error)
# 많이 틀릴 수록 패널티를 더 주고자 하면
from sklearn.metrics import mean_squared_error
mean_squared_error(y_train, y_valid_predict)

# RMSE(Root Mean Squared Error)
# 틀린 값에 대한 편차를 보고자 한다면
mean_squared_error(y_train, y_valid_predict)**0.5

# RMSLE(Root Mean Squared Logarithmic Error)
# 적게 틀린 것에 더 패널티를 주고 아주 많이 틀린 것에 좀 더 적게 패널티를 주고자 한다면
from sklearn.metrics import mean_squared_log_error
np.sqrt(mean_squared_log_error(y_train, y_valid_predict))

 

학습과 예측

y_predict = model.fit(X_train, y_train).predict(X_test)

 

제출

# 답안지 양식 불러오기
submit = pd.read_csv("data/bike/sampleSubmission.csv")

# 예측한 값을 답안지에 옮겨 적기
submit["count"] = y_predict
submit.head(3)

# 저장
file_name = f"data/bike/submit_{rmsle:.5f}.csv"
submit.to_csv(file_name, index=False)

 


  • 이상치(outlier)와 오류(error)

- 이상치: 일반적인 값들과 동떨어진 값, 다른 데이터와는 매우 다른 값을 가지는 데이터

- 오류: 데이터 수집 과정에서 발생한 문제로 인한 값

 

  • scatterplot, residplot, regplot
Scatterplot - 두 개의 변수 간의 관계를 살펴보는 데에 사용되는 산점도 그래프
- 두 변수 간의 상관 관계를 파악할 수 있으며, 회귀 분석을 수행하기 전에 두 변수 간의 관계를 살펴볼 수 있음
Residplot - 회귀 분석에서 잔차(residual)를 시각화하는 데에 사용되는 그래프
- 잔차는 예측 값과 실제 값 사이의 차이이며, 잔차가 크면 모델이 정확하지 않은 것을 의미
- residplot을 통해 잔차의 패턴을 파악하여 모델이 적절한지 여부를 판단할 수 있음
Regplot - 두 변수 간의 선형 회귀 분석 결과를 시각화하는 그래프
- regplot은 scatterplot과 유사하게 두 변수 간의 관계를 살펴보지만, 추가적으로 회귀 분석 결과를 함께 시각화
- 이를 통해 두 변수 간의 선형 관계와 회귀 분석의 적합성을 파악할 수 있음

=> catterplot은 두 변수 간의 관계를 파악하기 위해, residplot은 회귀 분석의 잔차를 시각화하기 위해, regplot은 두 변수 간의 선형 회귀 분석 결과를 시각화하기 위해 사용

 

  • 오차(Error)와 잔차(Residual)
  오차(Error) 잔차(Residual)
정의 실제값과 예측값의 차이 실제값과 모델 예측값의 차이
계산 방법 오차 = 실제값 - 예측값 잔차 = 실제값 - 모델 예측값
특징 모델의 정확성 측정 모델의 적합성 측정
사용 모델 평가, 예측 성능 평가 회귀 분석에서 모델 적합성 평가