Kaggleデータ分析の手法について動画視聴したのでオススメしつつ個人理解をまとめてみた。


# Kaggleデータ分析の手法について整理。

※以下は
　Youtube動画 「Kaggle入門「タイタニックの生存予測」メダリストと一緒に解説！」を 
　実際に演習をしながら進め、個人の理解でまとめたものです。
　→　 https://www.youtube.com/watch?v=-QuM_QAC748
　　　（とてもわかりやすかったです）

## 最初に全体像
　　１．訓練用データ分割（学習・テスト）
　　２．予測モデル決定
　　３．モデルインスタンスへの訓練用学習データのfit
　　４．訓練用テストデータでの予測スコア確認
　　５．課題用データで変数データセットを準備
　　６．特徴量のうちカテゴライズ値を展開
　　７．予測結果submitとして、課題用データからレコードを一意に定める項目を拾ってくる
　　８．予測結果submitに予測項目列を作成し、
　　　　訓練データをfitさせた機械学習モデルインスタンスへ
　　　　課題用データを引数として与えた予測結果を対応付ける。
　　９．予測結果submitをCSVデータへ変換
　１０．Kaggleへの提出


## ファイルの準備、作業ディレクトリへの移動

　１．個人のアカウント配下のGoogleドライブの一部をマウントし、
　　　ipynb（ノートブックファイル）へ接続する。

　２．cdコマンドで、接続したGoogleドライブ内の
　　　テストデータ格納先ディレクトリへ移動する


## Notebookへのデータインポート

　１．pandasインポート
```python
import pandas as pd
```
　２．訓練データをpandasでreadする
```python
train = pd.read_csv('data/train.csv')
```
　３．課題データをpandasでreadする
```python
test = pd.read_csv('data/test.csv')
```

## 対象データの概要確認

##### ※以下は訓練データtrainを対象に確認した場合。
　１．保持データ件数を確認　★
```python
train.count()
```
　２．保持項目のデータタイプを確認　★
```python
train.dtypes
```
　３．Null値の含まれているデータ件数を項目ごとに表示確認　★
```python
train.isnull().sum()
```
　４．保持データサンプルとして先頭格納データを確認
```python
train.head()
```

##### ※以下は課題データtestを対象に確認した場合。
　１．保持データ件数を確認　★
```python
test.count()
```
　２．保持項目のデータタイプを確認　★
```python
test.dtypes
```
　３．Null値の含まれているデータ件数を項目ごとに表示確認　★
```python
test.isnull().sum()
```
　４．保持データサンプルとして冒頭格納データを確認
```python
test.head()
```
★…どんなデータを取り扱うにしても、非常に重要。


## 訓練データと課題データでの相違を整理しておく
　（例）
　　　・データ件数の差
　　　・項目数の差
　　　・項目ごとにデータタイプが一致していること
　　　・Nullを含む項目は訓練用・課題用それぞれでどれか
　　　・課題データ側で明らかにしたいその目的は何か
　　　・訓練データはどのモデルに基づいて機械学習を行うべきか
　　　　（これは追々…）


## 訓練用データに対し、事前準備をする
　１．訓練用データ内で予測モデル関数における独立変数となる定義域ｘと
　　　それらに対応する値域yを定義する。※
```python
x = train[['Pclass', 'SibSp', 'Parch']]
y = train[['Survived']]
```
　　　※訓練データの集合Sにおいてｘ∈S、ｙ∈Sのとし
　　　　ｘからｙへの写像（モデル）を考えるとき、
　　　　ｘ（変数）にどの要素を定めるか？
　　　　ｙ（予測値）にどの要素を定めるか？
　　　　ということ。

　２．（訓練用データの中で）学習データとテストデータに分割する
　　　（sklearn.model_selection　から　train_test_split　をimport利用）
```python
from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(x, y, random_state=0)
```

## 訓練データと課題データを適用する機械学習モデルを選択する
　　　①ｋ−最近傍法
　　　　　：データをプロットした際、対象データを
　　　　　　半径ｋ内に存在する分類済データが最も多く属するカテゴリと
　　　　　　同パターンになると判断していく手法
```python
from sklearn.neighbors import KNeighborsClassifier
```
　　　②ロジスティック回帰
　　　③サポートベクタマシン（超平面）
```python
from sklearn.svm import LinearSVC
```
　　　④決定木
　　　⑤ランダムフォレスト（多数の決定木による多数決）
```python
from sklearn.ensemble import RandomForestClassifier
```
　　　⑥勾配ブースティング回帰木
```python
from sklearn.ensemble import GradientBoostingClassifier
```
　　　︙


## 選択したモデルへ訓練用の学習データを適用後、訓練用のテストデータでスコア確認
　　１．モデルをパッケージからインポートする
　　２．モデルインスタンスを生成する
　　３．訓練データからSplitした学習用データｘ，ｙをモデルインスタンスにFitさせる
　　４．モデルインスタンスのScoreを訓練データからSplitしたテストデータで確認する
　　５．スコアが低い場合、１に戻る



##### ★ｋ−最近傍法の場合
　　１．モデルをパッケージからインポートする
```python
from sklearn.neighbors import KNeighborsClassifier
```
　　２．モデルインスタンスを生成する
```python
knn = KNeighborsClassifier()
```
　　３．訓練データからSplitした学習用データｘ，ｙをモデルインスタンスにFitさせる
```python
knn.fit(x_train, y_train)
```
　　４．モデルインスタンスのScoreを訓練データからSplitしたテストデータで確認する
```python
knn.score(x_test, y_test)
```


## 訓練済の機械学習モデルに課題用のデータを与え予測させる

　１．課題用データ（test）を用いて訓練用（train）と同様に
　　　予測モデル関数における独立変数を定める
```python
x_for_submit = test[['Pclass', 'SibSp', 'Parch']]
```
　２．予測結果submitとして予測結果の項目を定義するが、
　　　まず課題用データの対象レコードと一意に対応するように
　　　項目PassengerIDを採用する
```python
submit = test[[‘PassengerId’]]
```
　３．予測結果submitに項目列Survivedを作成し、
　　　訓練データをfitさせた機械学習モデルインスタンスへ
　　　課題用データを引数として与えた予測結果を対応付ける。
```python
submit[’Survived’] = knn.predict(x_for_submit)
```
　４．予測結果をCSVデータに変換し取得する
```python
submit.to_csv('submission/submit01.csv', index=False)
```
　　　※Kaggle上の提出時に不要なため、出力結果にindexは付けない

　５．Kaggleで提出

## 全体像（再掲）
　　１．訓練用データ分割（学習・テスト）
　　２．予測モデル決定
　　３．モデルインスタンスへの訓練用学習データのfit
　　４．訓練用テストデータでの予測スコア確認
　　５．課題用データで変数データセットを準備
　　６．特徴量のうちカテゴライズ値を展開　★後述
　　７．予測結果submitとして、課題用データからレコードを一意に定める項目を拾ってくる
　　８．予測結果submitに予測項目列を作成し、
　　　　訓練データをfitさせた機械学習モデルインスタンスへ
　　　　課題用データを引数として与えた予測結果を対応付ける。
　　９．予測結果submitをCSVデータへ変換
　１０．Kaggleへの提出

## 精度を高める

### ほかに有用な特徴量はないか？を検討する

　例：性別（Sex：male/female）を採用するとき

　１．訓練用データから、機械学習モデルに投入する変数項目として追加する
```python
x = train[['Pclass', 'SibSp', 'Parch', 'Sex']]
y = train[['Survived']]
```


### カテゴライズに用いる値を持つ項目列は、該当・非該当状態を表す項目列へと展開する

　※特徴量が数値ではないため、Sexの内容を0/1のデータに展開する。
　　0/1の「該当・非該当」データへ変換するには、pandasのget_dummies関数を用いる。
　※なおここでPclass（Ticket class）もカテゴライズされた値
　　（1 = 1st, 2 = 2nd, 3 = 3rd）なので、get_dummiesの対象列に含めることで
　　Sex同様に各値の該当非該当状態への展開の対象とする。
```python
x = pd.get_dummies(x, columns=['Pclass', 'Sex'])
```
　　→　One-Hot encoding


### 前述と同様の手順を踏み、訓練・予測を行う

　　１．訓練用データ分割（学習・テスト）
　　２．予測モデル決定
　　３．モデルインスタンスへの訓練用学習データのfit
　　４．訓練用テストデータでの予測スコア確認
　　５．課題用データで変数データセットを準備
　　６．特徴量のうちカテゴライズ値を展開　★ここを行った
　　７．予測結果submitとして、課題用データからレコードを一意に定める項目を拾ってくる
　　８．予測結果submitに予測項目列を作成し、
　　　　訓練データをfitさせた機械学習モデルインスタンスへ
　　　　課題用データを引数として与えた予測結果を対応付ける。
　　９．予測結果submitをCSVデータへ変換
　１０．Kaggleへの提出



### データ分割後に正規分布変換処理を挟み、精度を上げる
　１．インポート
```python
from sklearn.preprocessing import StandardScaler
```
　２．StandardScalerインスタンスを生成
```python
scaler = StandardScaler()
```
　３．訓練データによるfitting
```python
scaler.fit(x_train)
```
　４．訓練データを正規分布変換
```python
x_train_scaled = scaler.transform(x_train)
```
　５．テストデータを正規分布変換
```python
x_test_scaled =  scaler.transform(x_test)
```



### 欠損値を持つ項目列はNULL埋めを行う（平均値で埋める）

　１．欠損値を持つFareに対してNULL埋めを行っておく（平均値で埋める）
```python
x_for_submit['Fare'] = x_for_submit['Fare'].fillna(x_for_submit['Fare'].mean())
```

### 他の機械学習モデルを用いる

　　１．訓練用データ分割（学習・テスト）　★正規分布変換したり
　　２．予測モデル決定　★ここね
　　３．モデルインスタンスへの訓練用学習データのfit
　　４．訓練用テストデータでの予測スコア確認
　　５．課題用データで変数データセットを準備　★欠損値埋めたり
　　６．特徴量のうちカテゴライズ値を展開　★展開したり
　　７．予測結果submitとして、課題用データからレコードを一意に定める項目を拾ってくる
　　８．予測結果submitに予測項目列を作成し、
　　　　訓練データをfitさせた機械学習モデルインスタンスへ
　　　　課題用データを引数として与えた予測結果を対応付ける。
　　９．予測結果submitをCSVデータへ変換
　１０．Kaggleへの提出


以上。

## 動画（再掲）
 「Kaggle入門「タイタニックの生存予測」メダリストと一緒に解説！」
　→　 https://www.youtube.com/watch?v=-QuM_QAC748