LoginSignup
4
3

More than 1 year has passed since last update.

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

Posted at

Tabular Playground Seriesとは

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

さっそく取り組んでみる

 Kaggleの公式ページから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ファイルの読み込みを行います。

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')

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

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の削除

del train_df['row_id']
del test_df['row_id']

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

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

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

from sklearn.preprocessing import LabelEncoder

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

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

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

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

 スコアの確認

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

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

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

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

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

提出用データの作成

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を見てみると、今回のデータは重複したものが多いようなので、それらを取り除けば学習時間の短縮が見込めそうです。

4
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3