scikit-learnでパーセプトロンを実装して標準化の効果を実感したお話

こんにちは、ぐぐりら(@guglilac)です。
機械学習のお勉強記事シリーズで、ここまで3本ほど書いてきました。

k-means法を解説して実装してみる

混合ガウス分布とEMアルゴリズムを解説して実装してみる

ガンベル最大トリックを解説して実装してみる

クラスタリングが続いていたので、今回は分類問題を扱います。
分類問題の中でも基本的な手法であるパーセプトロンについて、ざっくり解説して実装します。

パーセプトロン自体の解説は軽くにとどめ、機械学習ではよく用いられる標準化というテクニックについても説明し、どの程度標準化が有効なのかを今回の実装で確かめてみます。


パーセプトロンとは?

パーセプトロンとは、分類問題を解くのに用いられる機械学習の手法の一つです。

分類問題とは、あるデータがどのグループに属するかを学習し、未知のデータをグループごとに分類することを指します。

前回扱ったクラスタリングもグループごとにまとめるという点では同じですが、分類問題はあらかじめ与えられた学習用のデータにはそれぞれどのグループに属するかという情報が与えられています。

この情報を教師ラベルといい、この情報を元に、与えられたグループへデータを分類していく方法を学習していきます。
このように教師ラベルが付いているデータを元に学習を行う手法を「教師あり学習」と言います。

一方クラスタリングの場合、与えられた学習用のデータには教師ラベルが付いていません。多くの場合、グループの数だけ人間が指定し、いい感じに似たものどうしをまとめてこの数だけグループを作ってねー、みたいな感じです。

クラスタリングのように教師ラベルの付いていないデータを用いて学習を行う手法を「教師なし学習」と言います。

話が逸れましたが、今回用いるパーセプトロンはこのうち教師あり学習の分類問題を解くための手法です。


とても単純な手法であり、フルスクラッチで書いても数十行でかけてしまうほど簡単な方法なのですが、「与えられたデータが線形分離可能でなければアルゴリズムが収束しない」というとんでもない弱点があるために、実際にはあまり用いられません。

(線形分離可能、とは例えばデータが二次元だった場合、一本の直線で二つのグループに正しく分離できる、ということを示しています。なかなか強い条件。)


アルゴリズムはこんな感じ。ざっくり。
  1. 入力と重みの内積を計算する
  2. 0より大きいか否かで所属グループを判定
  3. 間違ってたら重みを修正
  4. 間違えなくなるまで繰り返す

基本的には2値分類(2クラスへの分類)です。
ただし今回用いるscikit-learnようなライブラリに用意されているパーセプトロンは他クラスの分類をサポートしてくれています。

2クラスの分類を他クラスへ拡張する方法は、単純に2クラスの分類モデルをクラスの個数ごとに用意して、それぞれのクラスに所属しているかどうかを予想していく、という形で行われています。


標準化とは?

パーセプトロンを実装してはい終わり、とするのもなんだかなあ、ということで、機械学習でよく用いられる標準化についても検証してみようと思います。

(めんどくさがりなのでパーセプトロンもscikit-learnを使って楽しているからこそのこの展開。フルスクラッチで書いていたらめんどくてやーめたっていってそう)

標準化、とは与えられたデータの集まりの平均と分散をうまーくいじって、平均0分散1のデータの集まりに調整してやる手法です。

高校数学とかででてくる、データを平均で割って標準偏差で割るあれです。

標準化をすると、データの各項目ごとの分類への影響度合いの偏りをなくすことができるんです。

入力に用いるデータの各項目の値は割と大きさがばらばらだったりします。

例えば人間の身長[m]と体重[kg]をもとにグループごとに分類する、というタスクがあった時、

身長は1[m]違ったらとんでもなく違う人なわけですが、体重が1[kg]違っても大した違いはありません

(ダイエットに励んでいる方にとっては大きな違いかもですが、身長が1m違うのとはわけが違うと思いますw)

このように、各項目で数字の重みが違うわけです。
ここの差を前処理の段階で打ち消して、特徴の重要度を公平にみてやろうぜ、っていうのが標準化のやりたいことです。

実験してみる

実際にパーセプトロンで分類問題を解いてみます。

用いるデータは、みんな大好きIrisです。

(Irisはアヤメの花のデータから何の品種か当てる分類問題を解く際に練習用に公開されているデータセットです。)

scikit-learnにも用意されているので、簡単にデータが用意できます。
アヤメのデータにはいくつか項目がありますが、今回は結果の可視化をしたいので二次元にしてみます。

アヤメの品種は3種類です。

標準化するといいことがあるかを検証するため、標準化するバージョンとしないバージョンでテストデータの分類精度がどう異なるかも確認していきます。


結果

標準化した場合としてない場合の分類精度の違いはこんな感じになりました。


scaledunscaled
accuracy97.78%55.56%

データはシャッフルしてるので実行するたびに精度は変化しますが、何回か試した限りでは毎回標準化した方が精度は高くなりました。

決定領域はこんな感じ。



 

おわりに

やっぱり標準化するといいっぽいですね。

パーセプトロンは実際にはあまり使われませんが、基本なので機械学習をやっていく中で誰もが一度は通るのではないでしょうか。

次はロジスティック回帰とか書こうかなあ。

読んでくれてありがとうです。

コメント