🀄

みんなのKaggle 〜Everybody's Kaggle〜 #1

2023/12/01に公開

はじめに

みんなのGOLF というゲームをご存知でしょうか。
世界中のゴルフコースを旅しながら、仲間と盛り上がる素晴らしいゲームです。

Kaggle と呼ばれるゲーム(WEBプラットフォーム)をご存知でしょうか。
世界中のデータサイエンティストたちがしのぎを削る素晴らしいゲームです。

なんとIT大手のDeNAでは、Kaggleで成果を上げた人の採用もあります。

本稿は、 「Kaggleの世界に足を踏み入れてみる。」 をテーマに書きます。

Kaggleを通して、Let's スキルアップ&キャリアップ!

まずはKaggleのアカウント登録

以下から、まずはKaggleのアカウントを作成しましょう。
https://www.kaggle.com/

Kaggleのコンペティションに参加する

アカウントを作成したら、コンペティション(以下、コンペ)に参加してみましょう。
コンペの中には、上位入賞することで高額賞金を貰えます。
ただ、海外のコンペばかりで、Kaggle初学者かつ純ジャパニーズには、とても敷居が高いです。
しかし、こちらのコンペを御覧ください。

https://www.kaggle.com/competitions/prediction-of-tourist-arrivals/overview

日本人の方が、Kaggle初学者向けのコンペを運営しています。
Join Competition のボタンをクリックして、早速、参加しましょう。

コンペの概要を把握する

OverViewのタブ にて、コンペの概要を確認します。

『観光客数』を予測する回帰タスクです。

こちらをご覧ください。

(出典)https://blogs.sas.com/content/sasjapan/2017/11/21/machine-learning-algorithm-use/

教師あり学習の中で、数値を予測する際に選択する機械学習アルゴリズムということがわかります。
ここでは、観光客数を予測する機械学習アルゴリズム、回帰モデルをつくる んだなと捉えて次にコンペで使われるデータを確認しましょう。

Dataのタブ にて、データを確認します。

各観光地の情報、日付に関する情報等、多岐に渡る説明変数(12個)
訓練データ数が132,000件

テーブルデータ(表形式)が存在することを確認できました。

このデータを使って、各観光地の観光客数を予測する回帰モデルの開発を始めます!

回帰モデルの開発

データの前処理

学習させるために、アルゴリズムに入力するデータが必要となります。
なんでもかんでもデータを突っ込むわけには行きません。
そのため、前処理が必要となります。

教示データと検証データの分割に向けて、日付型に置換する

元々はデータ型がオブジェクト型になっています。

こちらをto_datetime関数によって日付型へ置換します。

dtype(データ型)がobjectからdatetime64に変化したことを確認できました。
次行きましょう。

日付データを加工して、特徴量生成

dateから新たな特徴量を生成していきます。

# 学習データ
train_df['year'] = train_df['date'].dt.year
train_df['month'] = train_df['date'].dt.month
train_df['day'] = train_df['date'].dt.day
train_df['dayofweek'] = train_df['date'].dt.dayofweek  # 日曜日が0で土曜日が6
train_df['dayofweek_index_mean'] = train_df.groupby('dayofweek')['tourism_index'].transform('mean')
# 評価データ
test_df['year'] = test_df['date'].dt.year
test_df['month'] = test_df['date'].dt.month
test_df['day'] = test_df['date'].dt.day
test_df['dayofweek'] = test_df['date'].dt.dayofweek
test_df['dayofweek_index_mean'] = test_df.groupby('dayofweek')['tourism_index'].transform('mean')

さらに春夏秋冬という季節というデータも作ります。

# monthからseason(季節)を生成
def get_season(month):
    seasons = {1: 'spring', 2: 'spring', 3: 'spring', 4: 'summer', 5: 'summer', 6: 'summer', 7: 'fall', 8: 'fall', 9: 'fall', 10: 'winter', 11: 'winter', 12: 'winter'}
    return seasons.get(month, 'winter')

train_df['season'] = train_df['month'].map(get_season)
test_df['season'] = test_df['month'].map(get_season)

周期性を考慮して三角関数の適用

時系列モデルコンペでよくあるテクニックとして、データの連続性をつくることで精度向上させる技があります。
例えば12月31日と1月1日はとなり合わせの日付なので特徴は似ているはずです。
ところがそのまま入力とすると、モデルは12月31日と1月1日の間に数字的な繋がりを見出す事が出来ません。
そこでモデルが日付を循環したもの(=繋がっている)として捉えられるように三角関数を使って日付を変換します。

# 三角関数を適用して特徴量生成
def encode(df, col):
    max_val = df[col].max()
    df[col + '_cos'] = np.cos(2 * np.pi * df[col] / max_val)
    df[col + '_sin'] = np.sin(2 * np.pi * df[col] / max_val)
    return df

cols = ['month', 'day', 'dayofweek']
for col in cols:
    train_df = encode(train_df, col)
    test_df = encode(test_df, col)

質的変数を変換する

一部のデータは質的変数となっています。
例えば、'spot_facility', 'area', 'city'といった項目のデータですね。

こちらを数値データに変換します。

# 質的変数(カテゴリ)を序数(数値データ)に変換する

import category_encoders as ce

ce_oe = ce.OrdinalEncoder(cols=categories,handle_unknown='impute')

#文字を序数に変換
train_df = ce_oe.fit_transform(train_df)
test_df = ce_oe.fit_transform(test_df)

時系列順でデータ分割する

このようにデータを時系列順で分割します。
訓練データや検証データの意は、こちらの記事の説明がわかりやすいです。

https://zenn.dev/nekoallergy/articles/ml-basic-data

# 2019年4月30日までのデータをモデル訓練用として分割
train_hold_df = train_df[(train_df['date'] <= dt.datetime(2019,4,30))]

# 2019年5月1日から、5月31日までのデータをモデル検証用として分割
valid_hold_df = train_df[(train_df['date'] >= dt.datetime(2019,5,1)) & (train_df['date'] <= dt.datetime(2019,5,31))]

モデルの入力データを整形する

モデルに学習させるための仕上げやります。
目的変数と説明変数のデータを整理します。
目的変数である tourist_arrvials をセットします。
また学習データから目的変数を除外します。
idなどといったモデル精度向上に寄与しないデータを除外します。

# 訓練データの目的変数と説明変数を設定
y_train = train_df['tourist_arrivals']
y_train_hold = train_hold_df[['tourist_arrivals']]
y_valid_hold = valid_hold_df[['tourist_arrivals']]
X_train = train_df.drop(['id', 'tourist_arrivals', 'date'], axis=1)
X_train_hold = train_hold_df.drop(['id', 'tourist_arrivals', 'date' ], axis=1)
X_valid_hold = valid_hold_df.drop(['id', 'tourist_arrivals', 'date' ], axis=1)

# テストデータの説明変数を設定
X_test = test_df.drop(['id', 'date'], axis=1)

これでモデル構築に向けた準備ができました!

機械学習アルゴリズム選定

(出典)https://blogs.sas.com/content/sasjapan/2017/11/21/machine-learning-algorithm-use/

こちらのチートシートに従って、勾配ブースティング決定木を採用することにします。
その中でも、 LightGBM(Light Gradient Boosting Machine) を採用します。
LightGBMは、学習が早くて高い精度が出るため、Kaggleで大人気なアルゴリズムです。
イメージとしては、安心と信頼の実績あるホンダのバイクCB400みたいな感じでしょうか。

おわりに

この記事の分量が多く、読むのしんどいので、別記事で解説することにします。汗

Discussion