「RaspberryPiではじめる機械学習」(著者:金丸隆志 発行所:講談社)を紹介します。2~3年前に購入して、本の最後にある「RaspberryPiとじゃんけん」をやりたくて途中まで読んでいたのですが、この本を同僚に貸してその後子供に貸してようやく戻ってきました。 もう一度最初から読むことにして、ついでに機械学習を実施するpythonの中身を勉強することにしました。 何回かに分けて、説明します。興味がない方には申し訳ありません。「長生きする人は、知的好奇心が高い」という医学的なデータもあるということですから、頑張ります。
資料はこちら → 機械学習1
p.1 機械学習の事例としてよく使われる3種類のアヤメ(アイリス)の分類問題です。各々のアヤメについて、「がくの長さ」「がくの幅」「花弁の長さ」「花弁の幅」といった4つの特徴量がデータとしてあります。長さを横軸、幅を縦軸にして3種類のアヤメのがくと花弁をプロットしたものが、下の2つの図です。1種類は分離できていますが、残りの2種類は重なっている部分がありますね。
p.2 比較する際の特徴量とクラスの組み合わせ表です。本日は、2つの特徴量(がくの長さと幅)と2つのクラス(setosaとversicolor)について説明します。
p.3 本日目指す最終の実行結果です。
p.4 今回使用するScikit-learnの機能表です。今日は青の塗りつぶしの部分を用います。
p.5 pythonのインストール法は「最近流行のpython(パイソン)を使ってみよう」をご覧ください。インストールするとIDLEというpythonのエディターが使用できますし、GoogleのColaboratoryでもこのコードを入力すれば実行できます。Colaboratoryは「機械学習やpythonが簡単に使えるドライブ」をご覧ください。本ページのコードプログラム説明を入れておきます。2及び6行目でScikit-learnの中にあるアヤメのサンプルデータを取り出して、9及び10行目で変数XとYに格納しています。13行目以降の実行結果が次のp.6です。
このプログラムコードWordに貼り付けました→ P0401
p.6 13行目で変数Xが0~149個、4個のデータのかたまりで表示されます。pythonの場合は、1~150ではなく、0~149とします。1個のかたまりの中には4個のデータが並んでいます。ガクの長さ/ガクの幅/花弁の長さ/花弁の幅の順番に入っています。 次にyのデータが150個表示されます。0,1,2で表示されますが、これは0:setosa、1:versicolorそして2:virginicaでアヤメの種類をクラス分けしています。18行と19行は配列の形を表しています。yは(15,)と書かれていて0が省略されています。
p.7 次に進む前にpythonのライブラリをpipを使ってインストールします。Windowsには2通り方法があります。①左下のWindowsマークをクリックして、②Windows PowerShellをクリックすると真中上の表示が現れます。あるいは②’’Windows システムツール→コマンドプロンプトをクリックして、コマンドプロンプトを表示させます。Macは、ターミナルで同様にコードを書き込みます。先ずはインストールに用いるpipをインストールします。プロンプト「>」の後に、表にあるコードを書き込んでリターンしてください。この際、今後使いそうなライブラリをインストールしておきましょう。ライブラリの用途を書いておきます。
p.8 p.3の図を描くプログラムコードです。今回は、2つの特徴量(がくと花弁)のxy平面に、2つの種類(クラス)のアヤメ(setosaとversicolor)のデータをプロットして、分類します。Datasetsには、p.6で表示されたように4つの特徴量が入っていますので、16行目で2つに絞って、変数Xに上書きして入れ替えます。コードの意味は、次ページをご覧ください。 次は、アヤメの種類(クラス)3つ(0,1及び2)がDatasetsに入っていますので、2つにするため、3つ目の「y=2のデータ」を無視します。y!2は「yは2に等しくない」という意味です。つまり、「0と1」のデータのみを変数Xとyに上書きします。 少しややこしいですね。p.6のx0とy0、x1とy1・・・x149とy149が1対1で対応しています。yが2であるy100~y149に対応するX及びy自身のデータを無視するということです。 25行目にサポートベクトルマシンの分類器SVC(Support Vector Machine for Classification)を呼び出して、変数clfに格納に格納します。括弧の中のパラメータはとりあえずこのようにしておいてください。 27行目の「fit」というコードで分類できてしまうのです。pythonの優れているところは、このように種々の用途の応じたライブラリが豊富にあるということです。 後に続くコードは、結果を描画するものです。
このプログラムコードWordに貼り付けました→ P0402
p.9 Numpy配列の表示方法の説明です。黄色の部分をご覧ください。X[1, 0]、X[ : , 0]あるいはX[ : , :1]については矢印の先の配列として読み取ります。
p.10 グラフを描く場合、X及びy方向に500グリッドずつの250000個のグリッドに分割します。
p.11 41行目がp.10のグリット分割のコードです。45行目で0か1に属するかを予測し、57行目で背景の色を塗り分けています。71行と73行目はデータの点をプロットしています。
p.12 サポートベクトルの点の枠を赤にしています。サポートベクトルは、オレンジと水色に分類分けする際に誤判定しそうなペナルティーエリアに入る点を表しています。p.8の25行目のcの値が大きくなるとペナルティーが大きくなります。cの値を変えて実行してみてください。
p.13 実行したグラフです。
長文になり疲れましたので、本日はここまでです。読む方も大変ですね。