こんにちは。
株式会社オズビジョンSREチームエンジニアの渡邉と申します。
本記事は、6/14(木)に実施する、下記イベントの内容について記載しております!
https://oz-vision.connpass.com/event/87690/
★事前に「2.Anacondaのインストール」を終了しておいて頂けると、当日スムーズに内容に入れます。
目次
- ハンズオンの内容
- Anaconda のインストール
- Jupyter Notebook の実行
- ハンズオン - 1 簡単な計算・グラフの描画
- ハンズオン - 2 アヤメの分類
- ハンズオン - 3 写真判定
- さらに勉強していきたい人のために(リンク等)
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に同梱されているライブラリを用いて、教師あり学習のハンズオンを行います。
このハンズオンで取り扱う教師あり学習とは、問題と答えがセットになって学習する方法です。
未知のデータに対して予測や識別を行う手法です。
(教師なし学習は正解不正解のデータが入っていないので、傾向をつかむ学習方法です)
アヤメのデータセットという数値を訓練データ・テストデータに分け、訓練データを学習させます。
[アヤメの花]
その学習結果をもとに、テストデータの予測を行うというのが、今回のハンズオンの概要です。
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.さらに勉強していきたい人のために(リンク等)
いちばんやさしい機械学習プロジェクトの教本
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
有料ですが、全くの初心者から始めて、
データ解析の基本、可視化、統計、機械学習などデータサイエンスに関する知識を体系的に身につけることができます。