予測 統計(実践編 分類) Python

勉強のアウトプットとして記事を書いているので間違っているところがあるかもしれません。ですので、お気軽にコメントとご意見、ご指摘してください。
今回は以前書いた、[予測 統計(実践編 単回帰) Python](https://qiita.com/banana19980702/items/8e6179216f9d8a115bc2)では回帰について行っていきましたが分類について書いていきます。

#内容
・機械学習の超概要
・分類についておさらい
・モデリングの流れ
・実践

##機械学習の超概要
分類について書く前に機械学習について簡単に説明します。
機械学習とは過去のデータからパターンを学習して予測するものです。人が行うデータ分析よりも予測精度が高いためいま世界中で使われています。機械学習では多くのパラメータ(機械学習の世界ではハイパーパラメータという)を必要とし、その数は何万にもなります。さらに、そのパラメータを用いるときにも不要なパラメータがあると過学習が発生してしまうので調整が必要となります。そして、機械学習を勉強するうえで欠かせないのが以下の二つです。
・教師あり学習
・教師なし学習
####教師あり学習
教師あり学習とは自分が入力したデータが正解となる手法です。実際に自分がデータを入力していき、そのデータをもとにコンピュータが将来のデータを予測していきます。イメージとしては、教師が生徒に勉強を教えていく感じです。
####教師なし学習
教師なし学習は実際の正解となるデータを入力せずにデータを予測していくものです。これはデータの本質を見抜くための手法で正解がないので、予測精度は測ることができません。イメージとしては、やりたいことが見つからない就活生みたいな感じです。

今回の実践では教師あり学習の中でも決定木という手法を採用しています。

##分類について
以前記事でも書きましたが、分類とはカテゴリに分けるものです。例えば、犬をダックスフンドとチワワに分けたり、ケーキをショートケーキやチョコレートケーキに分けていくことです。この分類で使われる手法が教師あり学習で、犬を分類して場合だとしたらまずダックスフンドとチワワの特徴(パラメータ)を入力していきます。胴が長かったらダックスだとか、目が真ん丸だったらチワワとかを入力していきコンピュータに判定させていきます。パラメータが多ければ分類精度をもちろん上がっていきますが、多すぎると過学習になってしまいます。たとえば、犬の場合だったら尻尾が長さというパラメータを入力した場合、尻尾の長さは個体差があるので判定しづらくなってしまいます。なので、パラメータを決める際は各々独立しているほうが分類精度が上がります。


##モデリングの流れ
モデルを作るまでの流れを説明します。
<b>①基礎分析</b>
・データの読み込み
・基礎統計量の確認
・欠損地の確認と修正
・クロス集計
・ビニング
<b>②決定木モデルの作成</b>
・説明変数の選択と決定
・目的変数の選択と決定
・決定木モデルの変数を作成
・決定木モデルの変数にデータを代入
・テストデータを決定木モデルに基づいて予想

##実践
実際のコードを載せていきます。

①基礎分析
まずは決定木モデルをつくるうえで必要なライブラリをインポートしましょう

```python
import pandas as pd
import numpy as np
from matplotlib import pyplot as plt
%matplotlib inline

from sklearn.tree import DecisionTreeClassifier as DT
from sklearn.tree import export_graphviz
import pydotplus
from IPython.display import Image
```
そして、pandasライブラリをつかってデータを読み込み、基本統計量を調べましょう

```python
train = pd.read_csv("train.csv") #過去データの代入
test = pd.read_csv("test.csv") #予測データの代入
sample = pd.read_csv("submit_sample.csv",header=None)

train.describe() #過去データの基本統計量の確認
test.describe() #予測データも確認

```
次に、欠損地の確認をしいきましょう

```python
train.isnull().sum()
test.isnull().sum()
```
次は、クロス集計をしていきます。クロス集計はある列のデータに対して、別の列のデータとの数値の関係を示す表です。コードは以下のような感じです。

```python
#crosstab関数でクロス集計ができる、marginsオプションは合計値も出力する
pd.crosstab(train["列名"],train["列名"],margins=True) 
```
次はビニングです。ビニングとはある区間の数値が何個あるのかを計算します。イメージはヒストグラムの階級と度数の関係みたいなものです。

```python
#第一引数の列データを第二引数の数値で分割します。
bining_data = pd.cut(train["列名"],[1,10,20,30,50,100])
```
②決定木モデルの作成
まずはどのパラメータを使いたいのか決めましょう。そして、そのパラメータを変数に代入していきましょう。複数行、複数列を代入したい場合はiloc関数が便利です。

```python
#行すべて、列は0行目から17行目までは抽出します。
trainX = train.iloc[:,0:17]
y = train["目的変数"]
#copy関数はすべてのカラムを抽出
testX = test.copy()
```
次は、抽出したデータをダミー化していきましょう。

```python
trainX = pd.get_dummies(trainX)
testX = pd.get_dummies(testX)
```
そして、決定木モデルを作るための変数を用意しましょう

```python
#第一引数は葉までの深さ、第二引数はサンプルの最小値
clf1 = DT(max_depth=2,min_samples_leaf=500)
```
過去データを代入していきましょう

```python
#必ず説明変数から代入
clf1 = clf1.fit(trainX,y)
```
次に、ジュピター上に表示したいのですが直接表示できなのでdotファイルに書き出してから表示します。

```python
export_graphviz(clf1, out_file="tree.dot", feature_names=trainX.columns, class_names=["0","1"], filled=True, rounded=True)
g = pydotplus.graph_from_dot_file(path="tree.dot")
Image(g.create_png())
```

さて、いよいよ予測してきます。<b>今回は回帰ではなく分類なのでpredict関数ではなくpredit_proba関数</b>を使います。

```python
pred = clf1.predict_proba(testX)
```
これで、分類を使った分析は終わりです。決定木モデルの表示は特に覚えなくていいのでコピペで大丈夫ですオプションは臨機応変に変えていください。
今回は決定木モデルを使っていきました。しかし、決定木モデルを使う上で葉までの深さと設定する最小値が重要になってきます。葉までの深さが深いほど過学習になりやすいので注意が必要なのです。だから、パラメータのチューニングをすることで過学習しにくくなるモデルを作成することが可能になります。それはまた次回の記事で書いていきます。