python3

6/14(木) プログラミング勉強会 @WeWork

こんにちは。
株式会社オズビジョンSREチームエンジニアの渡邉と申します。

本記事は、6/14(木)に実施する、下記イベントの内容について記載しております!
https://oz-vision.connpass.com/event/87690/

★事前に「2.Anacondaのインストール」を終了しておいて頂けると、当日スムーズに内容に入れます。

目次

  1. ハンズオンの内容
  2. Anaconda のインストール
  3. Jupyter Notebook の実行
  4. ハンズオン - 1 簡単な計算・グラフの描画
  5. ハンズオン - 2 アヤメの分類
  6. ハンズオン - 3 写真判定
  7. さらに勉強していきたい人のために(リンク等)

1.ハンズオンの内容

Anacondaというツールを用いて、Pythonの実行環境を作成し、機械学習の入門を行います。

環境構築から始めていきますが、手慣れている方は、知っている部分を読み飛ばしていただいても大丈夫です。

少人数で実施しますので、各自のペースで進めて行って、詰まった場合はお気軽に質問してください!

2.Anaconda のインストール

Anacondaとは、Python本体・Pythonで機械学習を行うのに必要なライブラリを簡単に導入できるツールです。

Pythonで機械学習を実行する場合、環境構築に複雑な手順が要求されますが、Anacondaをインストールすれば、それらの煩雑な手順を簡略化することができます。

windowsの場合

下記の記事を参考に、手順通りにインストールを実施してください。
https://weblabo.oscasierra.net/python-anaconda-install-windows/

★windowsの場合、インストールに時間がかかる場合があります。気長にまって見てください。

※ 以前にAnacondaをAll users でインストールしていた場合は、一度アンインストールして、「Just me」を選択するとうまくいくそうです。
※ うまくいかない場合、ネットワークを切って、ウイルス対策ソフトを一時的に無効化してインストールを実行してみてください。

OSXの場合

下記サイトにアクセスし、3.6 versionをダウンロード。特にオプション指定の変更なしに、インストーラを選択したください。
https://www.anaconda.com/download

3.Jupyter Notebook の実行

Anacondaのインストールが完了したら、GUI画面で実行できるAnaconda Navigatorを起動しましょう。
今回のハンズオンにおいては、Jupyter Notebookという開発ツールを用いて、機械学習を行います。

windowsの場合

  • スタートメニューにある「Anaconda」フォルダの中の、「Anaconda Navigator」というソフトウェアを実行。
  • Homeメニューの中のJupyter Notebook を実行すると、ブラウザでJupyter Notebookが起動します。

OSXの場合

  • Finderのアプリケーションフォルダから、「Anaconda-Navigator」を実行。
  • Homeメニューの中のJupyter Notebook を実行すると、ブラウザでJupyter Notebookが起動します。

Jupyter Notebookとは

Pythonプログラムを試行錯誤しながら実行するのに便利なツールです。
実行結果が一目瞭然で、Notebookとして、実行結果の保存もしておけます。

4.ハンズオン-1 簡単な計算・グラフの描画

簡単な計算

  • デフォルトではユーザのホームディレクトリが表示されます(そのまま実行してもいいですし、右上の「New」をクリックして作業用のフォルダを作成しても大丈夫です)
  • 右上の「New」をクリックして、メニューから「Python3」を選択する。
  • In[] と書かれているテキストボックスに9999 * 9999を入力
  • 上部にある「Run」を実行。計算の結果が表示される
  • 参考:Python での計算 -> https://www.pythonweb.jp/tutorial/num/index2.html

サイン波グラフの描画

下記のコードを、同様に記述し、「Run」で実行します。

%matplotlib inline 
import matplotlib.pyplot as plt
import numpy as np
x = np.arange(0, 30, 0.2) # 0から30までの数列を0.2刻みで生成
y = np.sin(x) # xの正弦関数(サイン)を求める
plt.plot(x,y) #グラフを描画
plt.show() #表示

「Numpy」という数値計算ライブラリにて、サイン波のグラフを記述することができました。
※サイン波とは"正弦関数として観測可能な周期的変化を示す波動"……簡単に言うと周期的に(綺麗に)変化する波

以上、簡単な計算と、グラフを記述しました。
本題の機械学習ではないですが、Jupyter Notebookの扱い方がなんとなく理解できたかと思います。

終了したい場合は、ブラウザのタブを閉じるだけです。
(実行結果は上部メニューバーの保存をクリックすると、.ipynbという拡張子のファイルで保存されます)

5.ハンズオン_2 アヤメの分類

教師あり学習(分類)

機械学習には大きく分けて、教師あり学習・教師なし学習・強化学習があります。
(初心者向けの解説は、こちらのサイトがおすすめ -> 「learning.ikeay.net 文系エンジニア、AI勉強中」http://learning.ikeay.net/

今回は、scikit-learnというAnacondaに同梱されているライブラリを用いて、教師あり学習のハンズオンを行います。

このハンズオンで取り扱う教師あり学習とは、問題と答えがセットになって学習する方法です。
未知のデータに対して予測や識別を行う手法です。
(教師なし学習は正解不正解のデータが入っていないので、傾向をつかむ学習方法です)

アヤメのデータセットという数値を訓練データ・テストデータに分け、訓練データを学習させます。
main_00000000044.jpg
[アヤメの花]

その学習結果をもとに、テストデータの予測を行うというのが、今回のハンズオンの概要です。

irisデータセットの呼び出し・図解

ここから先のコードも、Jupyter notebookのセルに入力してください。

まずはデータセットを呼び出してみましょう。

scikit-learnには付属するデータセットがいくつかあります。(詳しくは下記のドキュメント参照)
http://scikit-learn.org/stable/datasets/index.html

下記のように記述し、scikit-learnのライブラリから、アヤメ(iris)のデータセットを呼び出します。

from sklearn import datasets
# サンプルデータ読み込み
iris = datasets.load_iris()

読み込んだデータセットを表示させてみましょう。

print(iris.data)

上記で表示された数字は左から、
Sepal lngth(がく片の長さ)・sepal width(がく片の幅)・petal length(花弁の長さ)・petal width(花弁の幅)となっています。このデータは特徴量と呼ばれます。

この特徴量と対になっているのが、品種のデータで、下記コマンドにて表示できます。

print(iris.target)

0 ~ 2の数値が表示されました。

0:setosa , 1:versicolor , 2:virgini という品種になります。
(参考:http://aiiine.com/iris_learning/
このデータは先ほどの特徴量と対になっていて、3(品種) * 50(品種あたりの個数) で150個の数値が並んでいます。

図で表示することもできます。

# x=Sepal(がく片),y=Petal(花びら)の長さでプロット
%matplotlib inline
import matplotlib.pyplot as plt
plt.xkcd() # 手書き風グラフ
# 次元の定義
features = iris.data[:, [0, 2]]
plt.figure(figsize=(5, 5))
plt.title('Iris length data (all:n=150)')
plt.xlabel('sepal length (cm)')
plt.ylabel('petal length (cm)')

plt.scatter(*features.T, 
            c=[['c', 'm', 'y'][x] for x in iris.target],
            alpha=0.6)

SVMでの分類

さて、ここからようやく機械学習がはじまります。

特徴量を学習させ、品種の予測(教師あり学習)を行います。

scikit-learnライブラリを使用し、SVMと呼ばれるアルゴリズムで分析してみましょう。
(参考:http://scikit-learn.org/stable/modules/svm.html

from sklearn import datasets , svm
# アヤメのデータを読み込む
iris = datasets.load_iris()

# 学習させる
clf = svm.SVC()
clf.fit(iris.data, iris.target)

# virgini のデータを与える
test_data = [[ 6.2, 3.4, 5.4, 2.3 ]]
print(clf.predict(test_data))

[2]と表示されたら、成功です。
学習データにvirginiの特徴量を与えて、品種の分類を行いました。

上記では個別にデータを入力しましたが、150種のデータを、
訓練用データとテスト用データに分割し、一気に分類してみましょう。

まずは150個のアヤメのデータセットを、訓練用・テスト用データに分割し、
かつ、データの順序をランダムに配置します。

# 訓練用とテスト用データを分割する
from sklearn import datasets, model_selection
X_train, X_test, label_train, label_test = model_selection.train_test_split(
    iris.data, iris.target, test_size=0.25, random_state=0)

上記で分割したデータの件数を確認します。

# 分割後のデータ件数
print('train:', len(X_train))
print('test:', len(X_test))

下記のように表示されたでしょうか。

train: 112
test: 38

train の数値が、これから学習するデータセットの数になります。

このデータを確認してみましょう

print(X_train)

下記のコードで、訓練用のデータ112件の特徴量を学習させます。

# 訓練データで学習する
from sklearn import svm
clf = svm.SVC() # 分類器svm
clf.fit(X_train, label_train) # 学習

学習結果を用いて、テストデータ38件を予測します。

# テストデータで予測
pre = clf.predict(X_test)

予測した結果を表示してみましょう。

print('予測結果', pre)
print('正解ラベル', label_test)

上の段の数値が、予測の結果で、
下の段が、実際の正解となります。

下記のように入力すれば、正解率を表示させることもできます。

from sklearn import metrics
ac_score = metrics.accuracy_score(label_test, pre)
print('正解率{0:.1f}%'.format(ac_score * 100))

以上でアヤメのデータセットを用いた、ハンズオンは終了です。
scikit-learnのライブラリからデータセットを呼び出し、SVMアルゴリズムで分析するという流れは掴めたかと思います。

ハンズオンをやってみた後には、
違うデータセットを用いて同様に分析してもよいですし、
下記リンクのようにディープラーニングに挑戦してみてもいいでしょう。

機械学習-アヤメの分類 (プログラム)

http://mjk.ac/PV4VXZ
アヤメの分類を題材に、ニューラルネットワークを学べます。

6.ハンズオン_3 写真判定

続いてのハンズオンは、APIを利用して写真データを集めて、
scikit-learnのLinerSVCアルゴリズムにてデータを学習させます。

※下記ではbingを用いた画像収集の方法に関して記述していますが、
お時間のない方は下記リンク(当日のみ有効)から画像をダウンロードして使用してください
・メロンとスイカの画像
https://drive.google.com/open?id=1hh8e2_3I516kwzORYjA3yp3Ovd6GtmZc

bingのAPIを利用した画像収集

下記リンクを参考に、bingでの画像収集をします。
bingでの画像収集は、最近v7という新しいバージョンになったので、注意が必要そうです。

PythonでBing Image Search API v7を使って画像収集する
https://qiita.com/m-shimao/items/74ee036fff8fac01566e

※他の方法(Frickr・Google等)が知りたい方は、こちらのリンクを参考に!
Yahoo、Bing、Googleでの画像収集事情まとめ
https://qiita.com/ysdyt/items/565a0bf3228e12a2c503

収集した画像データを用いた分析

今回はメロンとスイカの画像を、PILという画像データを扱うライブラリを用いて、
分析しやすいように加工し、

さきほどのアヤメの分析と同じように、
SVMにて分類をおこないます。

まずはJupyter Notebookを実行しているディレクトリに、
「melon」, 「watermelon」のフォルダを配置します。
※フォルダ名を変更せずにお願いします。

そして、Jupyter Notebook で下記コードを実行します。

from PIL import Image
import numpy as np
import glob

# 画像を読み込んでデータとラベルに追加する
data = []
target = []

def glob_images(dir, label, size):
    files = glob.glob(dir + "/*.jpg")
    for f in files:
        img = Image.open(f) # 画像を開く
        img = img.convert("RGB") # RGB画質に変更
        img.thumbnail((size, size), Image.LANCZOS) # リサイズする
        ary = np.array(img).reshape(-1,) # 1次元に変更
        data.append(ary) # データに追加
        target.append(label) # ラベルに追加

# 画像ディレクトリを指定してデータを追加
glob_images("./melon", label=0, size=16)
glob_images("./watermelon", label=1, size=16)
# 学習用とテスト用に分割 --- (*1)
from sklearn.model_selection import train_test_split as split
x, x_test, y, y_test = split(data, target)

# データを学習 --- (*2)
from sklearn import svm
clf = svm.LinearSVC()
clf.fit(x, y)

# モデルを評価 --- (*3)
pred = clf.predict(x_test)
result = list(pred == y_test).count(True) / len(y_test)
print("正解率=" + str(result))

これとか面白そう
http://stmind.hatenablog.com/entry/2014/01/15/012418

ハンズオン作成で参照した記事・書籍

python14日目の素人だけどscikit-learnで機械学習やってみたい
https://qiita.com/wtnb93/items/d7a3eb2c3cc0b8c8086b
Scikit-learnで機械学習(SVMで分類する方法)
https://momonoki2017.blogspot.com/2018/01/scikit-learnsvm.html
ゼロからやさしくはじめるPython入門
http://amzn.asia/84wSwOj

7.さらに勉強していきたい人のために(リンク等)

いちばんやさしい機械学習プロジェクトの教本

http://amzn.asia/cLz3NuF

learning.ikeay.net 文系エンジニア、AI勉強中

http://learning.ikeay.net/
初心者に!

Pythonでゼロから機械学習/データ分析を学ぶためのサイトマップ

http://www.procrasist.com/entry/24-data-analysis-guide
この記事を1から読んでいけば、環境構築・エディタの使い方・Gitでのバージョン管理・Pythonの基礎・機械学習 ~ 強化学習と幅広い知識を身につけられます。

【世界で5万人が受講】実践 Python データサイエンス

https://www.udemy.com/python-jp/learn/v4/overview
有料ですが、全くの初心者から始めて、
データ解析の基本、可視化、統計、機械学習などデータサイエンスに関する知識を体系的に身につけることができます。