Python初心者による機械学習まとめ

##はじめに
2019年11月現在[PyQ](https://pyq.jp/)でPythonを学習していますが、インプット過多になりがちなので学んだことのアウトプットとして投稿してきたいと思います。

理解が粗い部分もあるので、わかりづらい部分も多いかと思いますが頑張りたいと思います。

##目次
1.ロジスティック回帰
2.決定木
3.サポートベクターマシーン

#1.ロジスティック回帰とは 
ここから本題です。一言で言うならば・・・
二つのデータを線で分けることです！
＊細かく言うと直線の代わりにシグモイド曲線(S 字状曲線)で回帰する手法のことです
カタカナでロジスティックと書いてあるとかっこよいですが所詮線ってことです。
目的変数が2値（１か０や○か×みたいなこと）

＊誤差が正規分布に従わないため、実は線型モデルではないそうです・・
＊ロジスティック方程式によってロジスティック曲線が扱えるそうですが今回はいったんロジスティック回帰と言ったら直線で二等分と覚えておきます。
*線形非分離なデータもx1 * x2の値をとる３次元目の軸を追加して、ロジスティック回帰で分離可能です。SVM（Support Vector Machine:サポートベクターマシン）という手法は、このような分類を自動で処理します。

###プログラムの基本 
```python:
from sklearn.model_selection import train_test_split
# データをトレーニング用、評価（テスト）用に分割
X_train, X_test,y_train, y_test= train_test_split(X, y, test_size=0.3, random_state=0)

#sklearnからロジスティック回帰の入っているモジュールを取り出す
from sklearn.linear_model import LogisticRegression
# C=0.01, 0.1, 1, 10, 100を試した
lr = LogisticRegression(C=0.01, random_state=0)
scores = cross_val_score(lr, X, y, cv=10)

print("正答率", np.mean(scores), "標準偏差 +/-", np.std(scores))
```

###プログラムの解説
1. データをトレーニング用、テスト用に分割
2. 分類器を初期化
3. トレーニングデータで学習
 - lr.fit(...): 特徴行列と目的変数で学習
4. テストデータでスコア測定
 - lr.score(...): データを元にスコアを0〜1で返す
lr.scoreは結果が正しいかを正解の割合で返します。内部的にはlr.predict(X_test)を実行し、y_testと比較することでスコアを算出してくれています。





####補足


- LogisticRegressionの引数としてCが指定されています。
このCは正則化のためのパラメータです。正則化とは過学習を防ぐためにモデル式を調整すること。
過学習とは、モデルが複雑過ぎるために訓練データには当てはまるがテストデータでは当てはまらないこと。
パラメータCが減少するほど正則化の強さが増す。

- cross_val_scoreとはデータを分割して学習、判定を繰り返す検証方法です。 分割したトレーニングデータをさらに分割して、かつデータに偏りの無いように性能を検証できます。cv=10なので今回は10回パターンの分析をした平均値を出しています。


###関連ワード
ロジスティック関数
![guuu.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538771/d318dbf2-3b07-0a40-a3e5-c71d3481841d.jpeg)

＊ロジスティック関数とシグモイド関数は同じ意味で使われることがよくあります。
尤度関数：仮説が正しいものとしてトレーニングセットのデータが得られる確率
最尤推定法：尤度関数が最大になるようなパラメーターを決定する手法


#2.決定木とは 
一言で言うならば・・・
if文の連続によって分析結果を出力するものです。
以下が[公式サイト](https://scikit-learn.org/stable/modules/tree.html)の引用です。
![decision tree.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538771/43defb2c-97e1-eb46-2ba1-15d2103ce735.jpeg)
たしかに木のような構造をしていることがわかります。
木構造を用いて分類や回帰を行う機械学習の手法が決定木と言えます。

###プログラムの基本 
```python:
#sklearnから決定木のあるモジュールを取り出す
from sklearn.tree import DecisionTreeClassifier
tree = DecisionTreeClassifier()
# 決定木で分類
tree.fit(X, y)
#　テストデータでスコア算出
tree.score(X, y)
# 結果をプロット
plot_tree(tree, X, y)
```


###関連ワード
- ハイパーパラメーター：学習モデルに指定して学習の方法や処理の複雑さ、計算時のパラメーターなどを指定する値のこと
→決定木においてはmax_depthで指定。これは木の深さを指定するパラメーターで、小さいほど決定境界が単純になる。
これによって検証データの精度は下がるが過学習のリスクは減る
- 過学習：データには、推定に役に立つ情報と、推定に役に立たない情報（ノイズなど）の両方が含まれています。
ノイズを使ったモデルは、トレーニングデータにはよく当てはまりますが、テストデータにはあまり当てはまりません。
- アンサンブル学習:複数のアルゴリズムを組み合わせて、より強い学習モデルを作ろうとする手法の総称
- ランダムフォレスト：決定木をいくつか組み合わせ、多数決をとったもの

#3.サポートベクターマシーンとは 
一言で言うならば・・・
分類と回帰をする際に使えます！
Pythonでは同じアルゴリズムで、分類と回帰の2つの機能を使えます。
SVC（Support Vector Classification）：分類
SVR（Support Vector Regression）：回帰

線形SVMにおいては、下図のように分類、回帰されます。

| 特徴量の次元 | 境界の種類 | 
|:-----------:|:------------:|
| 2次元       |   直線    | 
| 3次元     | 直線     | 
|  n次元      | 超平面       |


＊ロジスティック回帰でも線形非分離な問題をなんとか解決できると解説しました。
SVMでは簡単に非線形の問題を扱うことができます。

###プログラムの基本 
```python:
#SVMのSVC(分類)を選択
from sklearn.svm import SVC
# モデル作成とトレーニングデータの学習
svm = SVC(C=1.0, kernel='linear')
svm.fit(X_train, y_train)
# テストデータでスコア算出
svm.score(X_test, y_test)
# 学習した領域のプロット
plot_regions(svm, X, y);
```
SVC(  )で，サポートベクターマシンによる分類器を呼び出して，clfという変数に一度格納。
内側のパラメータであるCとKernelはそれぞれ，ペナルティ寄与，サポートベクターマシンのタイプです．
ペナルティ寄与Cとは，境界を決める時のペナルティの寄与の大きさです．
Cが大きいほど，誤認識された点へのペナルティが大きくなります．
「kernel=’linear’」は線形のサポートベクターマシンを利用するということです．


###関連ワード
ハードマージン：線形分離のとっかかりがしやすく、線形分離が可能な物
ソフトマージン：ハードマージンより賢明なSVM

####参考URL
https://kenyu-life.com/2019/02/11/support_vector_machine/

https://qiita.com/t-yotsu/items/1a6bf3a4f3242eae7857