文系人間が機械学習をざっくりと説明してみる

#イントロ
文系・初心者の私が機械学習について少し学んだのでざっくりとまとめてみました。
初心者向けにざっくりとイメージだけ掴む感じで書いたのと独学なのとで間違っていることがあればご指摘ください。

この記事では下記について書きます。
・機械学習ができるライブラリ
・scikit-learnでできること
・scilit-learnの使い方

#そもそも機械学習とは
機械学習については下記のサイトが参考になりました。
https://qiita.com/taki_tflare/items/42a40119d3d8e622edd2
人工知能を形成している一部分という感じでしょうか。

機械学習の一部にニューラルネットワークというものがあります。ニューラルネットワークはざっくりいうと「人間の脳の機能を真似して作られた計算処理」という感じらしいです。ニューラルネットワークには入ってきたデータの特徴を絞り込んだりする層(隠れ層)がありますが、その層を何層も重ねたものがDNN(DeepNeuralNetwork)でこれを使った学習がディープラーニングと呼ばれているようです。
参照ページ：
http://leapmind.io/blog/2017/06/16/%E3%83%87%E3%82%A3%E3%83%BC%E3%83%97%E3%83%A9%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0%EF%BC%88deep-learning%EF%BC%89%E3%81%A8%E3%81%AF%EF%BC%9F%E3%80%90%E5%85%A5%E9%96%80%E7%B7%A8%E3%80%91/
https://www.sbbit.jp/article/cont1/33345

ここについては細かくすると長くなりそうなのと、難しすぎて私が理解しきれていないので省略します。
とりあえず機械学習は「人工知能を担っている計算処理」ができるらしいのです。

#機械学習ライブラリとは
機械学習するのにもいろんな会社や個人がいろんなライブラリを出してるようです。

- Tensorflow
- Caffe
- NNabla
- Chainer
- scikit-learn

などなど、それぞれ得意分野があるそうです。
参照ページ：https://qiita.com/jintaka1989/items/bfcf9cc9b0c2f597d419

とりあえず何でもできると言われているscikit-learnを使います。

# scikit-learnでできること

![scikit-learn.png](https://qiita-image-store.s3.amazonaws.com/0/227535/45bb43dd-d824-eb54-3968-5cdc77ce9e36.png)

この図、英語で書かれているのでぱっと見よくわからないのですが、scikit-learnのどのモジュールを使えばいいか教えてくれています。
Startから始まって、最初に「50以下のデータかどうか？」と聞かれます。データ数が50以下であれば「もっとデータ集めてね！」と言われて、50以上であれば「カテゴリーの予測したいの？」と聞かれる。というように選択肢がわかれていきます。

この図自体、4つの丸で囲まれているようにscikit-learnでは分類、クラスタリング、回帰、次元削除ができます。

## 分類とは何か
最初にグループ分けを作っておきます。
例えば手書きの〇、△、□のデータをあらかじめ、これは〇、これは△、これは□というように登録したものを作っておきます。
そして、新しく入ってきたデータが〇なのか△なのか□なのかを判定する。
これが、分類です。

下記ページのグラフがわかりやすいかも。線で囲まれた中のどこに入ってくるかによって赤なのか青なのか分類されます。
https://tjo.hatenablog.com/entry/2014/01/06/190456

チャットボットでのQAシステムを作るのとかに使えそうです。
「新しい質問が来る→既存のどの質問に該当するのか分類する→回答を渡す」みたいな。

## クラスタリングとは何か
グループがつけられていないデータの集合体をグループに分けます。
いくつのグループにわけるかは自分で設定しないといけないようです。

下記のサイトの画像のようにデータの集まりを３つに分けたい場合に赤、青、緑に分けてくれます。
https://pythondatascience.plavox.info/scikit-learn/%E3%82%AF%E3%83%A9%E3%82%B9%E3%82%BF%E5%88%86%E6%9E%90-k-means

購買者層のグループ分けとかそういうのに使うんでしょうかね...?

## 回帰とは何か
元のデータの集まりからグラフを導きだします。
そして新しいデータに対してどれくらいの値がでるのかを予想します。

簡単な数学で説明すると、例えば今までのデータがx=1のときy=3,x=2のときy=5,x=5のときy=11となっていたとします。
そうすると、なんやかんや計算して下記の式で表せるのでは？となります。

```
y=2x+1
```
そうすると、未知のx=3.5に対してy=8くらいになるんじゃないの？？と予想ができます。
今回は全部直線上にある値でしたが、もちろんそうなることはほとんどありません。

どんな式で表せるかな？そしたらこの値に対してどんな数値がでるかな？という予測ができるようになるのが、回帰分析です。
マーケティングとかで使える様子です。

詳しくは下記の記事がわかりやすいかも。
単回帰分析:https://www.albert2005.co.jp/knowledge/statistics_analysis/multivariate_analysis/single_regression
重回帰分析:https://www.albert2005.co.jp/knowledge/statistics_analysis/multivariate_analysis/multiple_regression

## 次元削減とは何か
人間がわかりやすく認識できるように、式の次元を減らそうというものだと思っています。

例えば体重と身長というX,Yの二次元のグラフがあるとします。
入ってきたデータでAさんが(160cm,60kg),Bさんが(180cm,67.5kg),Cさんが(172cm,64.5kg)だったとします。
そうすると、このデータ比例しているから体格という直線(一次元)のグラフにしちゃえ、ということらしいです。

この記事が分かりやすかったです。
https://qiita.com/aya_taka/items/4d3996b3f15aa712a54f


#scikit-learnの使いかた

公式サイト：http://scikit-learn.org/stable/
[チュートリアル](http://scikit-learn.org/stable/tutorial/index.html)もあります。

先述のチートシートに回答していくと、おすすめのライブラリがわかるようになっています。
(チートシートにのっていない人の神経細胞をモデルにしたMLPClassifyなどの分析方法もあるみたいですが。)


まずはpipでscikit-learnをインストールします。
公式：http://scikit-learn.org/stable/install.html

```
pip install -U scikit-learn
```
-U はpipのupgradeオプションみたいです。

pythonのファイルの先頭で使いたいクラスに合わせてこんな感じでインポートします。

```
from sklearn.neural_network import MLPClassifier
```
あとはドキュメントを見ながらどんなデータを引数にいれたらいいのか確認しつつ、必要なものを渡してください。

公式サイトにもいろいろとサンプルコードがのっているので、自分のやりたいことができそうなコードを書いてみてください。
http://scikit-learn.org/stable/auto_examples/index.html

`matplotlib`などをインポートしてグラフで表示するところまで載ってるのもあるのでわかりやすいかと思います。

# まとめ
機械学習は下記の手順で行えそうです。

- どんなことがしたいかに合わせてライブラリを決める
- 分析手法を決める
- データを集める
- 適切な形にして、ライブラリにデータを引き渡す
- (matplotlibなどでグラフ化して見やすくする)

チュートリアルからトライしてみましょう。
できるようになったら、[kaggle](https://www.kaggle.com/)などのサイトで予測精度を競ってみても面白いかもしれないです。
私もまだKaggle未挑戦なので、近々挑戦してみたいと思います。

間違っている点へのご指摘やもっとおすすめのサイトあるよ、などいろんな情報いただけると嬉しいです。