(3) 과정에서 모델을 만들었다.
이 모델의 성능은 어떨까?
이번엔 model validation(모델 검증)을 통해 모델의 성능(품질)을 측정해보자.
모델을 개선하기 위해서 모델의 성능을 검사하는 것은 매우 중요하다.
Model Validation:
모델의 예측 정확도
그런데 이 예측 정확도를 측정할 때 주의할 사항이 있다.
자주 하는 실수
: 훈련 데이터를 사용해 예측을 하고, 훈련 데이터의 target 값과 비교하기
1만채의 주택에 대한 예측 가격과 실제 주택 가격을 비교하면 좋은 결과와 나쁜 결과가 섞여 있는 것을 확인할 수 있다.
1만개의 예측값과 실제 값의 목록을 살펴보는 것은 별로 의미가 없다. 너무 많아서 확인하기 어렵기 때문.
하나의 측정 지표로 확인해야 한다.
모델의 성능을 나타내는 지표는 많지만,
MAE(Mean Absolue Error, 평균절대오차) 를 이용하는 방법부터 시작해보자
각 주택에 대한 예측 오차 :
error = actual - predicted
즉, 만약 집값이 $150,000 이고
내가 예측한 가격이 $100,000 라면
오차는 $50,000 이다.
오차의 절대값을 얻은 다음,
오차의 절대값의 평균을 취하면
이게 모델 성능의 척도가 된다.
MAE를 계산하려면, 우선 모델이 필요하다.
(3)까지의 과정으로 만든 모델을 가져오자.
import pandas as pd
# 데이터 불러오기
melbourne_file_path = '../input/melbourne-housing-snapshot/melb_data.csv'
melbourne_data = pd.read_csv(melbourne_file_path)
# 집값이 누락된 집의 데이터 제거
filtered_melbourne_data = melbourne_data.dropna(axis=0)
# target, feature 선택하기
y = filtered_melbourne_data.Price
melbourne_features = ['Rooms', 'Bathroom', 'Landsize', 'BuildingArea',
'YearBuilt', 'Lattitude', 'Longtitude']
X = filtered_melbourne_data[melbourne_features]
from sklearn.tree import DecisionTreeRegressor
# 모델 정의
melbourne_model = DecisionTreeRegressor()
# 모델 적합시키기(model fitting)
melbourne_model.fit(X, y)
MAE 계산하는 방법 :
sci-kit 라이브러리로 빠르게 불러올 수 있다.
from sklearn.metriccs import mean_absolute_error
predicted_home_price = melbourne_model.predict(X)
mean_absolute_eorr(y, predicted_home_price)
[결과] 434.71594577146544
방금 계산한 측정 값은, "In-Sample(표본 내)" 점수라고 할 수 있다.
우리는 모델을 구축하고 평가하는데에 "샘플"을 사용했다.
이게 안좋은 이유는 다음과 같다.
예를 들어, 모델링에 사용한 데이터 상에서는 초록색 문이 있는 모든 주택의 가격이 매우 비쌌다.
모델의 역할은 집값을 예측하는데 필요한 패턴을 찾는 것이므로, '초록색 문=비싼 집'이라는 패턴을 보고 항상 초록색 문이 있는 집은 높은 가격으로 예측할 것이다.
그런데, 모델링의 데이터보다 훨씬 큰 실제 부동산 시장에서는 문 색상과 주택 가격이 관련이 없을 수도 있다.
모델이 발견한 패턴은 훈련 데이터에서 나온 것이므로, 모델은 훈련 데이터에 대해서 정확하게 나타난다.
그러나, 모델이 새로운 데이터를 볼 때 이 패턴이 유지되지 않는다면 매우 부정확해지는 것이다.
따라서, 모델의 실질적인 가치는 "새로운 데이터에 대한 예측"에 있으므로 모델링에 사용되지 않은 데이터에 대한 성능을 측정해야 한다.
이를 위한 가장 간단한 방법은,
모델 학습 과정에 일부 데이터를 제외하고,
이 제외한 데이터로 모델의 성능을 평가하는 것이다.
이 제외된 데이터는 학습 과정에 사용되지 않으므로,
"이전에 본 적 없는 새로운 데이터"의 역할을 수행하게 되는 것이다.
이 데이터를 검증 데이터(validation data) 라고 한다.
scikit-learn 라이브러리는 데이터를 두 개로 쪼개기 위한 함수인 train_test_split
를 제공한다.
mean_absolute_error
를 계산하기 위해,
일부는 모델 적합(fitting)을 위해 training data로 사용하고,
나머지는 validation data로 사용할 것이다.
from sklearn.model_selection import train_test_split
train_X, val_X, train_y, val_y = train_test_split(X, y, random_state = 0)
# 모델 정하기
melbourne_model = DecisionTreeRegressor()
# fit model
melbourne_model.fit(train_X, train_y)
# validation data에 대한 예상 가격 가져오기
val_predictions = melbourne_model.predict(val_X)
print(mean_absolute_error(val_y, val_predictions))
[결과] 265806.91478373145
앞에서 In-sample 데이터의 MSE는 약 500 달려였는데,
Out-of-sample 데이터(validation data)의 MSE는 25만 달러가 넘는다.
이게 바로 거의 정확히 맞는 모델과 실제 상황(목적)에서 사용할 수 없는 모델의 차이이다.
참고로, validation data의 평균 집값은 110만 달러이다.
따라서 새 데이터에서의 오차는 평균 집값의 1/4 이다.
더 나은 feature를 찾거나 다른 모델을 적용하는 등의 여러 방법으로 이 모델을 개선할 수 있다.
이번 공부에 대한 검증은 요기서 스스로 코드를 진행해보며 할 수 있다! : Model Validation