今回は画像をプログラミングを介して、その画像が何を示しているのかを分類分けしてみましょう。人間は画像や実際に生物、無機物を見てそれがなんであるのか無意識に判断することが可能ですが、機械は出生まもない赤児のように判断する基準や定義が存在しないため目の前にあるものがなんであるのか判断することができません。ではどのようにして機械が画像を認識できるようプログラムしていくのか見ていきましょう。

アヤメの分類に挑戦してみよう

機械学習プログラムの基本的な流れを理解したところで、もう少し複雑なデータを扱ってみましょう。具体的には「Fisher のアヤメデータ」という有名なデータを扱います。まずアヤメデータを入手し、その後、Pandas ライブラリーを使ってデータを読み込み、SCIKIT-learn ライブラリーの SVC アルゴリズムを利用して機械学習するプログラムを実装してみましょう。

アヤメデータを入手しよう

アヤメデータをダウンロードしよう「Fisher のアヤメデータ」(あるいは、Anderson のアヤメデータ)は、アヤメの品種分類データです。今回は、このデータをダウンロードして機械学習に利用してみましょう。Fisher のアヤメデータは、とても有名なのでさまざまなサイトからダウンロードできます。今回は、以下の GitHub リポジトリーからダウンロードしてみましょう。

アヤメデータのダウンロード

[URL] https://github.com/kujirahand/book-mlearn-gyomu/blob/master/src/ch2/iris/iris.csv

そのWeb サイトからアヤメデータをダウンロードしましょう。画面上の「Raw」ボタンを押してくがさい、すると、CSV データがブラウザー上に表示されますので、ブラウザーの保存機能を利用して保存しましょう。その際、ファイル名は「iris.csv」としてください。

アヤメデータを確認しよう

ダウンロードしたアヤメデータをExcel などで開いてみましょう。すると、以下のような内部スキーマが存在します。

このデータは、がく片と花びらの長さや幅と、アヤメの品種の関係を示しているデータであることがわかります。

(参考)Colaboratory や Jupyter Notebook でダウンロードする方法

上記の手順でWeb ブラウザーから CSVファイルをダウンロードできますが、Colaboratory やJupyter Notebook から直接 CSV ファイルをダウンロードすることもできます。以下のプログラムをノートブックに書き込んで実行します。

import urllib.request as req

import pandas as pd# ファイルをダウンロード

“https://raw.githubusercontent.com” + \”/kujirahand/book-mlearn-gyomu/master/src/ch2/iris”+ \”/iris.csv”

urlsavefile = “iris.csv”

req.urlretrieve (url, savefile)

print(“保存しました”)# ダウンロードしたファイルの内容を表示csy = pd.read_csv(savefile, encoding=”utf-8″)

CSV

アヤメデータを使って機械学習をしてみよう

データをダウンロードしたので、機械学習の準備が整いました。このアヤメデータを用いて、以下のような教師あり学習の機械学習プログラムを作成してみましょう。

ゴールを決定しよう

まず、ゴールを決定しましょう。ここでは「がく片や花びらの長さと幅から、アヤメの品種を分類する」ことをゴールとします。そのために、以下の順番で機械学習プログラムを実装しましょう

(1) アヤメデータとして、ダウンロードした「iris.csv」を取り込む

(2) 取り込んだアヤメデータを、がく片や花びらの長さと幅の情報(データ部分)とアヤメの品種情報(ラベル部分)に分離する

(3)全データのうち、80%を学習用データに、20%をテスト用データに分離する

(4) 学習用データを使って学習させ、テスト用データを与えた場合に、正しくアヤメの品種を分類してくれるかを評価する

機械学習プログラムの基本的な流れは、AND 演算や XOR 演算と同じになります。そのため、ここでのポイントは、CSVファイルを取り込んだり、データ部分とラベル部分、学習用とテスト用にデータを分離する部分になりそうです。

アルゴリズムを選択しよう

AND 演算においては LinearSVCアルゴリズム、XOR 演算においては KNeighbors Classifier アルゴリズムを利用しましたので、ここでは SVC アルゴリズムを利用してみましょう。

実装しよう

では、がく片や花びらの長さと幅から、アヤメの品種を分類する機械学習プログラムを見てみましょう。まず、Jupyter Notebook を起動したら、CSVファイル「iris.csv」をアップロードしましょう。画面右上の「Upload」ボタンを押してファイルを選びます。すると、ファイル一覧に「iris.csv」が反映されます(Jupyter Notebook 上でCSVファイルをダウンロードした場合、アップロードの必要はありません)。続いて、Jupyter Notebook で新規ノートブックを作りましょう。画面右上の [New> Python 3] で新規ノートブックが作成できます。そして、以下のプログラムを記述しましょう。

import pandas as pd

from sklearn.model_selection import train_test_splitfrom sklearn.svm

import SVC

from sklearn.metrics import accuracy_score# アヤメデータの読み込み

iris_data = pd.read_csv(“iris.csv”, encoding=”utf-8″)# アヤメデータをラベルと入力データに分離する

y = iris_data.loc[:,”Name”]

x = iris_data.loc[:,[“SepalLength”,”SepalWidth”,”PetalLength”,”PetalWidth”]]# 学習用とテスト用に分離する

x_train, x_test, y_train, y_test=train_test_split(x, y, test_size,train_size = 0.8, shuffle=True)# 学習する

clf = SVC()clf.fit(x_train, y_train)# 評価する

y-pred = clf.predict(x_test)

print (“正解率=”,accuracy_score(y_test, y_pred))

では、Jupyter Notebook からプログラムを実行してみましょう。Run ボタンを押すと、以下のような結果が表示されます。

正解率= 0.9666666666666667

これは、アヤメの品種分類の精度を表す値です。学習データとテストデータをランダムに選ぶため、正解率は実行ごとに変化します。それでも、ここで0.966 と出ているように、96%を超える数値となっていますので、アヤメの品種を正しく分類できていると評価できるでしょう。それでは、プログラムを確認してみましょう。(※1)の部分では、Pandas ライブラリーのread_csv(0メソッドを利用して「iris.csv」ファイルを読み込みます。read_csv メソッドは、読み込んだ結果として、Pandas のDataFrame オブジェクトを返します。ッの部分では、読み込んだアヤメデータをラベル部分と入力データ部分に分離します。データの分離には、DataFrame オブジェクトのloc) メソッドを利用すると簡単に行うことができます。ここでは、CSVのヘッダー名を利用して分離しています。(※3)の部分では、学習用とテスト用にデータを分離します。データの分離には、train_test_split()メソッドを利用すると簡単に行うことができます。今回は、80%を学習用データに、20%をテスト用データに利用したいため、「test_size = 0.2」「train_size =0.8」というパラメーターを指定しています。また、学習用データやテストデータに偏りが出ないように、「shuffle = True」パラメーターを指定して、元データ(xやy)をランダムに並べ替えた後にデータを抽出するようにしています(デフォルト値は True なので省略してもよいでしょう)。(※4)の部分では、SVC を利用してクラス分けを行う分類器を作成します。そして、fit0 メソッドで学習用データを学習します。(※5)の部分では、テストデータを用いて予測を行い、予測結果と正解ラベルを比べて正解率を計算し、結果を画面に出力します。前節と同様、予測にはpredict) メソッド、正解率の計算にはaccuracy_score) メソッドを利用しています。これまでのところで、機械学習プログラムの基本的な流れについて理解できたのではないでしょうか。各ソースコードに出てきたライブラリーやメソッドは、機械学習において頻繁に利用するものなので、最後に整理してみましょう。なお、各メソッドのパラメーターについては、これまでのソースコードで利用したものについて記載していますが、各メソッドには有用なパラメーターが他にも用意されていますので必要に応じて利用してみてください。

補足 – Scikit-learn のサンプルにも収録されている

今回は、Jupyter Notebook にファイルをアップロードする手順を紹介するため、GitHubからアヤメデータのCSVファイルをダウンロードしてみましたが、実は scikit-learn のサンプルデータにも収録されています。つまり、Anaconda などで scikit-learn をインストールすると、自動的にアヤメデータのサンプルもインストールされます。単にデータを使いたいだけであれば、以下の手順のようにload_iris0 関数を使って、データを読み込んで使うことができます。

応用のヒント

ここまでの内容で、CSVファイルを準備すれば、それを取り込んで機械学習するプログラムを作成できます。「Fisher のアヤメデータ」を読者の皆様が業務で利用しているデータに変更すると、業務に役立つ機械学習プログラムが作成できます。

この節のまとめ

・アヤメのがく片や花びらの長さと幅から品種を分類できる

・アヤメデータが公開されており、機械学習の題材として最適である

・Pandas を使うとCSV データの取り込みや分離を簡単に行える

・train_test_split() メソッドを利用すると学習用データとテストデータの分離を簡単に行える

いかがでしたでしょうか。パッケージには便利なツールが数多存在していてそれらを流用することでいとも簡単に画像の分類分けを行うことができてしまします。特にプログラミング初学者に往々にしてあることなのですが全て覚えようとしてもプログラミングは例え現場の最前線で活躍している方々も熟知するには膨大な時間を要しても理解することができないほど無限にソースがあります。感覚的には先人たちが気付き上げてきたアルゴリズムの巨人の力を借りながらプログラミングを学習していくイメージをもち、わからない事があればその都度巨人に助言を求めるような温度感で学習を進めていくことを推奨します。再三いいますが全てを理解するのは現実的に不可能なので全て覚えようとせず、そのアルゴリズムにどんな意味合いがあるのかがわかればプログラミングは十分組むことができます。