모델 평가 방법 정리

개요

이 노트는 지방세 세수 예측 모델의 성능을 평가하는 방법에 대해 설명합니다.

모델 평가와 지방세 세수 예측 성과 평가는 별개

모델 평가는 세수 예측 모델 자체의 성능만 평가합니다. 가령, 서울관악구 지방세를 예측했다면, 서울관악구 지방세의 예측 결과에 대해서만 평가합니다. 기초자치단체의 지방세 예측을 모두 모아서 서울시의 지방세 예측이나 전국 지방세 예측에 대한 평가는 별도로 이루어집니다.

평가 지표

  • MAPE (Mean Absolute Percentage Error): 평균 절대 백분율 오차
  • RMSE (Root Mean Squared Error): 평균 제곱근 오차

평가 방법

  • evaluate.py 스크립트를 사용하여 모델의 예측 결과를 평가합니다.
  • evaluate_and_compare 함수는 모델의 예측 결과와 실제 수입 데이터를 비교하여 MAPE와 RMSE를 계산합니다.
  • evaluate_predict 함수는 주어진 데이터프레임들에 대해 MAPE와 RMSE를 계산해줍니다.

평가 결과

  • 평가 결과는 results/predict_eval.xlsx 파일에 저장됩니다.
  • model_params, df_index, tax_type, pred_year, MAPE, RMSE 등의 컬럼을 포함합니다.

코드 스니펫

def evaluate_predict(grouped_dataframes, dfs):
    results = []
 
    for group_key, prediction_dataframe in grouped_dataframes.items():
        actual_dataframe = dfs[group_key[1]]
        actual_filtered = actual_dataframe[
            actual_dataframe.PRD_DE.astype("str") == str(group_key[3])
        ]
 
        if group_key[1] >= 3:
            actual_filtered = actual_filtered[
                actual_filtered.C2_NM == group_key[2]
            ].drop(columns=["C2_NM"])
 
        actual_filtered = actual_filtered.drop(columns=["PRD_DE"]).reset_index(
            drop=True
        )
        actual_filtered.columns = ["region", "actual"]
 
        prediction_dataframe = prediction_dataframe[["region", "predicted"]]
        combined_results = pd.merge(actual_filtered, prediction_dataframe, on="region")
 
        if not combined_results.empty:
            rmse = np.sqrt(
                mean_squared_error(
                    combined_results["actual"], combined_results["predicted"]
                )
            )
            mape = (
                mean_absolute_percentage_error(
                    combined_results["actual"], combined_results["predicted"]
                )
                * 100
            )
 
            results.append(
                {
                    "model_params": group_key[0],
                    "df_index": group_key[1],
                    "tax_type": group_key[2],
                    "pred_year": group_key[3],
                    "MAPE": mape,
                    "RMSE": rmse,
                }
            )
 
    return pd.DataFrame(results)

추가 정보