まぃふぇいばりっと

機械学習やってます.Julia大好きです.勉強したことの殴り書きです.

Julia言語 LightGBMで多クラス分類

(解決済み)

非深層学習系の提案手法を実装するならJulia一択だと思うのですが,既存の比較手法をすぐに試せないとpython民に戻りたくなりますね..LightGBMで多クラス分類をしようとして,ちょっと詰まったので,二度と再び本件で躓かないためのマイメモです.

LightGBMはここにあるgithubのものを落としてきました.

github.com

まぁ普通に]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とする.

はまりポイント② metricaucはニクラス分類用.多クラス分類をするときは,auc_muとしよう.同様に,コスト関数にはmulti_loglossを使いましょう.

はまりポイント③ ラべルyの各要素はIntにしておこう.ラベルの始点は0なので,y_test, y_train1からはじまるようにロードしているなら,.-1しましょう.

とりあえずこれで動いた!! predictedは[テストサンプル数,クラス数]の二次元配列になっていて,各サンプルがどのクラスにいるのかの確率をあらわしてるっぽい.