Kaggleの初期装備〜高い頻度で利用するコードをまとめたひとつのセル〜

KaggleのNotebookで英語版を公開しました！（2021/03/11）

https://www.kaggle.com/daikikatsuragawa/one-cell-containing-frequently-written-code

# はじめに

データサイエンスのコンペティションプラットフォームであるKaggle[^Kaggle]に取り組むとき、実行環境であるNotebook[^Notebook]（もしくはJupyter Notebook[^JupyterNotebook]やGoogle Colaboratory[^GoogleColaboratory]）で記述するPython[^Python]の“高い頻度で利用するコード”があるかと思います。これを再利用できるように、どうせならコピーアンドペーストが容易な形式として、ひとつのセルにまとめて紹介します。このセルの中身を再利用することで、Kaggleにおけるデータ分析の効率を高めることができたら幸いです。（これぞ“Kaggleの初期装備”！）

※本記事は、Kaggler（Kaggleの参加者）の先人たちが公開しているNotebookや、書籍[^Kaggleで勝つデータ分析の技術]などを参考にしています。しかし、あくまで2019年12月時点での個人の主観です。それゆえ、ご参考までにご覧ください。

[^Kaggle]: https://www.kaggle.com/
[^Python]: https://www.python.org/
[^JupyterNotebook]: https://jupyter.org/
[^GoogleColaboratory]: https://colab.research.google.com/notebooks/welcome.ipynb?hl=ja

[^Notebook]: https://www.kaggle.com/docs/kernels
[^Kaggleで勝つデータ分析の技術]: https://www.amazon.co.jp/o/ASIN/4297108437/gihyojp-22

# 結論

Kaggleの初期装備とは…ズバリ…

このセルだ！

```python:Kaggleの初期装備〜高い頻度で利用するコードをまとめたひとつのセル〜.py
# Notebookの表示
from IPython.core.interactiveshell import InteractiveShell
InteractiveShell.ast_node_interactivity = "all"

# 便利なもの
import tqdm
import warnings
warnings.simplefilter('ignore')

# データ操作
import numpy as np
import pandas as pd
pd.set_option('display.max_columns', None)

# データ可視化
import pandas_profiling as pdp
import matplotlib.pyplot as plt
%matplotlib inline
import seaborn as sns
sns.set()

# 前処理
from sklearn.impute import SimpleImputer
from sklearn.preprocessing import StandardScaler
from sklearn.preprocessing import MinMaxScaler
from sklearn.preprocessing import LabelEncoder
from sklearn.preprocessing import OneHotEncoder

# 交差検証
from sklearn.model_selection import StratifiedKFold

# 定数の定義
SEED = 2019
N_FOLDS = 10

# inputとして与えられたファイル名の一覧を出力
import os
for dirname, _, filenames in os.walk('/kaggle/input'):
    for filename in filenames:
        print(os.path.join(dirname, filename))
```

# 解説

上記のセルについて、各ポイントを解説します。

## Notebookの表示

```python
from IPython.core.interactiveshell import InteractiveShell
InteractiveShell.ast_node_interactivity = "all"
```

Notebookではセルの途中で出力を試みた図表は出力されません（例えば、pandasのDataFrameなど）。`InteractiveShell`[^InteractiveShell]を利用することで、以上の記述をすることによりセルの途中で出力を試みたすべての図表が出力されます。ただし、出力を試みるセルとは別のセルで事前に実行しておく必要があります。つまり、このセルを実行した場合、他のセルで適応されます。

[^InteractiveShell]: https://ipython.readthedocs.io/en/stable/api/generated/IPython.core.interactiveshell.html

## 便利なもの

```python
import tqdm
import warnings
warnings.simplefilter('ignore')
```

データ分析では、多くの時間を必要とする処理があります。`tqdm` [^tqdm]を利用することにより、プログレスバーで処理の進捗を確認できます。
また、実行に影響のない警告が表示されることがあります。これを無視するために、警告の表示を扱うモジュール`warnings`[^warnings]を利用します。`warnings.simplefilter('ignore')`と記述することによって警告を表示させません。

[^tqdm]: https://tqdm.github.io/
[^warnings]: https://docs.python.org/ja/3/library/warnings.html

## データ操作

```python
import numpy as np
import pandas as pd
pd.set_option('display.max_columns', None)
```

​KaggleのNotebookでデフォルトとして記述されているコードです。データ分析における２つの必須モジュール、数値計算を行う`numpy`[^numpy]、行列を扱う`pandas`[^pandas]を利用します。また、`set_option('display.max_columns', None)` という記述により全ての列を常に表示する設定がなされます。

[^numpy]: https://numpy.org/
[^pandas]: https://pandas.pydata.org/

## データ可視化

```python
import pandas_profiling as pdp
import matplotlib.pyplot as plt
%matplotlib inline
import seaborn as sns
sns.set()
```

`pandas_profiling`[^pandas_profiling] を扱うことにより、各特徴量のデータ型や分布、欠損値や相関係数などをまとめて出力できます。探索的データ解析（EDA）に役立ちます。
`matplotlib`[^matplotlib]は、グラフの描画に利用するライブラリであり、そのラッパーとして動作する`seaborn` [^seaborn]と組み合わせて利用することで美しいグラフ描画できます。
以上のようなデータの可視化はデータの全体像を理解するために重要です。

[^pandas_profiling]: https://pandas-profiling.github.io/pandas-profiling/docs/
[^matplotlib]: https://matplotlib.org/3.1.1/api/_as_gen/matplotlib.pyplot.html
[^seaborn]: https://seaborn.pydata.org/

## 前処理

```python
from sklearn.impute import SimpleImputer
from sklearn.preprocessing import StandardScaler
from sklearn.preprocessing import MinMaxScaler
from sklearn.preprocessing import LabelEncoder
from sklearn.preprocessing import OneHotEncoder
```

前処理の中でも、`SimpleImputer`[^SimpleImputer]を利用することで欠損値を平均値（mean）、中央値（median）、最頻値（mode）のいずれかで埋めることができます。

また、前処理について実装されているモジュールとして`sklearn.preprocessing` [^sklearn.preprocessing] が存在します。それらに属するメソッドで、数値の前処理として、`StandardScaler` [^StandardScaler] を利用することで、特徴量の尺度を標準化できます。`MinMaxScaler`[^MinMaxScaler] を利用することで特徴量の尺度を正規化します。カテゴリ変数の前処理として、`LabelEncoder` [^LabelEncoder] を利用することで文字列を数値で表現されるIDに変換できます。`OneHotEncoder`[^OneHotEncoder]を利用することでベクトルに変換できます。

[^sklearn.preprocessing]: https://scikit-learn.org/stable/modules/classes.html#module-sklearn.preprocessing
[^SimpleImputer]: https://scikit-learn.org/stable/modules/generated/sklearn.impute.SimpleImputer.html
[^StandardScaler]: https://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.StandardScaler.html
[^MinMaxScaler]: https://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.MinMaxScaler.html
[^LabelEncoder]: https://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.LabelEncoder.html
[^OneHotEncoder]: https://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.OneHotEncoder.html

## 交差検証

```python
from sklearn.model_selection import StratifiedKFold 
```

モデルの過学習を防ぐ（汎化性能を高める）ために交差検証はなされます。層化K分割交差検証が実装されている`StratifiedKFold`[^StratifiedKFold]を利用する事によって、分布の比率を維持したまま、データを訓練用とテスト用に分割してモデルの精度を検証できます。

[^StratifiedKFold]: https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.StratifiedKFold.html

## 定数の定義

```python
SEED = 2019
N_FOLDS = 10
```
あらかじめ、擬似乱数のシード(`SEED`)を固定し、交差検証の分割数(`N_FOLDS`)を設定しておきます。これらを交差検証が実装されている関数である`StratifiedKFold`に代入することで、検証の再現性を保ちます。以下に例を示します。

```python
skf = StratifiedKFold(n_splits=N_FOLDS, random_state=SEED)
```

※交差検証の分割数については10が多いという主観や自分自身もまずは10に設定していることから、`N_FOLDS = 10`としています。

## inputとして与えられたファイル名の一覧を出力

```python
import os
for dirname, _, filenames in os.walk('/kaggle/input'):
    for filename in filenames:
        print(os.path.join(dirname, filename))
```

KaggleのNotebookにおいてデフォルトで記述されているコードです。これにより、まずは与えられたファイル名を確認します。

# おわりに

本記事では、“Kaggleの初期装備”としてNotebookで“高い頻度で利用するコード”をまとめ、ひとつのセルとして紹介しました。そして、ポイントの解説をしました。もしご指摘や助言などありましたら気兼ねなくいただけますと幸いです。

（2019年12月03日追記）
以下の記事に掲載していただきました！ありがとうございます！
- [【Python】Qiita 週間ストック数ランキング【自動更新】](
https://qiita.com/kou_pg_0131/items/01127f188250a2d68dbf)（2019年12月01日 13時00分更新 ）
- [Python記事まとめ(毎日自動更新)](
https://qiita.com/kamata1729/items/eaf1d7b945b3a61a4fdd)（2019年12月02日 18時00分更新 ）