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は広く普及しているんだと思います。