2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

JuliaでLightGBMやってみたらエラーが出て先に進めない

Last updated at Posted at 2023-12-07

はじめに

現在、Pythonを勉強していますが
「他に使える言語増やしたいな…」
と思ったため、人気かつ比較的新しい言語を選択しようと思い調べました。

  • Rust
  • Go
  • julia

が新しく、人気?があるみたいでしたので、それぞれできることや学習コストなんかを調べていました。
そして、Pythonを用いていることからデータを扱うことが多いので、科学計算に特化?してると噂のjuliaを勉強してみようかなと思い、せっかくなら機械学習させてPythonと比較させてやろうと思いました。

今回の記事の趣旨

juliaの書き方などを調べながら手を動かしていたら、どうもfit関数でエラーが出てしまい、よくわからず、参考資料の圧倒的に少ないことから先に進みませんので、助けを求めて記事にしたいと思います。

juliaの書き方

まずはjuliaをインストールします。
指示に従うだけなので超簡単です。
その後、以下の記事を参考にvscodeで使えるように拡張機能をインストールしたりし、準備完了です。

まずはパッケージをインストールしないといけないので以下のコードでパッケージをインストールします。

using Pkg
Pkg.add("CSV")
Pkg.add("LightGBM")
Pkg.add("CategoricalArrays")
Pkg.add("DataFrames")
Pkg.add("MLDataUtils")
Pkg.add("Test")
Pkg.add("MLJBase")

本当に必要かわからないパッケージもとりあえずインストール。

では、実際に機械学習を行うためのコードを書いていきましょう。

コード

データはとりあえずタイタニックのデータを用いました。
読み込んだ後に欠損値補完などの前処理を行いました。
その後、いつもの流れでトレーニングデータとテストデータに分割し、
いざモデルを学習させるぞ!
といったところでエラーが生じました。
実際のコードは以下です。

# データの読み込み
data = CSV.read("./data/titanic/train.csv", DataFrame)

# 欠損値確認
println(sum.(ismissing, eachcol(data)))
median_age = median(skipmissing(data.Age))
data.Age .= coalesce.(data.Age, median_age)

# 型の確認
sex_column_type = typeof(data.Sex)
emberked_column_type = typeof(data.Embarked)

# 前処理
data.Sex = recode(data.Sex, "male"=>1, "female"=>0)
data.Embarked = recode(data.Embarked, "S"=>1, "C"=>2, "Q"=>3)

# データの分割
Random.seed!(42)
train_indices, test_indices = splitobs(collect(1:nrow(data)), at=0.7)
train = data[train_indices,:]
test = data[test_indices,:]

# モデルの訓練
lgbm_model = LightGBM.MLJInterface.LGBMRegressor(
    objective = "binary",
    num_iterations = 100,
    learning_rate = 0.1,
    num_leaves = 31,
    early_stopping_round = 10,
)

features = [:Pclass, :Sex, :Age, :SibSp, :Parch, :Fare, :Embarked]
target = :Survived

X_train = Matrix(train[!, features])  # 特徴量をMatrixに変換
y_train = train[!, target]  # ターゲットをVectorに変換

X_test = Matrix(test[!, features])  # テストデータの特徴量をMatrixに変換
y_test = test[!, target]  # テストデータのターゲットをVectorに変換
train, test = MLJBase.partition(MLJBase.eachindex(y), 0.6)
fitresult, cache, report = MLJBase.fit(lgbm_model, 0, MLJBase.selectrows(X_train), y_train;)

なんか調べていると、モデルを学習させる際にfit関数を使用するんですが、うんともすんともです。
実行した際のエラー内容は以下の通りです。

ERROR: MethodError: no method matching selectrows(::Matrix{Union{Missing, Float64}})

エラーの解決策をいくら調べてもわけがわからず、引数のデータの型に問題があるみたいです。
MatrixやAbstractMatrixやVectorやなんやかんや…
おそらく、読み込ませたタイタニックのデータに対する前処理が不適切なのかなと思ってます。
あとは、Juliaのバージョンの問題か...(新しい参考記事が見つからない)

まとめ

誰か教えてください。
習い始めていきなり機械学習は無謀すぎたかもしれません。
簡単な構文やjuliaの性質を理解してから挑戦した方がいいのかもしれませんね…
ぼちぼち勉強していこうと思います。
Rust、Goにも手を出そうとしてるだれか止めてくれ…
解決したら更新します!
それでは!!!

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?