#61 Section 16 回帰(5) モデルの分析(2)
PyCaretでは、『plot_model関数』を使わなくても、下記の『evaluate_model関数』を使うことにより、クリック一つで、様々なモデルの評価を可視化(グラフ化)することができます。
しかも、たった一行!
evaluate_model(モデル名)
このコードを実行させると、下記のスライドにあるような出力結果が表示されます。
※スライドはクリックすると大きく表示されます!
①は、『Plot Type』と表示されているように、モデルの評価を可視化するグラフのボタンです。実行直後は、『Pipline Plot』が選択され、②のように機械学習モデルを構築する際にPyCaretが自動的に行った前処理を視覚的に表現しています。
今回は、このモデルの評価を可視化するグラフグラフを解説していきます。
下記は、 『plot_model』関数を使って表示させたグラフです。
PyCaretには、この3つ以外にも多くのグラフを表示させる機能が含まれています。さらに、①の各ボタンをクリックすると、コードを書かなくても、様々なグラフが現れます。それを順番に解説していきます。
1.Hyperparameters
パラメーター(Parameter)は、モデルが訓練データから自動的に学習し、調整していく重みやバイアスなどの値です。それに対して、ハイパーパラメータ(Hyperparameter)は、学習前に人手で設定するアルゴリズムの挙動を制御する値です。つまり、パラメータはモデルが学習によって得たもの、ハイパーパラメータはモデルの学習の前に設定するものとなります。
Hyperparametersでは、PyCaretがハイパーパラメータをどのように設定したかを表示してくれます。
本来、ハイパーパラメータは、分析者が経験等に基づいて決めるものですが、PyCaretはいい感じに決めてくれます。
次スライド以降でハイパーパラメーターの解説をしますが、PyCaretには、このハイパーパラメーターをチューニングして一番結果が良いものを選択してくれる機能(『tune_model』関数)がありますので、こだわって覚える必要はありません。この辺が、PyCaretは『シチズンデータサイエンティスト』にぴったりな分析環境と言える所以です。
次の9枚のスライドは、『Hyperparameters』ボタンをクリックした結果出てきたハイパーパラメーターと、PyCaretがどのようにハイパーパラメーターを決めたかをリスト化したものです。
2.Residuals
plot_model関数(「residuals」)で出てきたものと同じで、残差プロットが表示されます。残差は、実際の値と予測値の差のことです。グラフは下記の2つ描かれています。
▶ 散布図(左側)
→横軸: モデルによる予測値(Predicted Values)
→縦軸: 残差(Residuals、実際の値と予測値の差)
この散布図により、予測値の大きさに関わらず残差がランダムに分布しているか(パターンがないか)を確認します。理想的なモデルでは、残差は横軸の0の周りに均等に散らばっています。
▶ ヒストグラム(右側)
→散布図の残差の分布を示すヒストグラムが表示されます。
回帰分析の基本的な仮定として、残差は正規分布に従うことが望ましいため、ヒストグラムが釣鐘型(正規分布に近い形)になっているかを確認します。
一般的に、以下の場合、モデルはデータの構造を適切に捉えており、回帰分析の仮定がおおむね満たされていると判断できます。
●残差が0の周りに均等に分散している(散布図)
●残差に特定のパターンが見られない(散布図)
●残差の分布が正規分布に近い(ヒストグラム)
3.Prediction Error
次もplot_model関数(「error」)で解説したものです。横軸に実際の値、縦軸に予測値をプロットしたグラフが表示されます。これを、予測誤差プロットと言います。予測が完全であれば、傾き1の直線上に点が乗り、点が傾き1の直線周辺に集まるモデルが良いモデルとなります。
左上の凡例には、下記の3つが記載されています。
R2 → 決定係数。目的変数が十分に説明されているかどうかを数値 化したもの。
best fit → グラフ上のデータ点(実際の値と予測値のペア)に最もよく適合するように引かれた直線です。
identity → 傾きが 1 の直線を表します。理想的な予測を表す線になります。
散布図の点がidentityの線の周りに集まり、かつbest fitの線がidentityの線に重なっている状態が、最も良いモデルを示します。
4.Cooks Distance
このグラフの目的は、影響力のある観測値(Influential Observations)を特定することです。クックの距離が大きいデータポイントは、その点をデータセットから除外した場合に、モデルの推定された係数や予測値が大きく変化することを示しており、モデルの結果に強い影響を与えています。
グラフには、破線(紫色の点線)で影響力の閾値 が示されています。この閾値は、特定のデータポイントがモデルに過度に影響を与えているかを判断する一般的な基準の一つです。凡例に記載されている式は、全データポイントの6.62%がこの設定された閾値 を超えていることを示しています。約6.6%のデータが、モデルの結果に注意が必要なレベルの影響を与えているということです。
クックの距離に関しては、下記を参照してみてください。
【参考】 統計検定準1級 クックの距離を深めに理解する
5.Feature Selection
このグラフは、モデルの性能を最大化するために最適な特徴量の数を見つける過程を視覚化したものです。
X軸にNumber of Features (特徴量の数)、Y軸にCross-Validation Score (*R2) をとった折れ線グラフです。
*R2: PyCaretでは、ハイパーパラメーター『eval_metric』がRMSEと指定されていても、デフォルトでグラフのY軸にR2のような「高いほど良い」指標を表示するように設計されているためと考えられます。
このグラフは、特徴量の数を増やすにつれてスコアが上昇し、特徴量が4つの時点でピークに達していることを示しています。最適な特徴量の数は「4」で、その時のスコア「0.820」となっており、これは、モデルの性能を最大化するために9個中4個の特徴量を選択すれば十分であることを意味しています。
6.Learning Curve
X軸がTraining Instance(訓練データセットのサイズ、またはサンプルの数)、Y軸: Score(R2)で、以下の2本の線が表示されます。
Training Score(訓練スコア曲線)→モデルが訓練データそのものに対して出した性能。
Cross Validation Score (交差検証スコア曲線)→訓練データとは異なる検証データに対するモデルの汎化性能。
下記のスライドでは、2本の曲線の状態から、モデルの学習状況の判断をまとめてみました。
このLearning Curveの曲線パターンからは、モデルが過学習の状態にあることを強く示しています。
▶ Training Score (青線):訓練データサイズが小さいときから非常に高いスコア(約0.99)を維持しており、データが増えてもわずかに低下する程度で高止まりしています。これは、モデルが訓練データに含まれるパターン(およびノイズ)を非常に詳細に記憶していることを意味します。
▶ Cross Validation Score (緑線):訓練データが増えるにつれてスコアはわずかに上昇していますが、0.80〜0.82程度の水準で留まっています。これは、モデルが未知のデータ(検証データ)に対して発揮できる汎化性能を示しています。
7.Manifold Learning
「Manifold Learning」のボタンでは、次元削減手法によって生成されたプロットが表示されます。この場合は、t-SNE(最も一般的に表示されるグラフで、特にデータポイント間の局所的な類似性を保持しながら、高次元データを2次元にマッピングします)のグラフが表示されており、クラスター構造を視覚化しています。
プロットの右側にあるカラーバーは、各データポイントの目的変数の値を示しています。
このグラフは、目的変数の高い値(青)を持つ点も低い値(赤)を持つ点も、2次元空間の多くの領域で混ざり合って存在しています。この混ざり合いは、モデルが使用している9つの特徴量だけでは、目的変数の値が高いグループと低いグループを明確に区別できていないことを意味します。モデルが予測を行おうとしても、特徴空間においてターゲットが明確に分離されていないため、予測の精度に限界が生じる可能性を示唆しています。
8.Validation Curve
このグラフは、特定のハイパーパラメータ(この場合は、決定木の深さ)を変化させたときの、モデルのパフォーマンスの変化を視覚化し、過学習や未学習を防ぐ最適なパラメータ値を見つけるのに役立ちます。
X軸は選択された単一のハイパーパラメータの値軸(この場合は決定木の深さ)、Y軸はScore(この場合はR2)を表します。
プロットされる曲線は、以下の2本の線が表示されます。
▶ Training Score Curve(訓練スコア曲線):モデルが訓練データそのものに対して出した性能。
▶ Cross-Validation Score Curve(交差検証スコア曲線):訓練データとは異なる検証データに対するモデルの汎化性能。
このグラフからは、モデルの汎化性能を最大化する最適な木の深さは2付近ということが読み取れます。
9.Feature Importance
これは、モデルの予測にどの特徴量が最も貢献しているかを示すためのグラフです。
X軸はその特徴量の重要度スコア、Y軸は特徴量の名前を示しています。
このグラフから、モデルは事実上、「smoker」、「bmi」、「age」という3つの特徴量に基づいて予測の大部分を行っていることがわかります。その結果、モデルがデータに含まれる他の要因(特に地域差や性別)をほとんど考慮していないことも示しています。
参考までに、下記のスライドでは、特徴量の重要度スコアの算出方法の概要を解説しました。
10.Feature Importance...
省略されて名前が隠れているボタン(「Feature Importance…」)の完全な名称は、「Feature Importance Permutation」である可能性が高いです。 「Feature Importance」ボタンが訓練データに基づいて計算されるのに対し、「Feature Importance Permutation」は検証データに基づいて特徴量の重要度を評価します。
その出力は、グラフの左側(Y軸)に表示されるべきすべて(またはほとんど)の特徴量の名前が、他の要素によって上書きされています。本来、特徴量ごとに横棒(またはドット)がX軸に沿って並ぶはずですが、画面上には一本の長い線と、途切れた特徴量名しか見えず、他の特徴量の棒が完全に欠落しています。
このような不具合は、Google ColaboratoryやJupyter Notebook環境で、グラフの描画ライブラリ(Matplotlibなど)のバージョン、またはPyCaret内部の描画設定が原因で、出力領域が適切に設定されず、グラフの一部(特にY軸ラベル)がコンテナ外に描画されてしまうことによって起こるようです。
今のところは、無視しておきましょう(Docker、勉強中です)。
11.Decision Tree
evaluate_modelの「Decision Tree」ボタンは、モデルの複雑な構造を単純な単一の木に分解して視覚化(プロット)することを意図しています。このプロットは、通常、単一の決定木モデルや、ランダムフォレストのように個々の木を簡単に抽出できるモデルに対して有効です。
今回、モデルの評価は「CatBoost」を選択しましたが、「CatBoost」のような勾配ブースティングは、多数の弱学習器(通常は浅い決定木)を逐次的に結合して、最終的な強力なモデルを構築します。したがって、「CatBoost」は、単一の決定木として視覚化できるような構造を持っていません。
ですから、このボタンではエラーになります(「TypeError」ではなく、「Not Available」とでも表示してくれればわかりやすいのですが・・・)。
12.Interactive Residuals
これは、エラーになってしまいますが、原因として、以下の2点が考えられます。
①「Interactive Residuals」プロットは、通常、「yellowbrick」などの外部ライブラリの機能を利用して残差を視覚化します。CatBoostはモデルの予測結果や残差の形式が、この外部ライブラリが期待する標準的な形式と一致しない場合、プロットの生成過程でエラー(型エラーや次元エラーなど)が発生します。
②CatBoostRegressorとPyCaretの組み合わせでプロットを生成する際に、Colab環境で必要なJavaScriptやHTMLのレンダリングが失敗し、結果的にPython側でエラーが発生する、あるいはプロットが空白になることがあります。
ここは、インタラクティブではないですが、前出の「Residuals」で我慢しましょう。
【参考】 回帰を改善するための残存プロットの解釈
以上で、『evaluate_model関数』が用意してくれる、モデルの評価の可視化(グラフ化)の解説は終わりです。
ハイパーパラメーターはPyCaretが自動で設定してくれて、それで実用上は十分です。
しかし、モデルの性能に不満がある場合は、これらのグラフを見て、チューニングしていくことになります。今回、『Regression』の『Tutorials』の『Quick start』のみを使いましたが、このチューニングに関しては、『Tutorials』の『Tune Model』等を参考にしてください。
コメント
コメントを投稿