このシリーズ記事では、Rで*1色々な機械学習のアルゴリズムについて、それらがどんなものなのかを簡単なデータに対して分離超平面・決定境界を描きながら見てきました。
- パッケージユーザーのための機械学習(1):決定木 - 銀座で働くデータサイエンティストのブログ
- パッケージユーザーのための機械学習(2):ロジスティック回帰 - 銀座で働くデータサイエンティストのブログ
- パッケージユーザーのための機械学習(3):サポートベクターマシン(SVM) - 銀座で働くデータサイエンティストのブログ
- パッケージユーザーのための機械学習(4):ニューラルネットワーク - 銀座で働くデータサイエンティストのブログ
- パッケージユーザーのための機械学習(5):ランダムフォレスト - 銀座で働くデータサイエンティストのブログ
ということで今回はおさらいとして、これまで見てきた教師あり学習同士で分離超平面・決定境界のプロットを並べて見比べてみようと思います。
ポイントとしては「汎化」と「精度」のバランス。以下に示す学習データパターンは全て明確に真の分布を事前に決めてあるものばかり(例えばXORパターンであれば4つの象限に均等に配置した2次元正規分布×4)なので、各々の分類器がどれくらいその真の分布形状を反映しつつ、どこまで精度を出すかを見たいと思ってやってみました。
(※このシリーズではあくまでも分離超平面・決定境界の形状を見ることでそれぞれの分類器のおおまかな特徴をつかみ、「真の分布形状にどれくらい近付くことができるか」で汎化性能を、「学習データに対してどれくらい正確に追従できるか」で汎化性能のトレードオフとしての分類精度を見ているので、交差検証であったり未知データへの適用といった観点からの一般的な分類精度は特に見ていません。ちなみに交差検証しなかったのはただのサボリですごめんなさい)
線形分離可能パターンで2分類
まずは、古典的な線形分離可能パターンで2分類するケース同士で比べていきます。本来ならパーセプトロンのような単純な分類器でもいけるケースです。
線形分離可能パターンに対しては、やはり普通の線形識別関数の方が分が良さそうだということが見て取れます。というのは、決定木とSVM(ガウシアンカーネル)とランダムフォレストはどう見ても分離超平面・決定境界が不自然な一方で、ロジスティック回帰とニューラルネットワークは狙い通りの一本線の分離超平面・決定境界が推定されているからです。
ポイントはやはりニューラルネットワークでしょうか。パーセプトロンから派生した手法だけに、きちんとチューニングすれば線形分離可能パターンの場合はパーセプトロンに「化ける」感じがしますね。
もちろん例えばSVMでも線形内積カーネルとか選べば何の問題もないんですが、高次元で線形分離可能か不可能かが読めないようなケースでは、ニューラルネットワークを選ぶというのはなかなか悪くないチョイスかもしれないな*2、と思ってます。
線形分離可能パターンで3分類
次に、線形分離可能パターンかつ2値より多クラスなケースの例として、3分類のケースを取り上げてみます。
状況としてはあまり変わらないかと思います。ただ、3分類になったことで決定木・SVM(ガウシアンカーネル)・ランダムフォレストの分離超平面・決定境界の非効率性がさらに顕著になった感がありますねー。
それでもSVM(ガウシアンカーネル)はまだマシな方なんでしょう。決定木とランダムフォレストに関して言えば、おそらくほとんど汎化してないに等しいんじゃないでしょうか。線形分離可能パターンで、さらに多クラス分類になった場合は要注意ということなのかもしれません。。。
XORシンプルパターンで2分類
ここからは線形分離不可能パターンの例として、XORパターンを挙げていきます。さすがにこの先はロジスティック回帰は無理なので除外して、残りの4手法で見比べていきます。
大体どの手法でも綺麗に分かれているのが見て取れますね。決定木が一番上手くいっているというのもなかなか面白い感じです。
また、この中でニューラルネットワークだけが妙な決定境界を描いているのが目を引きます。分類性能自体は悪くないのですが、真の分布*3とは微妙に違う感を与える決定境界になってしまったというのが興味深いです。
XOR複雑パターンで2分類
XORシンプルパターンの各象限の分布の分散をさらに大きくして、分布同士の重なりを増やしたものです。これは手法によってかなり顕著な差が出ていると感じます。
真の分布を一番よく反映しているのは実はSVMその1(汎化重視)で、その他はどれを見てもオーバーフィッティング気味に見えます。SVMその2・3はまさにジョークですねw ここまで行くと、低バリアンス・強汎化のSVMの良さはほぼ完全に台無しです。これじゃさすがにダメでしょう。
一方で、他の決定木やニューラルネットワーク、ランダムフォレストが結構オーバーフィッティングして見えるのもなかなか面白いです。やはり分布同士がめちゃくちゃ重なるようなパターンでは、なかなか難しいということなんでしょうか。
ちなみに学習データへの追従精度という点だけで言えば、このケースではランダムフォレストが100%でトップという結果になっています。汎化はともかく、分類精度で勝負したいケースではランダムフォレストを投入してしまうというのも手ということですかね。
XOR複雑パターンで4分類
最後に、Rパッケージで実装されているほとんどの機械学習分類器が3クラス以上の多クラス分類に対応していることに着目して、XOR複雑パターンをそのまま4象限の分類問題に置き換えてやってみたものを並べてみました。分類性能も見るために、分類マトリクスを算出した結果も載せておきます。
> table(xor$label,out2.xor4.rp.class) 0 1 2 3 0 17 0 2 6 1 0 20 3 2 2 0 1 23 1 3 0 1 1 23 # 決定木。学習データそのものへの分類正答率は83% > table(xor$label,predict(xor4.svm,xor[,-3])) 0 1 2 3 0 18 1 1 5 1 0 18 4 3 2 2 2 20 1 3 0 3 0 22 # SVMその1(汎化重視)。分類正答率は78% > table(xor$label,predict(xor4.svm2,xor[,-3])) 0 1 2 3 0 25 0 0 0 1 0 25 0 0 2 0 0 25 0 3 0 0 0 25 # SVMその2(過学習気味)。分類正答率は100% > table(xor$label,predict(xor4.svm3,xor[,-3])) 0 1 2 3 0 25 0 0 0 1 0 24 1 0 2 0 0 25 0 3 0 0 0 25 # SVMその3(その中間)。分類正答率は99% > table(xor$label,out2.xor4.nnet.class) 0 1 2 3 0 20 1 1 3 1 0 19 3 3 2 1 2 21 1 3 1 4 0 20 # ニューラルネットワーク。分類正答率は80% > table(xor$label,predict(xor4.rf,xor[,-3])) 0 1 2 3 0 25 0 0 0 1 0 25 0 0 2 0 0 25 0 3 0 0 0 25 # ランダムフォレスト。分類正答率は100%
これは非常に面白い結果になりました。SVMその1とニューラルネットワークが、4象限に分かれる真の分布形状をよく反映しながらも、分類正答率という点ではあまり芳しくない結果に。決定木は決定境界も分類正答率も微妙な感じ。SVMその2・3は分類正答率は文句なしなんですが、分離超平面が相変わらずただのジョークw
これに対して4象限に分かれるという真の分布形状をよく反映しつつ、なおかつ分類正答率100%を達成したのがランダムフォレスト。ミクロに見るとオーバーフィッティングしているように見えつつも、全体の傾向は外さないという印象を与える結果になりました。
まとめ
・・・ということで、総合的に見るとやはりランダムフォレストって強いなぁというのが個人的な感想でした。何であれ無理やり分類してくれるし、その精度もかなり良い。特に多クラス分類かつ非線形なケースでは非常に強いというわけです。ちなみにアルゴリズムの特性上、やろうと思えば分散処理も可能という優れ物でもあります。
ただ、線形分離可能パターンでのランダムフォレストのダメっぷりも既に上で見たように明らかなわけで、この辺はやはり様々なアルゴリズムを熟知した上で、個々のデータに対して最適なものを割り当てていくという、非定型な作業をヒトが担う必要性が依然としてあるということを再認識させる結果になったようにも思います。
むしろ、その辺のアルゴリズム選択に生かせるぐらいの、「生データをある程度要約した時点で線形分離可能か不可能かをサクッと見極められる」ようなセンスをヒトが磨くということこそが、これらの機械学習アルゴリズムを最大限生かすために必要なことと言って良いのかもしれません。。。
おまけ:判別分析
判別分析は基本的に僕は全然使わないので、アルゴリズムの説明とかは抜きにしてRで決定境界を描いた結果だけ貼っておきます。
線形分離可能パターンでの線形判別分析と、
XORシンプルパターンでの二次判別分析と、
XOR複雑パターンでの二次判別分析の結果。なお、Rでは{MASS}パッケージのlda() / qda()関数で実行できます。
追記
@TJO_datasci thought you might be interested in a python version of your classifier comparison post, http://t.co/UjFriL5OzO
— Justin Goodwin (@jgbos) January 16, 2014
(@jgbos)さんが何と僕の英語版エントリに触発されてこんなものをやってくれました。
見たまんまで、Python + scikit-learnでほぼ同じ分離超平面・決定境界の比較をやってます(ただしニューラルネットワークの代わりにGMMで無理やり決定境界を描いてます)。有難うございましたー。