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