kaggleコンペ②(特徴量を増やしたらどうなるか)

2021/10/11に公開

前回はコンペの内容把握からベースモデルの構築まで行ったので、今回は特徴量を増やしたときに精度が良くなるのか見ていく。

改良1:1つ前のtime_stepとの差を計算し、データに追加する。

(time_step_1diff)

import pandas as pd
import lightgbm as lgb
from sklearn.metrics import mean_absolute_error
from sklearn.model_selection import train_test_split

train = pd.read_csv('train.csv', index_col=0)
train.insert(4, 'time_step_1diff', train['time_step'] - train.groupby('breath_id')['time_step'].shift()) #これを追加した。
train = train.fillna(0)

X = train.drop(columns=['pressure'])
y = train.pressure
X_train, X_val, y_train, y_val = train_test_split(X, y, test_size=0.2, random_state=24)

#Python API
lgb_train = lgb.Dataset(data=X_train, label=y_train)
lgb_val = lgb.Dataset(data=X_val, label=y_val, reference=lgb_train)

param = { 'objective':'regression',        #目的関数:回帰
          'task':'train',
          'boosting':'gbdt',
          'num_iterations':100,            # 木の数  defalut 100
          'learning_rate':0.1,             # 学習率  default 0.1
          'metric':{'rmse'},               # 評価指標 : (平均二乗誤差の平方根) 
          'num_leaves':31,                 # 木の分岐の個数(葉の数)  default 31
          'min_data_in_leaf':20,           # default 20
          'max_depth':-1,                  # 木構造の深さを限定するための変数  defaultの-1は上限無し
          'verbose':0,                     # 学習途中の中継的な情報を表示するかしないか
          'seed':42 }

bst = lgb.train( params = param,
                 train_set = lgb_train,
                 valid_sets = [lgb_train,lgb_val],
                 valid_names = ['train','valid'],
                 num_boost_round = 200,
                 early_stopping_rounds = 50 )

y_pred = bst.predict(X_val)
mean_absolute_error(y_val, y_pred)               #2.053019279754157

test = pd.read_csv('test.csv', index_col=0)
test.insert(4, 'time_step_1diff', test['time_step'] - test.groupby('breath_id')['time_step'].shift()) #これを追加した。
test = test.fillna(0)
t_pred = bst.predict(test)
提出時のスコア:4.020

改良2:time_stepに加え1つ前のu_inとの差を計算し、データに追加する。

(u_in_1diff)
改良1から変更した(追加した)部分とその前後を記載する。

train.insert(6, 'u_in_1diff', train['u_in'] - train.groupby('breath_id')['u_in'].shift()) #これを追加した
train = train.fillna(0)

test.insert(6, 'u_in_1diff', test['u_in'] - test.groupby('breath_id')['u_in'].shift()) #これを追加した
test = test.fillna(0)

mean_absolute_error(y_val, y_pred) #1.7444568776534914
提出時のスコア:3.237

改良3:改良1と改良2の結果を踏まえ、それぞれ1行・2行・3行ずらしてみる

(time_step_1diff, time_step_2diff, time_step_3diff, u_in_1diff, u_in_2diff, u_in_3diff)
上と同じように書くと見にくかったので、リスト内包表記などを使う書き方にしました。

a = [a for a in range(1,4)]
b = [b for b in range(4,7)]
c = [c for c in range(8,11)]

[train.insert(b, 'time_step_{}diff'.format(a), train['time_step'] - train.groupby('breath_id')['time_step'].shift(a)) for a, b in zip(a, b)]
[train.insert(c, 'u_in_{}diff'.format(a), train['u_in'] - train.groupby('breath_id')['u_in'].shift(a)) for a, c in zip(a, c)]
train= train.fillna(0)


[test.insert(b, 'time_step_{}diff'.format(a), test['time_step'] - test.groupby('breath_id')['time_step'].shift(a)) for a, b in zip(a, b)]
[test.insert(c, 'u_in_{}diff'.format(a), test['u_in'] - test.groupby('breath_id')['u_in'].shift(a)) for a, c in zip(a, c)]
test= test.fillna(0)

mean_absolute_error(y_bal, y_pred) #1.4385514562836457
提出時のスコア:2.533

trainとtestの出力

今回は特徴量を増やしたら精度が良くなったのでそこは良かった。
しかし、何故このような結果になったのかという理由の説明や出た結果を分析して纏める作業については難しそう...
そういったところが説明できるようになるとデータ分析の面白さが分かるようになると思うので、より上を目指してこれからも頑張っていきたいです。


追記

改めてコンペのページを見返してみたが、Google Brainというプロジェクトではニューラルネットワークとディープラーニングを使用することを期待してそうなので、そもそもやり方が違ったかもしれない...
Tensorflowとか使ったほうが結果出るかも
scikit-learnにもMLPClassifierというライブラリがあるみたいなのでそれも使えそう
やってみて上手くいきそうならまた記事にします。

Discussion