背景:AutoMLを作りたい
機械が得意な事は機械に任せたい私は、データを入れるだけで上手い具合に処理してくれる物を作りたいと思っています。だいぶ前からAutoMLの存在を知っていて、それを理解して作りたいと前々から思っていました。機械的に処理すると言っても、それを作っているのは人間なので結局、人間的な物になるんだと思っています。要は作る人間がどこまで考え抜いているかだけの違いで、単にすごい物を作りたいのか、人間が安全に使える物を作りたいのかに振られやすいと思います。
方法:GitHubにあげて使える様にする
今回実装するのは、LightGBMとLabelEncoding, K-Foldです。ライブラリはそのまま使います。メソッドは、1.説明変数と目的変数のリストを抽出する「devide_tr_ob関数」、2.全てのカテゴリカルデータをラベルエンコーディングする「MyLabelEncoding関数」3.データをK-Foldで分割しLightGBMのデータセットに収める「LGBM_K_DataSet関数」4.学習を行う「LGBM_train関数」の4つを用意しました。よろしければ、ご自由にお使い下さると嬉しいです。改善のリクエストなどありましたら大変助かります。
ライブラリのインストール
GitHubからgit clone
します。
!git clone https://github.com/ShinyRyo/mymojule.git
データの読み込み
今回はkaggleのspaceship titanicのデータを使わせて頂きます。kaggleのnotebookで実行しています。今回は分かり易くするため3つのカテゴリカルデータを落としています。
import pandas as pd
data_path="/kaggle/input/spaceship-titanic/"
train=pd.read_csv(data_path+'train.csv')
test=pd.read_csv(data_path+'test.csv')
train1=train.drop(['PassengerId','Name','Cabin'],axis=1)
test1=test.drop(['PassengerId','Name','Cabin'],axis=1)
モデルインスタンスの作成
先程インストール(git clone)した自作モジュールをインポートします。インスタンス名はてきとうです。
from mymojule.MyLGBM import MyLGBM
a=MyLGBM(train1, test1)
モデルの実行(前処理(ラベルエンコーディング、K-Fold、LGBMデータセットの作成)、学習)
__call__
関数を使います。ラベルエンコーディング、K-Fold、LGBM.Datasetの処理後、学習を開始します。学習後のモデルはself.lgb_modelに返すようにしています。
a()
予測
self.lgb_modelでpredictします。self.lgb_modelに学習済みモデルが返されているので、predictメソッドを使えます。テストデータも前処理した物を使いたいので、self.testを使います。
pred=a.lgb_model.predict(a.test1)
後処理
回帰分析のモデルなので、predictはfloatで出てきます。今回のタスクではTrue, Falseの二値分類にしたいです。ここは適当に平均値より大きければTrue、それ以外はFalseにします。
import numpy as np
pred2=[True if i > np.mean(pred) else False for i in pred]
結果:2つのコンペに対応しました
回帰問題だけですが、目的通りラベルエンコーディングしてLightGBMで学習出来ました。2つのコンペとは言っても一つは分類問題でしたので、後処理をしました。無事投稿でき、評価も付きました。
感想:上手くいかない時は初めからやってみるのに限る
今回はクラスの__init__
関数と__call__
関数を理解して実装出来ました。使い方が分かっても、使いこなせるのは別でデバッグにかなり時間がかかりました。1つの方で上手くいっても、別の課題に使うと別の問題が出てきて、エラー場所の特定や対応に苦労しました。ともあれ、自分の作りたい物に近付いてる感じがして楽しくなっています。
課題
- ノーマルなモデルとの差を明確にしていない
- PyPIに上げてアップデートしていきたい
- 更新に時間が掛かり過ぎる