2016-11-22_9-36-8_No-00

こんにちは、ねこし@大学教員ブロガー です。

データ解析の手順』 における「3. 外れ値処理・変数処理・ノイズ処理を行う」についてです。

説明変数 (記述子・特徴量・入力変数) の選択について、Genetic Algorithm-based Partial Least Squares (GAPLS) やLeast Absolute Shrinkage and Selection Operator (LASSO) やStepwize法などいろいろな方法があります。もちろんそれぞれにメリットがあって、使い方を選べば有用な方法ですが、すこし複雑すぎるところもあります。

そこで今回は、線形の回帰分析手法である部分的最小二乗法 (Partial Least Squares, PLS) を繰り返し用いるだけで簡単に、不要な説明変数を削除して、結果的に変数選択になる方法を説明します。最後にこの方法を実行するためのプログラムも紹介します。

PLSの繰り返しによる変数選択

ここではPLSを行なったあとの標準回帰係数に着目します。ただ注意することは、標準回帰係数の解釈は行うことができない、ということです。

そこで今回は、標準回帰係数の絶対値がもっとも小さい変数のみを扱います。この変数だけ削除するのです。削除して問題ない理由を説明します。標準回帰係数は、その値を標準化した(オートスケーリングした)変数の値にかけて、目的変数の値の一部になります。つまり、絶対値が一番小さいということは、基本的に値がほぼ0ということであり、ほとんど目的変数の値に影響しない、つまり あってもなくてもいい変数ということです。

もともと目的変数と関係のない変数かもしれませんし、目的変数と関係はあっても他に類似した説明変数がある変数かもしれません。いずれにせよ、削除しても構築されたPLSモデルには影響を与えません。

このPLSモデルの標準回帰係数の絶対値が最も小さい説明変数を削除したあとに、再びPLSを行います。そして新たな標準回帰係数の絶対値を見て、これが一番小さい説明変数を削除します。このPLSモデルの構築と標準回帰係数の絶対値が最も小さい説明変数の削除を繰り返すのです。一つ説明変数を削除したあとに、再度PLSモデルを構築し直すことに注意してください。こうすることで、新たな説明変数の組でより適切な標準回帰係数を計算できるようになります。

ただ、説明変数を削除しすぎると、重要な変数まで削除されてしまい、PLSモデルの性能が低下する恐れもあります。そこで、PLSモデルを構築するたび(変数を削除するたび)に、ダブルクロスバリデーションにより予測性能を確認します。普通のクロスバリデーションではなく、ダブルクロスバリデーションを使用する理由についてはこちらをご覧ください。

クロスバリデーションでは予測性能を評価できない!ダブルクロスバリデーション(クロスモデルバリデーション)のススメ : 大学教授のブログ (データ分析相談所)

そして、たとえば変数を削除しながらダブルクロスバリデーション後のRoot-Mean-Squared Error (RMSE) の値を見て、適切な説明変数の数を選び、実際に選択された説明変数を確認します。こうすることで、モデルの推定性能をチェックしながら適切な説明変数を選ぶことができます。そして線形の回帰分析手法を繰り返し使用しているだけですので、計算時間もあまりかかりません。

PLSの繰り返しによる変数選択の具体的な手順はこちら

  1. 説明変数・目的変数をオートスケーリングする
    オートスケーリングとは各変数から平均値を引いて平均を0にし、各変数を標準偏差で割って標準偏差を1にする操作です。
  2. PLSを実行して標準回帰係数の絶対値がもっとも小さい変数を削除する、ことを繰り返す
    PLSを実行するたびにダブルクロスバリデーションを行い実測値と推定値との間でRoot-Mean-Squared Error (RMSE) を計算しておきます。
  3. 横軸を残った説明変数の数、縦軸をダブルクロスバリデーション後のRMSEとしてプロットを描く
  4. 望ましい説明変数の数を選び、選択された変数を確認する
    たとえば、ぜんぶで10変数あり、3. から6変数が望ましいと判断されたときは、選択された最初の4変数を削除することになります。

この流れによって選ばれた説明変数が得られますので、次はこの変数のみ用いて回帰分析を行うことになります。

PLSの繰り返しによる変数選択のプログラム

この方法を実行するプログラムはこちらにあります。noteでもSPIKEでもAnyPayでも言語が同じであれば同じものです。

MATLAB言語(note): https://note.mu/notes/n890173b3cdbc

MATLAB言語(SPIKE): https://spike.cc/shop/univprof/products/KNWZQWLT

MATLAB言語(AnyPay): https://anypay.jp/shops/GpeTLMrcxv/MFvFazLqdT

R言語(note): https://note.mu/notes/nf32e38278563

R言語(SKIPE): https://spike.cc/shop/univprof/products/iLSZ6of9

R言語(AnyPay): https://anypay.jp/shops/GpeTLMrcxv/UNYp3g4YCh

Python言語(note): https://note.mu/notes/n29de65149beb

Python言語(SPIKE): https://spike.cc/shop/univprof/products/AzCtkTUH

Python言語(AnyPay): https://anypay.jp/shops/GpeTLMrcxv/xWPWbPHZEw

データ解析の質問 募集中!

こちらへお願いします!

ご案内。

オススメ記事セレクション。

twitterでも発信中。

この記事に興味を持っていただけましたら、ぜひフォローをお願いします!


無料メルマガでブログにない情報を配信中。

データ解析・分析に興味がありましたらぜひ登録をお願いします!
無料メルマガの登録はこちら