機械学習記10日目続き ~ scikit-learnのパーセプトロン
パーセプトロンの考え方がわかったところで、irisのデータセットを機械学習してみます。scikit-learnには、パーセプトロンを実装したlinear_model.Perceptronがあります。書式は、図1のようになります。
このPerceptronから学習モデルを生成して、irisデータセットの識別が可能かどうか試してみます。まずは、irisデータセットを読み込みます。
前回同様に、train_test_split関数を使い、データを次のように分割します。
(上記のコードの拡大)
今回は、データを「正規化」(標準化)してみます。
データを正規化することで、値のバラツキが抑えられ、扱いやすくなります。ここでは、平均を0に分散を1に抑えています。したがって、一番多いデータがX座標の0付近になり、-1から1の間に分散するデータになります。
パーセプトロンの学習モデルを生成します。パーセプトロンでは、重みベクトルであるWが少しずつ変更され、決定境界の直線が最適化されていきます。パラメータeta0は、1度にどれくらい傾かせるかを決める値なので、この値が小さいほど、最適値に到達しやすくなります。最適値に到達した状態を「収束した」といいます。
ただし、一度に傾く量がわずかだと、何度も試行することになり、試行回数が増えて処理が遅くなります。ここでは、最大試行回数であるmax_iterを100、eta0を0.1にしていますが、何度か実行して効率の良いパラメータ値にすべきかもしれません。
<実行結果>
これで学習が完了したので、精度を評価します。
パーセプトロンでもk近傍法と変わらない精度です。
次に、誤分類した数を求めてみます。
目視で比べたときと同じように、1つ分類に失敗しています。精度の計算にNumPyのmean関数を使いましたが、sklearn.metricsにaccuracy_sorce関数というモデルの正解率を返す関数があるので、こちらも試しに使ってみたいと思います。
98%の正解率になっています。この数値を見る限り、irisデータセットならパーセプトロンで十分なのかもしれません。
▶非線形分離可能
パーセプトロンにより、クラスを分類できることはわかりましたが、ここである疑問が浮かび上がりました。
「学習データは、いつも「線形分離可能」とは限らない。直線で分離できない場合は、どうするの?」
例えば、図2のようなデータです。
このように決定境界が曲線だったり、データが混ざっている場合、直線を使ってクラスを分類することはできません。このような状態を「非線形分離可能」と呼びます。
そこで、非線形分離可能な問題に対処できるアルゴリズムということで、「ロジスティック回帰」と「サポートベクタマシン」があるようです。
明日は、「ロジスティック回帰」と「SVM」に挑戦していきます!