機械学習はじめの一歩  ~pythonによる実装もやってみたい人へ~

## 機械学習はじめのはじめ part1

### はじめに

こんにちは。2020年、4月から社会人になる、mizutakawaterです。野球とラクロスが好きです。
卒業研究で、強化学習について学んでいるのですが、機械学習！人工知能！AI！と騒がれている中で、わかりやすくそれについて説明されたものなくない？って感じました。(そもそも、学術的なものだったり、エンジニアの技術書って、文系学問に比べて初学者に不親切すぎね？ってよく思ってます。わかりやすいものをわかりにくく言うってエンジニアの文化なの？？？)←熟練エンジニアに殺されそう


て訳で、_初心者にも本当にわかりやすく(←大事なコンセプト)_機械学習の導入、pythonを用いて行っていきたいと思います！！細かいところは異なる部分もあるかもしれませんが、文系出身エンジニアらしく、わかりやすくを追求します。

### 導入

#### 覚えたい用語

いきなりいかつい単語だけど、2つだけなのでここは我慢(笑)。単語は覚えなくても概要の方だけわかって貰えれば問題ないです。

|  | 概要 | 表記(慣例) |
|:-:|:-:|:-:|
| 説明変数 | 予測に使われるデータ、特徴量ともいう |  X |
| 目的変数 | 予測したい数値、データ  |  y |

_例_: 陸上選手の身長、体重、年齢(説明変数)から100m走のタイム(目的変数)を予測する

### 機械学習の種類
機械学習は主に3つに分けられます！早速、さきほど出てきた説明変数、目的変数を使いながら学んでいきます（復習兼ねて）

- 1 教師あり学習

```
説明変数(X)を使って目的変数(y)を予測する。
正解のデータ(説明変数)を用意しておいて、そこからほしいデータ(目的変数)を予測するイメージ
```
- 2 教師なし学習

```
目的変数が不明な状態で、説明変数から目的変数自体何がいいかも予測する
```

- 3 強化学習

```
プログラムが自分自身でより良い選択を学んでいく
```

今回は、__誰でもわかりやすく__がコンセプトなので基礎の基礎である教師あり学習について学んでいきましょう！教師なし学習、強化学習は違うプログラムで！

### 教師あり学習を学ぶにあたって
教師あり学習には２種類あります。

| 種類 | 内容 | 例 |
|:-:|:-:|:-:|
|  回帰 | 数値の予測  | 100m走タイム予測  |
|  分類 | カテゴリーの予測  | 男性か女性か予測 |

回帰、とか、分類とか難しそうな単語ならんでる、、
→結局は数を予測するか(= 回帰)、属性を予測するか(= 分類)の違いです！

では、早速、__教師あり学習__の__回帰__を実践しながら学びましょう！

## 実践

### 数値の予測

まず最初に簡単な問題。考えてみましょう

A~D君がいます。彼らの身長、体重は以下のようになっています。
A君: 40kg, 150cm
B君: 50kg, 160cm
C君: 60kg, 170cm
D君: 70kg, 180cm

では、体重が55kgのE君の身長は何cm(と予測できる)でしょうか。



![question1](https://vps12-d.kuku.lu/files/20191218-0611_dc0432814647eddc597cf8f7b3d8abd1.png)

おそらく、図のように4つの線を直線で結んで、あれ、ちょうど55kgのとこに、この直線重なってるじゃん！！！はい、165ｃｍ！って感じだと思います。xに関する1次式(中1で習ったやつ！！)で、数式にするとこんな感じ。

```
y(身長) = x(体重) + 110
```

めちゃ、簡単、、その通りです。そして、この直線こそが目的変数を予測するための、__目的関数__というものです。__機械学習(回帰)はこの目的関数を求めること__がほぼゴールです！(異なるアルゴリズムでは違うアプローチもありますが、一旦無視で！すみません！)なぜなら、
`この直線の式がわかればX = 55を代入すれば身長わかりますもんね`
簡単だ、
でも、こんな都合よくデータがあるわけねーだろ！


ということで、長くなってしまうので、次回、データ(説明変数)がもっと複雑だったときの目的関数の求め方を学んでいきましょう〜
(あれ、目的なんだっけ。目的は__教師あり機械学習の回帰について学ぶこと__ですね！
もうちょっと説明変数が複雑だったとき、体重55kgの人の身長どうやって予測するの？？って話がわかれば嬉しい〜)

理論編はpart1はここまで。以下、pythonによるコード実装編です。

### pythonによる上記グラフの実装編!

__pythonを使った__ということもテーマで謳っているので、このグラフの作り方も学んでいきましょう。初心者にはちょうどいいかも！初学者用なので、環境構築から見ていきましょう！
(pythonによる機械学習の本格的な実装は次回以降！)

### 環境構築
- 用いた環境 :Anaconda, MacOs
- エディタ、実行環境 :JupyterNotebook

#### Anaconda、JupyterNoteBookを使うメリット
AnacondaはPythoの実行環境等の管理を手軽に行えるツールです。プログラミングの最初の関門の環境構築。Anacondaを使えばサクッとできます。これを利用しない手はありません。

#### Anacondaのインストール
ここでは、ターミナルでなく、公式ホームページへ行ってインストールします。

```
https://www.anaconda.com/distribution/#macos
```
画面の手順どおりにインストールしていきますが、python2ではなく、python3のバージョンをインストールしましょう。
迷ったらこのページを参考にしてください
[Anacondaインストール](https://weblabo.oscasierra.net/python-anaconda-install-macos/)

#### JupyterNoteBookを開いて以下のようなページに飛んだら完了です！
![](https://d2l930y2yx77uc.cloudfront.net/production/uploads/images/11551020/picture_pc_2484d652470145e487fd953a31157e87.png)


以下、上のエディタに実装するコード

```python
# グラフを壁画するモジュールのimport
import matplotlib.pyplot as plt
#　説明変数の設定
X = [40, 50, 60, 70]
# 目的変数の設定
y = [x+110 for x in X]
# グラフの壁画
# グラフのインスタンス作成
plt.figure(facecolor="w", figsize=(8, 6))
# グリッド(網目)入れる
plt.grid(True)
# 各人の身長、体重の点々
plt.scatter(X, y)
plt.scatter(55, 165, color="red")
# 目的関数のピンクの直線
plt.plot(X, y, color="pink")

#グラフ概要
plt.xlabel("weight(kg)")
plt.ylabel("height(cm)")
plt.title("predict")
# plt.savefig("保存したいディレクトリpath"/保存したいファイル名") #グラフ保存したければ
```
これで左上の再生ボタンみたいなのを押せばグラフが表示されるはず！

## 終わりに　次回予告

今回は、「機械学習を学ぶにあたって」の導入編、プログラミングの実行環境構築、簡単なグラフの実装を学びました。どれもぼくがこんなのあったらいいなと思ったものを書いていきました。
次回は

- [単回帰分析とは](https://qiita.com/mizutakawater/items/8b78a3eb4dc37034137f)
を書いていきたいと思います。よろしくお願いします！