回帰問題は値の量や程度を予測する問題です。値段やクリック数、売上個数などを予測します。回帰問題の予測がどの程度の精度なのかを評価する指標はいろいろあります。
その評価指標で、よく使われていて比較的分かりやすいものを、数式を使わず解説していきます。
「統計やデータ分析の初心者」から、何度かデータを触ったことがあるけど「回帰問題の評価指標を説明しろといわれれば自信がないといった方」は、これを見ると、回帰問題の評価指標を他人(プロ以外)に説明できるようになります。
回帰問題の練習には、Pythonのscikit-learnにあるデータセットである、bostonを使います。bostonデータセットは、住宅価格とさまざまな変数があります。住宅価格を目的変数(ターゲット)、その他の変数を説明変数(特徴量)として分析結果を評価していきます。
環境構築は、


機械学習モデルはロジスティック回帰を使用して、その結果を評価してみましょう。
予測の評価
単純に考えれば、予測した値と実際の値が一致していることが一番いいですよね。
こんな感じで、
でも、現実世界ではありえませんよね。
以前行ったbostonのデータセットに対するロジスティック回帰の結果は、
予測した値と実際の値では差がありますね。この差を誤差といいます。
回帰問題の評価指標は、この誤差で判断することになります。
単純に、誤差をすべて足したくなりますよね(または平均値)。しかし、それでは正しく誤差を判断できません。なぜなら、実際の値より予測した値が大きくなる(プラスの値)こともあれば、小さくなる(マイナスの値)ことがあるためです。
それでは、多くの回帰問題で評価指標とされているものを解説していきます。
初心者を対象としているので、数式なく説明していきます。
bostonのデータセットで、ロジスティック回帰の結果をコードで説明します。
必要なライブラリのインポート
import pandas as pd import numpy as np from sklearn.datasets import load_boston import matplotlib.pyplot as plt %matplotlib inline import seaborn as sns import warnings warnings.filterwarnings("ignore")
ボストン住宅価格のデータセットをデータフレームにする
boston = load_boston() df = pd.DataFrame(data = boston.data, columns = boston.feature_names) df['PRICE'] = boston.target df
外れ値と思われる、PRICE(住宅価格)が50の行を削除する
df=df.drop(df.index[df.PRICE==50])
目的変数と説明変数を指定する
X = df.iloc[:,:-1].values # 説明変数(最後の列以外) y = df.iloc[:,-1].values # 目的変数(最後の列のみ)
データセットを、訓練用とテスト用に分ける
from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test = train_test_split( X, y, test_size = 0.3, random_state = 1)
ロジスティック回帰を行い、予測値を作成する
from sklearn.linear_model import LinearRegression lm=LinearRegression(n_jobs=-1, normalize=True ) lm.fit(X_train, y_train) y_pred = lm.predict(X_test)
評価指標
1.MSE
予測値と正解値の差を二乗して平均した値
0に近いほど良い
コードは、
from sklearn.metrics import mean_squared_error print('MSE: %.3f'%(mean_squared_error(y_test, y_pred)))
2.RMSE
予測値と正解値の差を二乗して平均してルートした値
上のMSEのルートをとった値
0に近いほど良い
コードは、
print('RMSE: %.3f'%(np.sqrt(mean_squared_error(y_test, y_pred))))
3.MAE
予測値と正解値の差の絶対値の平均
0に近いほど良い
コードは、
from sklearn.metrics import mean_absolute_error print('MAE: %.3f'%(mean_absolute_error(y_test, y_pred)))
4.R²(寄与率)
感覚的な理解は難しい。けどよく使われている。
1に近いほど良い
コードは、
from sklearn.metrics import r2_score print('R^2: %.3f'%(r2_score(y_test, y_pred)))
評価指標の欠点
このような評価指標で予測精度を判断します。しかし、それぞれの評価指標は欠点もあります(外れ値の影響が大きいなど)。評価指標はひとつの数値で表されるので判断しやすいですが、ばらつきのあるデータをひとつの数値で判断するのは無理があります。
その欠点を補うためには、やはり可視化が有効です。可視化での判断は主観的になりやすく、難しいです。しかし、数値化された評価指標では足りない、有益な情報を与えてくれます。
評価の可視化
plt.figure(figsize=(6,3),dpi=200) plt.scatter(y_test, y_pred - y_test,c='steelblue',s=8,alpha=0.8, label='テストデータ') plt.legend(loc='upper right') plt.hlines(y=0, xmin=-10, xmax=50, color='r', lw=1.5, alpha=0.7) plt.xlim([3, 50]) plt.ylim([-17,13]) plt.xlabel('実際の値') plt.ylabel('予測と実際との誤差') plt.show()
これは、横軸が実際の値、縦軸が誤差を表しています。赤線は誤差が0で、予測と実際の値が一致していることを意味しています。つまり、青い点が赤線に近いほうが良いということです。赤線の上と下は、上がプラス、下がマイナスの違いだけなので、上下は関係なく赤線との距離だけで判断できます。
これをみると、実際の値が35以上では誤差が大きい(オレンジ枠内)ことが分かります。つまり、実際の値が大きいと予測精度が悪くなるということです。
評価指標ではすべてまとめてしまいますが、可視化では部分的な評価もできます。
ここで、このデータを思い出してみましょう。
住宅価格の予想が目的でした。
つまり、評価結果の解釈の例としては、
実際の値が大きいものは、住宅価格が高いもの。問題設定が一般住宅向けに限ったことであれば、35以上の数値は外れ値としてもいいかもしれません。一般庶民には、高価な住宅は選択肢にないためです。
このように、可視化は外れ値の存在が分かりやすいです。上の紹介した評価指標は外れ値の影響が大きくなりますが、可視化を行い、外れ値の存在が分かれば対処が可能です。
外れ値を削除ではなく、細かく見ていくと、ただのデータ入力ミスかもしれません。また、ミスではなく、重要な気づきにつながるかもしれません。
評価指標はただの目安です。可視化が一番いい評価だと思います。可視化での評価は難しいですが、有益な情報ですので、あなたの業務でも活用してみて下さい。
以下は、訓練データとテストデータでの誤差を可視化したものです。
plt.figure(figsize=(6,3),dpi=200) plt.scatter(y_train, y_train_pred - y_train, c='limegreen',s=8,alpha=0.8, label='訓練データ') plt.scatter(y_test, y_pred - y_test, c='steelblue',s=8,alpha=0.8, label='テストデータ') plt.xlabel('実際の値') plt.ylabel('予測と実際との差') plt.legend(loc='upper right') plt.hlines(y=0, xmin=-10, xmax=50, color='r', lw=1.5, alpha=0.7) plt.xlim([3, 50]) plt.ylim([-17,13]) plt.show()
予測精度の追求
予測精度は高ければ高いほどいいです。しかし、予測精度を少し上げるために、膨大なコストがかかることがあります。予測精度がどの程度あれば、またはどの程度改善されれば、どの程度の効果があるかを考慮する必要があります。
また、予測精度は限界があります。そもそも、データに誤差はつきものです。人が測定するデータはもちろん、機械が測定するデータにも誤差があります。測定の時点で誤差があれば、当然機械学習の予測精度も誤差がでます。
具体的な目的意識をもってデータ分析、機械学習のモデルを作ることが大切です。
コメント