機械学習記10日目続き ~ scikit-learnのパーセプトロン

 パーセプトロンの考え方がわかったところで、irisのデータセット機械学習してみます。scikit-learnには、パーセプトロンを実装したlinear_model.Perceptronがあります。書式は、図1のようになります。

f:id:hackU0001:20190301165805p:plain

図1.Perceptronの書式

 

f:id:hackU0001:20190301171317p:plain

 

 このPerceptronから学習モデルを生成して、irisデータセットの識別が可能かどうか試してみます。まずは、irisデータセットを読み込みます。

f:id:hackU0001:20190301171735p:plain

 

 前回同様に、train_test_split関数を使い、データを次のように分割します。

f:id:hackU0001:20190301173510p:plain

f:id:hackU0001:20190301173216p:plain

 

f:id:hackU0001:20190301174052p:plain

(上記のコードの拡大)

f:id:hackU0001:20190301174454p:plain

 

 今回は、データを「正規化」(標準化)してみます。

データを正規化することで、値のバラツキが抑えられ、扱いやすくなります。ここでは、平均を0に分散を1に抑えています。したがって、一番多いデータがX座標の0付近になり、-1から1の間に分散するデータになります。

f:id:hackU0001:20190301175131p:plain

 

 

 パーセプトロンの学習モデルを生成します。パーセプトロンでは、重みベクトルであるWが少しずつ変更され、決定境界の直線が最適化されていきます。パラメータeta0は、1度にどれくらい傾かせるかを決める値なので、この値が小さいほど、最適値に到達しやすくなります。最適値に到達した状態を「収束した」といいます。

 

 ただし、一度に傾く量がわずかだと、何度も試行することになり、試行回数が増えて処理が遅くなります。ここでは、最大試行回数であるmax_iterを100、eta0を0.1にしていますが、何度か実行して効率の良いパラメータ値にすべきかもしれません。

 

f:id:hackU0001:20190301182708p:plain

 

<実行結果>
f:id:hackU0001:20190301182446p:plain

 

 これで学習が完了したので、精度を評価します。

f:id:hackU0001:20190301183005p:plain

 

 パーセプトロンでもk近傍法と変わらない精度です。

 次に、誤分類した数を求めてみます。

f:id:hackU0001:20190301184459p:plain

 

 目視で比べたときと同じように、1つ分類に失敗しています。精度の計算にNumPyのmean関数を使いましたが、sklearn.metricsにaccuracy_sorce関数というモデルの正解率を返す関数があるので、こちらも試しに使ってみたいと思います。

f:id:hackU0001:20190301185200p:plain

 

 98%の正解率になっています。この数値を見る限り、irisデータセットならパーセプトロンで十分なのかもしれません。

 

 

非線形分離可能

 パーセプトロンにより、クラスを分類できることはわかりましたが、ここである疑問が浮かび上がりました。

 「学習データは、いつも「線形分離可能」とは限らない。直線で分離できない場合は、どうするの?」

 例えば、図2のようなデータです。

f:id:hackU0001:20190301190328p:plain

図2.非線形分離可能

  このように決定境界が曲線だったり、データが混ざっている場合、直線を使ってクラスを分類することはできません。このような状態を「非線形分離可能」と呼びます。

 そこで、非線形分離可能な問題に対処できるアルゴリズムということで、「ロジスティック回帰」と「サポートベクタマシン」があるようです。

 明日は、「ロジスティック回帰」と「SVM」に挑戦していきます!