【初級者向け】Pythonで機械学習をやってみる～準備編～

# まえおき

前回はローカルのJupyterNotebookを使ってCSVデータを読み込み、データの操作を行いました。

今回はGoogle Colaboratory上で機械学習のための準備を行います。また、機械学習を行うにあたって、とりまく概要をあらためて見ていきます。

# 『機械学習』と『ディープラーニング』の違い

説明は無数にあるなか、あえてざっくり言うなら**機械学習**は、

>トレーニングにより、特定のタスクを実行出来るようにしているもの。このとき人間からの注視すべき事項の指示があるもの。

ディープラーニング（**深層学習**）は、

>人間の神経を真似て作ったニューラルネットワークでコンピューターによるデータ分析と学習を行う。

といったものといえる（ハズ）。というのも機械学習と深層学習は対比関係にあるものではなくて、機械学習のなかの一つの方法が深層学習であり、データ分析の際に使う手法が異なる。

人の神経を真似て作ったものをニューラルネットワークといい、それを使った方法が深層学習ということだ。

つまり、関係を表すとこんな感じ（よく見る図）。
![AI関係図.jpg](https://qiita-image-store.s3.amazonaws.com/0/352396/90d4df79-2614-d915-3138-e2161714574f.jpeg)

今日、AIと表現されているものの範囲が広すぎて何でもかんでもアリなのか？と思う。言ったもん勝ちなのか、、、

国の施策では「[研究開発税制](https://www.nta.go.jp/taxes/shiraberu/taxanswer/hojin/5441.htm)」として引き続き４つの減税制度があり、内閣府から「[ソサエティ5.0](https://www8.cao.go.jp/cstp/society5_0/index.html)」として研究分野やIoT、AI活用などを見込んで国策が取られている（CMもたまにやってましたね）。

この施策がリアルにエンジニア待遇2倍と結び付くかは都市伝説。

# 機械学習を体系的に見る

[JDLA（日本ディープラーニング協会）](https://www.jdla.org/)の、エンジニア向け学習体系より抜粋した内容が以下になります。
ジェネラリストは概論主体ですが、**エンジニア向け**内容は、業務主体になっていることがわかります。

因みに、JDLAの理事長は、あの人間とはなんぞや？な番組で聞き手のチュートリアル徳井さんに対して、語り手でAIのことを分りやすく教えてくれているあの方。セカンドシーズンでは徳井さんをイジったりしながら、人間とAIの境界も分りやすく教えてくれるあの松尾豊さんです。
  
<br>

**<h2>■エンジニア向け：機械学習の学習体系（シラバス）</h2>**

※ここでは「機械学習」についてのみ記載、そのほか「応用数学」、「深層学習」についての体系的学習も必要。詳細なJDLAのシラバスは[こちら](https://www.jdla.org/business/certificate/?id=certificate_No03)。


**・機械学習の基礎**
 
　　　学習アルゴリズム：*タスクT、性能指標P、経験E*

　　　能⼒、過剰適合、過少適合
   
　　　ハイパーパラメータ
   
　　　検証集合：*学習データ、検証データ、テストデータ、ホールドアウト法、k-分割交差検証法*
 
　　　最尤推定（さいゆうすいてい）：*条件付き対数尤度と平均⼆乗誤差、最尤法の特性*
   
　　　教師あり学習アルゴリズム：*ロジスティック回帰、サポートベクトルマシン、最近傍法、k近傍法*
   
　　　教師なし学習アルゴリズム：*主成分分析、k平均クラスタリング*
   
　　　確率的勾配降下法
   
　　　深層学習の発展を促す課題：*次元の呪い、局所⼀様と平滑化*
   
 
**・実用的な方法論**
 
　　　性能指標
   
　　　データの追加収集の判断
   
　　　ハイパーパラメータの選択：*⼿動でのハイパーパラメータ調整、グリッドサーチ、ランダムサーチ、モデルに基づくハイパーパラメータの最適化*

---

以上がエンジニア向けの機械学習のシラバスとなっているようです。どれも機械学習本に登場する内容ばかりなので、勉強進めるなか、全部とはいかなくても７～８割は理解しておきたいところです（Pythonで個々項目をサンプルコードで体感することが近道かもしれません）。

他の要素として、シラバスで明記されているとおり数学の知識は必要になってきますが、ここでは省略します（高校数学、大学数学、そして応用数学、、、理解が追いついたときに書きたいと思います）。

同様に深層学習シラバスもありますので、そちらも今後書いていく予定です。

# 機械学習とは

トレーニングにより、特定のタスクを、、、と簡易に上述しましたが、少し詳細に書くと、

機械学習はビッグデータから予測モデルを作成し、未知の部分の予測をする学習のこと。データに「正解タグ」を付けて与える教師あり学習と、正解データのない教師なし学習がある。

とも言えます。タグ付けして正解データを作成する工程を「アノテーション」と呼びます。教師あり学習では、正解データがもし適切でない場合に、分類や予測の精度が悪い結果となるため、この「アノテーション」工程は制度を左右する重要な工程で技術力が必要と言われています。

<br>

個人的に、犬と猫の画像を認識するプログラムに使う教師データとなる画像を作った（アノテーション）ことがありました。

綺麗に作られた犬と猫の画像の中に、人面犬やふなっしーなどの画像を混ぜて学習させると、**これまで正解していた画像が正解できなくなり**、ホントにアノテーションは大事だと体感しました（冷や汗、、、これをアノテーションと呼べるのか？）。


<br>

# 機械学習をやるために　～準備～

入門として多くの人がやってみたことのあるのはscikit-learn（サイキットラーン）だと思います。

ここでもscikit-learnによる簡易な機械学習に触れてみます。

使う環境はPythonの超便利エディターJupyterNotebookです。Markdown記法に対応していることもありこのJupyterNotebookをWebですぐに利用できる[GoogleColaboratory](https://colab.research.google.com/notebooks/welcome.ipynb?hl=ja)は、使わない手はありません。

まずは、scikit-learnを使う前に準備として「ライブラリ」というのをインストールしておく必要があります。必要なライブラリは「Numpy」、「Pandas」、「matplotlib」です。

以下のコードを実行します。

```python
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
#インライン表示宣言
%matplotlib inline
```

それぞれのライブラリの動作確認は以下を実行してみます。

---

**<h2>■NumPy</h2>**


NumPyは行列や統計関数を扱うことができ、数値計算を効率的に行うためのモジュールです。

配列というかたちで数値を扱うことでNumPyが機能しているか確認します。２次元配列というかたちで要素を構成してみます。

以下のコードを実行します。

```python
arr = np.array([[1,4,5], [6,3,2]])

arr
```
実行結果＞＞＞

```python
array([[1, 4, 5],
       [6, 3, 2]])
```
**<h2>■Pandas</h2>**


PandasはPythonでデータ分析や解析行う際に利用するライブラリです。

機械学習時は利用データをPandasの「DataFrame」に変換して操作・表示することが多く、Pandasが機能しているかDataFrameを作って確認します。

以下のコードを実行します。

```python
df = pd.DataFrame([["Sousou","Sonken","Ryubi"], #名前
                  ["GI","GO","SYOKU"], #国
                  [100,75,50], #武将数
                  [35,45,20]]).T #占有率、縦横転置
df.columns = ["Name","Country","Warlords","Occupancy"] #カラム名を付ける
df.index = [1,2,3] #行のインデックス
print(df) #DataFrameの表示
```
実行結果＞＞＞

```
     Name Country Warlords Occupancy
1  Sousou      GI      100        35
2  Sonken      GO       75        45
3   Ryubi   SYOKU       50        20
```

**<h2>■matplotlib</h2>**


matplotlibは科学技術計算などの結果をグラフで表示できるライブラリです。

データを図にプロットすることが出来るようになり、円グラフなどが表示できます。DataFrameを利用してグラフ表示して確認します。

以下のコードを実行します。

```python
x = np.array(df) #dfデータ配列を数値計算用に変換して変数xに代入
label = df['Country'] #dfデータのCountry列を変数labelに代入
Occupa = plt.pie(x[:,3],labels=label) #円グラフ関数で0から数えて3番目をグラフ化、ラベルはlabel変数を使う
plt.show() # 円グラフを描画
```
実行結果＞＞＞
![Occupancy円グラフ.jpg](https://qiita-image-store.s3.amazonaws.com/0/352396/d86f0337-25e4-6cb5-e913-9f7f28cc0faf.jpeg)

---
<br>
# 機械学習をやるために　～scikit-learn～

scikit-learn（サイキットラーン）はオープンソースのライブラリで、機械学習に必要な「回帰」「分類」「クラスタリング」などのアルゴリズムを備えています。


##■scikit-learnのアルゴリズム

scikit-learnの機械学習アルゴリズムは大まかに４つのグループに分かれています。
**<h2>回帰(regression)</h2>**
与えられたデータで学習し、目的の値を予測します。

**<h2>分類(classification)</h2>**
正解ラベルのあるデータで学習し、データに対してラベルを予測します。

**<h2>クラスタリング(clustering)</h2>**
データの似ている部分をグループ分けし、データの特徴やパターンを発見します。

**<h2>次元圧縮(dimensionality reduction)</h2>**
与えられたデータの次元が多い場合に、学習効率を上げるため次元削減という前処理を行うこと、または次元の削減により固有の構造を見つけ出す手法です。
___
<br>
##回帰分析

回帰分析の手法を使って「結果データ」と「結果に影響を及ぼすデータ」との関係性を統計的に求めていきます。結果データを「目的変数」、結果に影響を及ぼすデータを「説明変数」と呼びます。

回帰分析を行うモデルとして「線形回帰モデル」というものがあります。線形回帰とはすべてのデータに出来るだけ沿う線を引くことで、予測を行うモデルです。線の式は「最小２乗法」を用いて求めます。
説明変数が１つの場合は「単回帰分析」、複数の場合は「重回帰分析」と呼びます。



<br>

次回、scikit-learnのシンプルな回帰アルゴリズムを説明予定です。