Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

こんにちは。
株式会社オズビジョン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
有料ですが、全くの初心者から始めて、
データ解析の基本、可視化、統計、機械学習などデータサイエンスに関する知識を体系的に身につけることができます。

WY-MEVI
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした