( New ) 新連載スタート!2人の会話形式でPythonを学ぶ「週末Pythonゆる講座」はこちら ▶▶

【機械学習】回帰の評価指標RMSE(平均平方二乗誤差)を分かりやすく解説

回帰の評価指標

今回は機械学習のモデル評価についてご紹介します

特に「回帰」と呼ばれる機械学習モデルの精度の高さを検証する方法をご説明します

回帰とは収益の予測や株価などの、「数値」を予測します

機械学習モデルの回帰のイメージ

数値を予測する回帰モデルですが、どのくらい予測値が正しいか評価する必要があります

手法として「RMSE:Root Mean Squared Error」と呼ばれる指標についてご説明していきます

RMSEのグラフイメージ

RMSEを使うと予測した値が実際の値(真の値)とどれくらい乖離しているかを、定量的把握することができます

数式からPythonでの実装方法までご説明します

RMSE(平均平方二乗誤差)

RMSEは回帰タスクで最も代表的な指標で、「Root Mean Squared Error」の略です

平均平方二乗誤差とも呼ばれる指標で、各レコードの「真の値」と「予測値」の差分を二乗して、平均を取った後に平方根を取ると算出できます

RMSE(平均平方二乗誤差)

RMSEは最小値=0で、小さければ小さいほど良い指標です

正解の値と予測の値の差分を小さくするように機械学習モデルを修正します

Pythonでの算出方法

PythonでRMSEを算出するにはsklearnmean_squared_errorを利用します

実はRMSE単体の関数ではなく、平方根(Root)が無い数値が算出されるため、Numpyで平方根を付ける必要があります

from sklearn.metrics import mean_squared_error
import numpy as np

実数値と予測値の2つを用意して、mean_squared_errorに代入します

そこからsqrtを利用して、平方根を取ります

y_test = [100,120,80]
y_pred = [110,130,70]
rmse = np.sqrt(mean_squared_error(y_test,y_pred))
rmse
rmse = np.sqrt(mean_squared_error(y_test,y_pred))

機械学習モデルでの実践

最後に機械学習モデルを使ってRMSEを算出する流れをご紹介します

事前準備

SeabornTipsデータソースを使います

外国の食文化の一つである「チップ」についてのデータで、総額や性別、曜日やタバコの有無などから「チップ」の額を予測します

import seaborn as sns
import pandas as pd
df = sns.load_dataset('tips')
df.head()
df = sns.load_dataset('tips')

続いて説明変数(df_x)と目的変数(df_y)に分けて、get_dummiesで前処理をしておきます

df_x = df.drop('tip', axis=1)
df_x = pd.get_dummies(df_x)
df_y = df['tip']

機械学習の予測

ランダムフォレスト(RandomForestRegressor)を使ってチップの額を予測します

変数pred_mlにチップの予測金額を代入します

from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestRegressor

train_x, test_x, train_y, test_y = train_test_split(df_x, df_y,random_state=1)
model = RandomForestRegressor(n_estimators=100,random_state=1)
model.fit(train_x,train_y)
pred_ml = model.predict(test_x)

そして比較対象のため、もう一つチップの予測を行います

慣習としてチップの額は「食事の総額の20%」と言われているため、単純にtotal_bill(総額)を20%した数値を変数pred_tipとします

pred_tip = test_x['total_bill']*0.2

RMSEで精度を比較

テスト用の実数test_yを正解として、この2つをRMSEで比較します

from sklearn.metrics import mean_squared_error

rmse_ml = np.sqrt(mean_squared_error(test_y,pred_ml))
rmse_tip = np.sqrt(mean_squared_error(test_y,pred_tip))

print('rmse_ml',rmse_ml)
print('rmse_tip',rmse_tip)

前述したとおり、RMSE小さければ小さいほど良い指標です

機械学習モデルで予測した方が、雑に20%した方よりRMSEの値が小さい=精度が高いことが分かりました

まとめ

今回は機械学習モデルの回帰タスクを評価する指標であるRMSEについてご紹介してきました

回帰タスクで代表的な指標なので、ぜひ覚えて使ってみてください

分類タスクにおける指標についてはこちらで解説しています

【機械学習】分類の評価指標を一番分かりやすく解説|confusion-matrix
お気に入り登録お願いします

コメントを残す

メールアドレスが公開されることはありません。