(解決済み)
非深層学習系の提案手法を実装するならJulia一択だと思うのですが,既存の比較手法をすぐに試せないとpython民に戻りたくなりますね..LightGBMで多クラス分類をしようとして,ちょっと詰まったので,二度と再び本件で躓かないためのマイメモです.
LightGBMはここにあるgithubのものを落としてきました.
まぁ普通に]add LightGBMでインストールできるのですが,提供されているデモは二値分類用.多クラス分類のためにはいろいろ変えないといけない.
using LightGBM using DelimitedFiles function LGBM(x_train, y_train, x_test, y_test, num_class) y_test = convert(Vector, Int.(y_test)) y_train = convert(Vector, Int.(y_train)) y_test .-= 1 # labelは0からスタートっぽいので, y_train .-= 1 # Load LightGBM's binary classification example. # Create an estimator with the desired parameters—leave other parameters at the default values. estimator = LGBMClassification( objective = "multiclass", num_iterations = 100, learning_rate = .1, early_stopping_round = 5, feature_fraction = .8, bagging_fraction = .9, bagging_freq = 1, num_leaves = 1000, num_class = num_class, metric = ["auc_mu", "multi_logloss"] ) LightGBM.fit!(estimator, x_train, y_train) predicted = LightGBM.predict(estimator, x_test) end
はまりポイント①
なぜかfit!やpredictが定義されてない,って怒られるので,LightGBM.fit!とかLightGBM.predictとする.
はまりポイント②
metricのaucはニクラス分類用.多クラス分類をするときは,auc_muとしよう.同様に,コスト関数にはmulti_loglossを使いましょう.
はまりポイント③
ラべルyの各要素はIntにしておこう.ラベルの始点は0なので,y_test, y_trainが1からはじまるようにロードしているなら,.-1しましょう.
とりあえずこれで動いた!! predictedは[テストサンプル数,クラス数]の二次元配列になっていて,各サンプルがどのクラスにいるのかの確率をあらわしてるっぽい.