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](https://qiita-image-store.s3.amazonaws.com/0/224272/7fcf738b-7a31-888e-9f0b-59e99dcfbc31.jpeg)
[アヤメの花]


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


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