Kaggle Tabular Playground Series - Feb 2022に取り組んでみる

## Tabular Playground Seriesとは

　Kaggleのタイタニックコンペが終わった後に取り組むに丁度いいデータ分析初心者向けのコンペで月イチで開催されています。メダルや賞金を獲得することはできません。

## さっそく取り組んでみる

　[Kaggleの公式ページ](https://www.kaggle.com/)からCompetitionsのTabular Playground Series - Feb 2022に入ってJoin Competitionでコンペに参加しましょう。参加にはユーザー登録が必要になります。

## Tabular Playground Series - Feb 2022の概要

　CompetitionsのDescriptionの内容を見ると今回のコンペはどうやらゲノム解析技術のデータを使って、10種類の細菌を分類することが課題のようです。難解な課題っぽいですがとりあえずデータを見てみましょう。

## Kaggle notebookの起動とデータの読み込み

　Kaggleでcodeから+notebookでnotebookを立ち上げ+Add dataのCompetition dataからTabular Playground Series - Feb 2022のデータを読み込みましょう。以下のコードはkaggle notebookで行います。

　kaggle notebookの一番上のセルを実行後、csvファイルの読み込みを行います。

```python
train_df = pd.read_csv('../input/tabular-playground-series-feb-2022/train.csv')
test_df = pd.read_csv('../input/tabular-playground-series-feb-2022/test.csv')
submission_df = pd.read_csv('../input/tabular-playground-series-feb-2022/sample_submission.csv')
```

## 訓練データ、テストデータを確認

```python
print('train_df size:', train_df.shape)
print('test_df size:', test_df.shape)
```

```出力結果
train_df size: (200000, 288)
test_df size: (100000, 287)
```

　訓練データが20万行288列、テストデータが10万行287列とかなり大規模なデータのようです。データが膨大なので省きますが、train_df.infoやtrain_df.head()で中身を確認すると、train_dfの中身はrow_id、286種類のゲノム情報(float64)そして目的変数のtarget(object)になっているようです。

### 初手LightGBM

　とりあえずKaggleの定石の一つである初手LightGBMから試してみましょう。

　row_idの削除

```python
del train_df['row_id']
del test_df['row_id']
```

　データを目的変数と説明変数へ分割

```python
train_X = train_df.drop('target', axis=1)
train_y = train_df['target']
test_X = test_df
```

 目的変数がobjectなのでラベルエンコーディング

```python
from sklearn.preprocessing import LabelEncoder

le = LabelEncoder()
le.fit(train_y)
train_y = le.transform(train_y)
```

 訓練データと評価データに分割

```python
from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(train_X, train_y, test_size=0.2)
```

 lightGBM

```python
import lightgbm as lgb

lgbm_params = {
    "objective":"multiclass",
    "metric":'multi_logloss',
    "num_class":10
}

lgb_train = lgb.Dataset(X_train, y_train)
lgb_eval = lgb.Dataset(X_test, y_test, reference=lgb_train)

lightgbm_model = lgb.train(lgbm_params,
                           lgb_train,
                           num_boost_round=300,
                           valid_sets=lgb_eval,
                           early_stopping_rounds=20)
```

```出力結果
[1]	valid_0's multi_logloss: 1.82016
・
・
・
[300]	valid_0's multi_logloss: 0.0289065
```

　スコアの確認

```python
from sklearn.metrics import accuracy_score

y_pred = lightgbm_model.predict(X_test, num_iteration=lightgbm_model.best_iteration)
y_pred = np.argmax(y_pred, axis=1)
accuracy_score(y_test, y_pred)
```

```出力結果
0.994875
```

## テストデータからの推論と提出用データの作成

　まずまずのスコアなのでこのモデルを使って推論と提出用データの作成を行って行きます。

　作成したモデルでのテストデータを使っての推論

```python
pred_y = lightgbm_model.predict(test_X, num_iteration=lightgbm_model.best_iteration)
```

 提出用データの作成

```python
pred_y = np.argmax(pred_y, axis=1)
pred_y = le.inverse_transform(pred_y)
submission_df['target'] = pred_y

submission_df.to_csv('submission_lightGBM.csv', index=False)
```

　submitでこのファイルを提出したら、Leaderboardで自分の順位を確認しましょう。

## 今後の展開

　今回はほぼデフォルトのLightGBMのモデルを使って提出用データを作成してみたのですが、上位陣と比べるとまだまだ改善の余地はありそうです。
　今後の展開としてはoptunaなどでパラメータチューニングを行うかRandam forestやExtraTreeなど別のモデルを作成していくかといったところです。
　またDiscussionsを見てみると、今回のデータは重複したものが多いようなので、それらを取り除けば学習時間の短縮が見込めそうです。