はじめに
現在、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にも手を出そうとしてるだれか止めてくれ…
解決したら更新します!
それでは!!!