機械学習で花の画像から品種を分類するシステムをつくるー準備編

機械学習で花の画像から品種を分類するシステムをつくる

O'Reillyから発刊されている実践機械学習システムの第2章の勉強メモ。

はじめに

今回つくってみるプログラムは「花の画像を渡してその品種を分類する」というもの。

システム的には、まず分類のルールを与えて分類を試みる。そのルールで品種がわからない画像に対してはさらに学習したルールを用いて分類するって感じのようだ。

このシステムでは クラス分類教師あり学習 を利用する。

クラス分類のイメージはSVM(あまり理解していないが笑)とか木とかを用いてどんどんクラス分けしていく感じかな。ディレクトリの構造と似てるかも。

教師あり学習は、wikiのページによると

事前に与えられたデータをいわば「例題(=先生からの助言)」とみなして、それをガイドに学習(=データへの何らかのフィッティング)を行う

とある。なるほど(わからん)

ちなみにwikiの教師なし学習のページには

「出力すべきもの」があらかじめ決まっていないという点で教師あり学習とは大きく異なる。 データの背後に存在する本質的な構造を抽出するために用いられる。 教師あり学習は、その「出力すべきもの」も入力として与えることで教師なし学習になる。

とのこと。あとはこの記事とかが非常に分かりやすいかも。

まだなんだかよく分からぬ...笑

まぁ具体的なイメージと理解は実践して深めていくしかないかも

アイリスデータセット

Wikiのアイリスのページより、アイリスとはアヤメ科アヤメ属の植物のこと。

世界の温帯に約150種、日本では9種が知られ、うち7種が自生している。

らしい。

その中からsetosa,Versicolor,Virginicaという品種3種についての

  • がくの長さ
  • がくの幅
  • 花弁の長さ
  • 花弁の幅

をデータとしてまとめた アイリスデータセットというものがあるとのこと。これを使って機械学習のシステムを作ります。(自分にはもうどこががくで花弁かも判断つかないけど。。笑)

ちなみに参考までに3種の写真を。笑

Iris_setosa.JPG

  • ブルーフラッグ(Versicolor)

iris_versicolor.jpg

  • Virginica

Iris_virginica.jpg

ここの記事で有用なデータをまとめてくださってて、アイリスデータセットもDLできます。(プログラムではload_iris()関数で読み込むのでこれをDLする必要はないです)

アイリスデータセットは、序盤だけのせるとこんな感じになってた。

 Sepal.Length    Sepal.Width Petal.Length    Petal.Width Species
1   5.1 3.5 1.4 0.2 setosa
2   4.9 3   1.4 0.2 setosa
3   4.7 3.2 1.3 0.2 setosa
.
.
.

サンプル数は150。今回のシステムでは、それで十分とのこと。

データを可視化

まずこのデータをPythonのMatplotlibを使って可視化してみる。

教科書のソースそのままだと実行できない。sklearn.datasetsが使えなかった。環境設定のとこで書いてなかったけどここでscikitというツールが必要みたいなので入れる。pipでインストール。

$ pip install -U scikit-learn

ということで以下が横軸をがくの長さ、縦軸をがくの幅としてプロットするためのプログラム。本のプログラムとほぼ一緒で、変更点は最後に描画した散布図を表示するためのplt.show()付け加えたぐらい。

from matplotlib import pyplot as plt
from sklearn.datasets import load_iris
import numpy as np

# Load data by load_iris function from sklearn
data = load_iris()

features = data['data']
feature_names = data['feature_names']
target = data['target']
target_names = data['target_names']
labels = target_names[target] # replace all parametors to strings of target_names

for t,marker,c in zip(xrange(3), ">ox", "rgb"):
# Plot by different colors by classes
    plt.scatter(features[target == t,0],
                features[target == t,1],
                marker=marker,
                c=c)

plt.show()

出力は以下のような感じ。

Screen Shot 2015-01-25 at 16.12.40.png

やったー、表示された!うれしい。かっこいい。

そしたら他のデータについてもそれぞれx座標とy座標で比較していきます。(3次元でやったらもっと面白そう?)

PythonとMatplotlib初めてすぎて本のplotの部分が全く理解できなかったので自分で書き直してから、全通りの散布図を作ってみました。

Matplotlibに関しては、こことかにお世話になりました。 

matplotlib入門 - りんごがでている

ソースは若干長いので、ここではあげないことにします笑

githubにのせているので気になる見てやって下さるとうれしいです。本のようにスマートじゃないし文法とか使い方間違ってる部分あると思いますが原始的な方法でやってるので挙動が理解しやすい。と思います。笑

practice_machine-learning/graph-iris.py at master · totzYuta/practice_machine-learning · GitHub

うーん、それぞれのデータのプロットのところが非常に冗長...笑

まぁ結果は以下のようにいい感じに!

Screen Shot 2015-01-25 at 21.33.43.png

とういことでとりあえずここまでで。(PythonとMatplotlib分からん過ぎてここまでで一日くらい費やしました笑 本でいうと3ページ分くらい笑)

次回は分類モデルつくっていきます〜。