PythonによるAI・機械学習・深層学習アプリのつくり方【1章】：読書メモ

# はじめに
書籍：[すぐに使える! 業務で実践できる! Pythonによる AI・機械学習・深層学習アプリのつくり方](https://www.amazon.co.jp/%E3%81%99%E3%81%90%E3%81%AB%E4%BD%BF%E3%81%88%E3%82%8B-%E6%A5%AD%E5%8B%99%E3%81%A7%E5%AE%9F%E8%B7%B5%E3%81%A7%E3%81%8D%E3%82%8B-Python%E3%81%AB%E3%82%88%E3%82%8B-AI%E3%83%BB%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92%E3%83%BB%E6%B7%B1%E5%B1%A4%E5%AD%A6%E7%BF%92%E3%82%A2%E3%83%97%E3%83%AA%E3%81%AE%E3%81%A4%E3%81%8F%E3%82%8A%E6%96%B9-%E3%82%AF%E3%82%B8%E3%83%A9%E9%A3%9B%E8%A1%8C%E6%9C%BA/dp/4802611641) について
章ごとのポイントをまとめていきます。
今回は1章なので、概念部分がメインになります。

# 1-1　機械学習とはなにか
## 機械学習とは?
一言でいうなら・・・
人間の学習能力と同様の機能をコンピューター上で実現する技術

従来の識別プログラム：人間が**ルール**を決める
機械学習：大量のデータから**特徴**を学習する

## 機械学習でできること
- **分類**（classification）：与えられたデータの分類（リンゴ:apple:orみかん:tangerine:）
- **回帰**（regression）：過去の実績から未来の値を予測（天気:sunrise_over_mountains:、株価の予測:chart:）
- **クラスタリング**（clustering）：データの似た者の集合に分類（あらかじめ分けるのではなく、似たもので区分け）
- **推薦**（recommendation）：データの関連情報を導き出す（Amazonのあなたにおすすめ:boy:）
- **次元削除**（dimensionality reduction）：データの特徴を残して削減（データの特徴を抽出し、グラフに描画:chart_with_upwards_trend:）

## 具体的に機械学習を何に適用できるか？
- **画像解析**・・・画像に映っている物体を判定（リンゴ:apple:orみかん:tangerine:）
- **音声解析**・・・音声からテキストに変換、どんな音なのか判定（わんちゃん:dog:orねこちゃん:cat:）
- **テキスト解析**・・・文章のカテゴリ分け、特定表現の抽出・構文解析（迷惑メールの判定:e-mail:、自動翻訳）

## 深層学習（ディープラーニング）とは
AIブームの火付け役。:fire: 
しかし、ポンっと突然登場したわけではない。『ニューラルネットワーク』を改良したもので、
人間の脳を模倣した『ニューラルネットワーク』を多層に組み合わせることで実現したもの。

#### 機械学習が実用化された主な2つの理由
理由①：インターネットの普及により**大量のデータが手軽**に入手できるようになった

理由②：コンピューターの**高性能化**

## 機械学習の仕組みは？
データ入れりゃなんでもできる、という訳ではない。
入力データを整形する必要があるし、勝手に驚くような結果をだすわけでもない。

ある食品（:cake:と:candy:）の2種類の成分があるとして、グラフにプロットするとはっきり分かれたとする。
これをプログラムで判定するには、:cake:と:candy:の**境界線**を引いて、その**上か下にあるか**を調べれば、簡単に答えが出せる。
その境界線が『y = 1.3x』という式に当てはまるなら、以下のプログラムで判定ができる。

```python
def check_CakeOrCandy(x,y):
    threshold = 1.3 * x
    if y >= threshold:
        print("cake")
    else:
        print("candy")
```

ここで問題になるのが境界線『y = 1.3x』をどのようにして、引くのか。
機械学習では、様々な手法を利用して、この境界線を決定していく。（実際はもっと複雑）
大量のデータを学習することで、境界線の角度と位置を調整していくイメージでOk:+1:

#### 代表的な機械学習の種類
- **教師あり学習**（リンゴ:apple:orみかん:tangerine:）
    - データと共に正解が与えられる
    - 未知のデータに対して予測を行う
- **教師なし学習**（クラスタリングやベクトル量子化）
    - 正解データは与えられない
    - 未知のデータから**規則性**を発見する
- **強化学習**（エージェントが**報酬**により行動を決定し、よい行動を学習）
    - 行動により部分的に正解が与えられる
    - データから最適な解を見つける

# 1-2　どのようなシナリオで機械学習を行うのか？
通常のプログラムでは、**仕様書の作成** :arrow_right: **実装** :arrow_right: **テスト** :arrow_right: **リリース**
という具合に基本的な手順があるように、機械学習のプログラムでも基本的な手順がある。
## 機械学習の基本的な手順
ゴールの決定 :arrow_right: データの収集 :arrow_right: データの整形・加工 :arrow_right: データを学習* :arrow_right: 機械学習の手法を選択 :arrow_right: パラメータの調整 :arrow_right: データを学習してモデルを構築 :arrow_right: モデルを評価:arrow_right: 精度がなければデータの学習*に戻る:arrow_right: 業務で活用

# 1-3　機械学習で利用するデータの作り方
データをどこからどのように収集し、どんな形式で保存すればいいのか
## 何のために機械学習を利用し、どのようにデータを収集するのか
まずはじめに、**完成目標を具体的に思い浮かべること。**機械学習は強力な問題解決法だが、万能ではない。

【データの収集について】
あらかじめ、**定量のデータ**を用意できることが前提になってくる。
（社内データやWeb上にあるダウンロードできるオープンデータ） 

- データ収集の例
    - SNSやブログのトレンド情報の収集:chart_with_upwards_trend:
    - ネットショップの商品データ:department_store:
    - 金融情報/株の相場:chart:
    - オープンデータ（気象情報や各種統計）:signal_strength:
    - 辞書データ（Wikipedia）:books:
    - 機械学習用のデータセット:file_folder:

## 収集したデータの保存形式は？
より、**汎用的なデータフォーマット**で保存しておくと、後から利用しやすい。

- 機械学習で役立つデータフォーマット
    - CSV
    - INI
    - XML
    - JSON

より大規模なデータを扱う場合は、データベースに保存する（MySQL/PostgreSQL/SQLite/SQLServer/Oracle）

## 機械学習に入力するデータに関して
構造化されたデータがあるなら、その構造を解析し、そこから学習に利用するデータを集めて、上記のような形式に整形する必要がある。

- 次元の呪いについて:skull:
    - 使えそうなデータを**何でも学習の対象**に加えると、十分な性能を発揮できなくなる。**扱う特徴量（次元）が多くなりすぎる**と、モデルが効率よく分類（または回帰）できなくなる。そのため、**不要な特徴量を削る**ことでより良い性能を引き出すことができる。
    
**【データの正規化について】**
データを一定のルールに基づいて変形し、利用しやすくすること。

### COLUMN ～過学習について～
『**過学習（overfitting）**』とは、機械学習において、学習のしすぎが原因で、未学習の問題に対して正しい答えを出せなくなってしまう現象のこと。**学習用のデータに特化**しすぎて、それ以外のデータに対して、正しい判断ができなくなってしまう。学習のしすぎで、**判断の基準が厳しくなる**ため、少しでも違うパターンが異なると答えを出力してしまう。
# 1-4 インストール不要で使えるColaboratoryについて
Webブラウザーからすぐに機械学習を実践することができる便利な環境
## Google Colaboratoryとは？
インストール不要で、必要なのはHTML5に対応したWebブラウザーだけ。:globe_with_meridians:
しかもPCだけでなく、iPhone/iPadやAndroidでも機械学習を実践できる。（すごい）

- **Colaboratoryのメリット**
    - 環境構築不要
    - 基本的な使用は無料
    - ローカルマシンのスペックに依存しない

- **Colaboratoryのデメリット**
    - 一定期間使用しないと、仮想マシンが停止し、**すべて初期化**される
    - 最大利用時間を超えて実行すると初期化される（執筆時点：12時間）:clock12:
 
## Colaboratoryの基本的な使い方
Googleアカウントがあれば以下から使用可能
> Google Colaboratory
> 
> https://colab.research.google.com/

ノートブックを作成し、コードセルを挿入してプログラムを書いていくことで、実行することができる。
Colaboratoryはサーバー上で実行されるため、ローカルのファイルを使うためにはサーバーにアップロードする必要がある。
そのために用意されているのが**google.colab**モジュール

```python
from google.colab import files
uploaded = files.upload
```
これにより、ローカルPCのファイルをアップロード:arrow_up:できるようになる。
# 1-5 Jupyter Notebookの使い方
このツールを使うと、プログラムと実行結果、ドキュメントを**1つのノートにまとめる**ことができる。
## Jupyter Notebookとは？
Pythonのエディターと実行環境を1つにまとめた便利なツール
ローカルのPCにインストールが必要だが、使い方はColaboratoryと同じで、気軽にプログラムを実行できる。

- **Jupyter Notebookの主な機能:orange_book:**
    - Webブラウザー上でプログラムを開発できる
    - Pythonプログラムをすぐに実行できる
    - 1つのノートに複数のプログラムとその結果を記録できる:clipboard:
    - プログラムといっしょにドキュメントも記録できる:clipboard:

## Jupyter Notebookの実行
#### コマンドラインからの起動
```
$ jupyter notebook
```
####新規ノートブックの作成
【New > Python3】
~~細かいことはぐぐっry~~

## ノートブックには複数のセルを挿入できる
- Jupyter Notebookのメニューから**[Insert > Insert Cell Below]**を選ぶとセルが追加される。
- Jupyter Notebookのメニューから**[Cell Run All]**で一番上のセルから順に下へと実行していく。:runner:
- うまくプログラムが実行できなくなった場合、**[Kernel > Restart]**
- 素早くセルを挿入するには**[ESC]+[B]**
- その他のショートカットは**[Help > Keyboard Shortcuts]**で確認できる

## 値を確認できるだけでなくグラフも表示できる
**簡単なサイン波:wavy_dash:のグラフ**

```python
import numpy as np
import matplotlib.pyplot as plt

x = np.arange(0, 10, 0.1)
y = np.sin(x)
plt.plot(x, y)
plt.show()
```
## Markdown記法でドキュメント生成も可能
新規セルの作成後に、**[Cell > Cell Type > Markdown]**
**Markdown記法**は「# 見出し」や「- リスト」などの記号を使って、テキストをマークアップする記法のこと。
ドキュメントを見やすくするためにも、基本的な操作はマスターしておくといいとのこと。

~~ここを見ながらしか書けない~~
https://qiita.com/kamorits/items/6f342da395ad57468ae3

絵文字も入れれる:warning::mount_fuji::corn:
https://qiita.com/yamadashiii/items/ae673f2bae8f1525b6af

# 1-6 個別にプログラムを実行する方法
## コマンドラインとは
コンピューター:computer:への命令をキーボードから『コマンド』と呼ばれる文字列の入力で行う入力方法のこと。
Windowsでは、スタートメニューから**[Anaconda > Anaconda Prompt]**
#### プログラムの実行方法
```
$ python ファイル名.py
```
**Tips：**ファイルをコマンドラインにドラッグ＆ドロップすると、ファイルのパスが自動的に入力される。

- プログラム実行の流れ
    - コマンドラインの起動
    - cdコマンドでカレントディレクトリの変更
    - pythonコマンドでプログラムの実行


pythonの**モジュールのインストール**にも利用できる。

# まとめ
この章では**機械学習でできること、どんなデータを使うか、手順、利用するデータフォーマット、実行環境**を学んだ。

**Next:running:**
次章は、サンプルを利用して、機械学習の雰囲気を掴む。
また、機械学習ライブラリの**「scikit-learn」**やデータ処理に役立つ**「Numpy」**や**「Pandas」**の基本的な使い方を紹介する。