Kaggle(27) - Sickit-learn interfaceを使う - LightGBM編4

Sickit-learn wapper interfaceというラッパーを使うと、LightGBMをSickit-learnを介して使うことができます。

端的にいうとSickit-learnでお馴染みの、fitで学習しpredictで推論することができるようになります。

データの読み込み

タイタニックのデータセットを読み込み、データの前処理を行って、正解ラベルとそれ以外にデータを分割します。

[ソース]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import numpy as np
import pandas as pd

df_train = pd.read_csv('/kaggle/input/titanic/train.csv')

# データ前処理
def preprocessing(df):
# 不要な列の削除
df.drop(['Name', 'Ticket', 'Cabin'], axis=1, inplace=True)

# カテゴリ変数の型変換
df['Sex'] = df['Sex'].astype('category')
df['Embarked'] = df['Embarked'].astype('category')

return df

x_titanic = preprocessing(df_train.drop(['Survived'], axis=1))
y_titanic = df_train['Survived']

Sickit-learn interfaceを使う

LightGBMをSickit-learn interfaceでラップし(12行目)、学習・推論を行います。

[ソース]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import lightgbm as lgb
from sklearn.metrics import accuracy_score
from sklearn.model_selection import train_test_split

# 訓練データをtrainとvalidに分割
train_x, valid_x, train_y, valid_y = train_test_split(x_titanic, y_titanic, test_size=0.33, random_state=0)

# パラメータを定義
lgbm_params = {'objective': 'binary'}

# LightGBMの分類器をインスタンス化
gbm = lgb.LGBMClassifier(objective='binary')

# 学習
gbm.fit(train_x, train_y, eval_set=[(train_x, train_y), (valid_x, valid_y)],
early_stopping_rounds=20, # 20回連続でlossが下がらなかったら終了
verbose=10) # 10roundごとにlossを表示
# gbm.fit(train_x, train_y) # 単純学習

# 推論
pre = gbm.predict(valid_x, num_iteration=gbm.best_iteration_)
print('score', round(accuracy_score(valid_y, pre) * 100, 2))

[出力]

正解率は83.05%となりました。なかなかの結果です。

検証データを読み込み、推論・提出用のCSVの出力を行い、Kaggleに提出してみます。

[ソース]

1
2
3
4
5
6
7
8
9
# 検証データの読み込み
df_test = pd.read_csv('/kaggle/input/titanic/test.csv')
df_test = preprocessing(df_test)

pre = gbm.predict(df_test)

result = pd.DataFrame(df_test['PassengerId'])
result['Survived'] = pre
result.to_csv('result0305.csv', index=False)

[提出結果]

正解率78.82%と、もう少しで8割に到達できそうです。

便利な交差分割検証関数

LightGBMをSickit-learnと同じように扱えるようになると、cross_val_scoreというとても便利な関数を使うことができるようになります。

この関数を使うと、たった1行で分割交差検証ができてしまいます。

[ソース]

1
2
3
4
from sklearn import model_selection
score = model_selection.cross_val_score(gbm, x_titanic, y_titanic, cv=3) # cv=3は3分割の意
print('各正解率', score)
print('正解率', score.mean())

[出力]

便利すぎます。

このような便利関数があるのでSickit-learnは広く普及しているんだと思います。