個人用メモ Python Kaggle 機械学習勉強中

# お題目

特になし。
(決定次第更新する予定です。個人用メモになりますので、何を書こうか決まっていません。)


また、書く量が増え次第、綺麗に編集していきます。

Kaggle 2019/02/02 アカウント作成
現在以下のコンペのKernelsを参考にして、勉強中です。
[Don't Overfit! II](https://www.kaggle.com/c/dont-overfit-ii)

本当はTitanicをした方がいいと思うのですが、そこは気分です。

## Kaggleコンペ実施手順
１．コンペ内容把握
２．データ収集
３．データ前処理
４．学習
５．精度評価と試行錯誤
６．サブミッション

## 機械学習アルゴリズム(ML)の種類
Kaggleとは全く関係なくもないですが、良く言う機械学習という言葉の中にある専門用語はどのグループに分類できるのかざっとまとめました。

- 線形
    - 線形回帰(Linear Regression)
    - ロジスティック回帰(Logistic Regression) *注意 回帰と書いてますが、分類だそうです。
    - サポートベクタマシン(Support Vector Machines)
- 木
    - 決定木(DT:Decision Tree)
    - ランダムフォレスト(Random Forest)
    - 勾配ブースティング決定木(GBDT:Gradient Boosting Decision Tree)
- k最近傍法(k-NN:k-Nearest Neighbor)
    - 以下3つも把握できる優れもの  
        - クラス分類
        - 回帰分析
        - モデルの適用範囲(適用領域)の設定 
- ニューラルネットワーク(NN:Neural Networks)
    - ディープラーニング(DP:Deep Learning)

## 機械学習の手法による分類

- 分類(Classification)
    - 回帰という手法は、過去のデータから「パターン」を学習し、未知の結果を予測します。
    - k近傍法(k-Nearest Neighbors)
    - 線形回帰(LinearRegression)
    - サポートベクタマシン(SVM)
    - ディープラーニング(DT)
    - ニューラルネットワーク(NN)
- クラスタリング(Clustering)
    - K平均法(K-means)
    - 階層型クラスタ分析(HCA)
    - EMアルゴリズム(EM Algo:Expectation Maximization)
- 可視化と次元削減(Visualization and dimensionality reduction)
    - 主成分分析(PCA:Principal Component Analysis)
    - カーネルPCA(Kernel PCA)
    - 局所線形埋め込み(LLE:Locally - Linear Embedding)
    - t-distributed Stochastic Neighbor Embedding (t-SNE)
- 相関ルール学習(Association rule learning)
    - Apriori
    - Eclat
- 半強化学習(Semisupervised learning)
    - DBN
    - 制限付きボルツマンマシン(RBM)
- 強化学習(Reinforcement Learning)
    - Q Learning
    - DQN
- バッチ処理(Batch Learning)
    - オンライン処理(Online learning)
    - ミニバッチ処理(Minibatch Learning)
- アンサンブル学習(Ensemble Learning)
    - バギング 
    - ブースティング
        - アダブースト
        - 勾配ブースティング
        - xGBoost
        - LightGBM
    - スタッキング

## EDA (Exploratory Data Analysis)

コンペに参加してまず確認するのはEDA。
簡単にデータを可視化できるようにまとめている方がいるので確認しましょう。
forkなどして、オリジナルで検証してみるのもいいかもしれませんね。

個人で分析するにもいいかもしれませんね。
簡単なところで言いますと、以下のようにいろんなメソッドがあるので検証するといい発見が見つかったりするかもしれないです。

```python:kaggle.y
train_df.info()

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 891 entries, 0 to 890
Data columns (total 12 columns):
PassengerId    891 non-null int64
Survived       891 non-null int64
Pclass         891 non-null int64
Name           891 non-null object #名前ならオブジェクトよりstrでいいはず
Sex            891 non-null object　　#男女なのにオブジェクト→男0 女1で分類でいいはず
Age            714 non-null float64 #めっちゃケッスォン
SibSp          891 non-null int64
Parch          891 non-null int64
Ticket         891 non-null object　#チケットも種類が少なかったらSexと同じ解釈してもいいかも
Fare           891 non-null float64
Cabin          204 non-null object　#めっちゃケッスォン
Embarked       889 non-null object
dtypes: float64(2), int64(5), object(5)
memory usage: 83.6+ KB
```

## いろんなplot集

世の中にはいろんなplot集がありますよね、
それをたくさん羅列したいと思います。 (個人的備忘録です)

### kdeplot
カーネル密度推定になります。
分布はわからないけどこんなもんだろってざっくり分布として描いた図になります。

kdeplotのKDEがカーネル密度推定の意味になります。
<img width="780" alt="スクリーンショット 2019-02-19 12.36.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/243844/e9c6a791-377f-62c8-4526-d612cfcf712a.png">


### countplot
当てはまっているグループの分布を集計するために使用します。

### regplot
回帰モデルの可視化のために使用します。
信頼区間を含た重回帰分析をする際に使用します。
大量のデータを用いる際のブートストラップに利用されます。デフォルトは95%です。
<img width="522" alt="スクリーンショット 2019-02-19 13.10.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/243844/f9760316-71b0-97cc-4da5-99fd46b99d39.png">


## Kaggleの初めはデータの可視化

EDAにはデータの可視化を一つずつコマンドで実行しているのが多数あります。
しかし、正直pandas_profilingで可視化した方がいいと思います。

```python:kaggle.y
import pandas_profiling as pdp
tr_df = pd.DataFrame(train)
pdp.ProfileReport(tr_df)
```

## ハイパーパラメータのチューニング方法

機械学習のモデルによっては、人間が決めなければいけないハイパーパラメータというのを設定しなければならない。
その設定を自動的に決めてくれる関数がある。

### GridSearchCV
ちなみに、CVとは変動係数を示す。『標準偏差/平均値』の演算結果である。

### Hyperopt
作成中

### Optuna
作成中

HyperoptやOptunaの二つが人気らしい。(理由は定かではない)
チューニングも計算時間が膨大のために、自分でパラメータチューニングしたほうが良さそうです。
これも経験が重要になると思います。


## fit, fit_transform, transformの違い
Kernelsに投稿されている型の中では、学習器を定めた後にfitだけのものや、fit_transformのような別々の書き方をしている方がよく見かけます。
その違いについて比較してみます。

### fit
単純にデータを学習器に対して突っ込んでモデル化したのみ。
出力はその学習器のパラメータが出力される。

### transform
学習したデータを可視化する。

### fit_transform
fitとtransformの役割を一括で実行してくれる。


```python:model.py
#同じ意味です。
model = PCA(n_components=250)
df = pd.DataFrame(model.fit(X).transform(X))

model = PCA(n_components=250)
df = pd.DataFrame(model.fit_transform(X))
```

### predict, predict_probaの違い
再び比較するトピックです。
学習した分類器に対して、testデータを与えてみましょう。
その際に実際に正しく結果が得たかを分類器が予測する際に二つの関数を使用します。

### predict
単純に与えられたデータからこれはこうだ！っという判断した結果が返ってくる。

### predict_proba
probaとは、probability。
つまり確率を示します。
与えたデータに対してこのデータはこうだ！！っと判断するのではなく、
『....うーん、この答えか不明だけど、確率でいうとこんな感じだよ』
っという予想の値を出力してくれます。


以上から、二つの関数の違いを例にすると以下のような感じです。


```python:predict.py
# 正解ラベルは0 or 1とします。
print(clf.predict_proba(X_test))
print("***************************")
print(clf.predict(X_test))

[[0.33459936 0.66540064]
 [0.50634333 0.49365667]
 [0.45191191 0.54808809]
 ...
 [0.65696616 0.34303384]
 [0.20591943 0.79408057]
 [0.77670276 0.22329724]]
***************************
[1. 0. 1. ... 0. 1. 0.]
```


なーんだ


##　雑学

### clfってなんだ?

A. Classifier(分類器)のこと

```python:clf.py
clf = LogisticRegressionCV(cv=5)
clf = RandomForestClassifier()
clf = SVC(C=13.0, probability=True)
clf.fit(X_train, y_train)
```

### loc ilocの違い
loc: locationの意味かな?
指定した、要素の行と列のデータの値を取得する関数

iloc: intger locationの意味かな?
指定した、要素の行と列の**数値**から、データの値を取得する関数

```python:clf.py
from pandas import DataFrame

df=DataFrame([[1,2,3],
              [10,20,30],
              [100,200,300],
              [1000,2000,3000]],
              index=['row_0', 'row_1','row_2','row_3'],
              columns=['col_0','col_1','col_2'])
#--------------------------- |
#        col_0  col_1  col_2 |
# row_0      1      2      3 |
# row_1     10     20     30 |
# row_2    100    200    300 |
# row_3   1000   2000   3000 |
#--------------------------- |


# 同じ意味です
df.loc[['row_2','row_3'], ['col_1','col_2']]
df.iloc[[2,3], [1,2]]
#----------------------------
#        col_1  col_2
# row_2    200    300
# row_3   2000   3000
#----------------------------

# 列番号を指定
 
df.iloc[:, [1,2]]
#----------------------------
#        col_1  col_2
# row_0      2      3
# row_1     20     30
# row_2    200    300
# row_3   2000   3000
#----------------------------
```

以下のリンクから違いを学びました。
- [pandas の loc、iloc、ix の違い – python](http://ailaby.com/lox_iloc_ix/)



### 欠損値の個数の確認

もっといいやり方ありそうだが.....。

```python:clf.py
len(df) - df.count()
```

## 参考になったブログなど
- [Scikit-learnのモデルをまとめてみた](http://nonbiri-tereka.hatenablog.com/entry/2015/02/16/081057)
    - Scikit-learnで扱えるモデルについて紹介されています。簡単なサンプルコードが書かれているので参考になります。 

- [Tutorial on Ensemble Learning](https://www.kaggle.com/mjbahmani/tutorial-on-ensemble-learning)
    - 題名がアンサンブル学習と記載していますが、　その内部の『You are reading 10 Steps to Become a Data Scientist and are now in the 8th step :』という題名内にあるTopicがオススメです。

- [matplotlibはpythonの可視化ライブラリ](https://future-chem.com/matplotlib-plot-type/)
    - 『lineplot』とか『barplot』とか『jointplot』とか『subplot』とか『boxplot』とかいろんなplotが見れるやつ。
        - ブログがおそらくjqueryとかで埋め込まれているので、見やすかったです。

## 読んだ書籍、個人的オススメ書籍
pass


## まとめ

はい、この通りKaggle初心者なので、情報を模索中です。
何か間違っている内容がありましたら、コメントをよろしくお願いします。
また、こういうやり方もあるよというのがありましたら、ご教授よろしくお願いします。