【Pythonではじめる機械学習】の個人的解釈 ①序章

# 概要
- [Pythonではじめる機械学習](https://www.oreilly.co.jp/books/9784873117980/)を読んで学んだことを都度、まとめていく（本書内容ではなく、自分なりの解釈のまとめです）
- 最初は序章部分から

# 本書を読む前にやったこと
- Courseraで[Andrew Ng氏のMachine Learningコース](https://www.coursera.org/learn/machine-learning)を受講
- [人工知能プログラミングのための数学がわかる本](https://www.kadokawa.co.jp/product/321708000339/)を読了
- [Python機械学習プログラミング 達人データサイエンティストによる理論と実践](https://www.amazon.co.jp/dp/4844380605)を読もうと試みる  
→　割と早めに挫折
- Kaggleに登録して、チュートリアルを兼ねたタイタニック問題のコンペティションに参加  
→　完全にチュートリアル頼りだったので理解はあんまり出来てない
- [Kaggleで勝つデータ分析の技術](https://www.amazon.co.jp/dp/4297108437)を購入  
→まだ読めてない（本書の次に取り掛かる予定）

# 内容の解釈

## 1. そもそも機械学習ってどんなイメージ？

- インプットされたデータに対して'特定のアルゴリズム'を使って計算処理を施し、何らかの情報をアウトプットする、というシステム

- ただし、この'特定のアルゴリズム'は、データを使って自動で調整、改善される（'機械'が最適なアルゴリズムを'学習'する）

```plantuml
left to right direction

rectangle "Input" as input
rectangle "何らかの\nOutput" as output
rectangle "学習用データ" as data
Usecase "特定のアルゴリズムを使った\n計算処理" as calc
input --> calc
calc --> output
data -> calc: "調整・改善"
```

*例 1：* 電子メールの文面をインプットとし、特定の計算処理をし、そのメールがスパムであるか否か、という情報をアウトプットする

- 学習用のデータとして、スパムメールの本文サンプルと正常メールの本文サンプルが計100万件あったとする
- このデータから、どのようなメールをスパムと判断すべきか、という法則を探し出し、アルゴリズムに反映させる
- このアルゴリズムに、スパムかどうかを判定したい電子メールの本文内容を投げ入れる事で、スパムか否かの結果がアウトプットされる

- ちなみに、専門家に上記のデータを分析してもらい、スパムメール判定のロジック（「暗証番号」という単語が$x$回出てきたらスパムとする、「パスワード」という単語の出現箇所から数単語以内に「連絡」という単語があったらスパムとする、etc.）を構築する、という若干アナログな方法も恐らく可能で、もしかしたらそれなりの成果を上げることはできるかもしれない
    - しかし機械学習では、人間の目や感覚では見過ごしてしまうような繊細な法則を捉えることが可能となる（特に、スパムメールの手法は年々巧妙になっていってるように思えるので、機械学習による効果は尚更と思われる）
    - そもそも、人力で100万件のデータを解析するのはかなり無理がある

*例 2：* 住宅物件の様々な情報（平米数、間取り、立地など）をインプットとし、特定の計算処理をし、その物件の適正価格の予想をアウトプットする

- 学習用データとして、物件詳細と売却金額を含んだ既存の売却済み物件10万件のリストがあったとする

- このデータを用いて、適正物件金額を算出する計算式アルゴリズムを構築する
- この計算式にインプットデータを渡す事で、適正物件金額がアウトプットされる

## 2. 機械学習の種類

- 教師あり学習
    - 学習用データに、正解のアウトプットが含まれている
    - 上記の例1と例2はともに教師あり学習の例（学習用データに、そのメールはスパムなのかどうか、その物件の売却金額はいくらなのか、の情報が含まれている）

- 教師なし学習
    - 学習用データに正解アウトプットが存在しない
    - 例として、テキストデータ群（様々なブログの本文の集合など）をインプットとして投入して、それぞれの文面の主題がなんなのかを判断する、など
    - この場合、インプットデータそのものが学習用データとなる、という捉え方で合ってるのだろうか
    - そもそも学習データ、っていう考え方でいいのかどうかも疑問

- それ以外にも強化学習とかもあるけど、本書では触れられない様子

## 3. 本書の学習をすすめる上での環境設定

### OS
- macOS Monterey Ver. 12.2.1

### Python及び必要ライブラリのインストール

- デフォルトで入っていたのはPython 2.7.18
- 今回の学習ではPython 3を使いたい
- でもせっかくなので、複数のPythonバージョンを管理できるよう、まずはpyenvを入れることにする

```bash
# pyenvのインストール
# ちなみにHomebrewはインストール済みの前提
~ $ brew install pyenv
```
- pyenvの設定

```bash
~ $ vim .bash_profile

# 下記内容を追加
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init --path)"

~ $ vim .bashrc

# 下記内容を追加
if command -v pyenv 1>/dev/null 2>&1; then
  eval "$(pyenv init -)"
fi
```

- 本書の学習においては、scikit-learn、numpy、pandas、matplotlibなど、諸々が必要
- pipで入れてもいいけど、せっかくなので[Anaconda](https://www.anaconda.com/)を入れる
- やっぱりバージョンの棲み分けができるよう、pyenvを通してインストールする

``` bash
# Anacondaのインストール
~ $ pyenv install --list | grep anaconda
~ $ pyenv install (インストールしたいAnacondaのバージョン)

# 本書学習用に使用するディレクトリを作成
~ $ mkdir ~/project_dir
~ $ cd ~/project_dir

# 作成した特定のディレクトリ下でだけ、インストールしたAnacondaバージョンを有効化する
~/project_dir $ pyenv local (インストールしたAnacondaのバージョン)
~/project_dir $ pyenv global system
```

- 本書のコードを試す際は、Jupyter notebookを使う
```bash
~ $ cd ~/project_dir
~/project_dir $ jupyter notebook
```

### でも結局

上記のセットアップを一通りやった後に、あれ、Google Colaboratory使えばいいんじゃないの？ローカルのリソースとか気にしなくていいし...って思いました。  
なので結局上記の環境はやめて、Google Colabのノートブック使ってます。

# 最後に
ものすごいざっくりだけど、序章部分はこんな感じで。  
個人的に注視したい部分をピックアップしているので、本書に書かれているかなりの内容を端折ってます。

そんなこんなで、次は教師あり学習の項目に突入していきます。