はじめに
Kaggleや機械学習といったらPythonのイメージが強いですがC#でも機械学習が出来るML.NETとC#の開発元であるマイクロソフト社が開発したLightGBMを用いておなじみのタイタニック号の生存者予測をやってみました。
環境
- .NET 6
- Microsoft.ML
- Microsoft.ML.LightGbm
コード
内容
データはKaggleのものを使用しています。なるべく簡単でわかりやすい実装にするためにTrainTestSplitを使ってtrain.csvからtrainデータとtestデータを作成しています。
性別(Sex)と乗船港(Embarked)をOneHotエンコーディングしてるくらいで年齢(Age)の処理を入れていなかったり、特徴量すべて使っていないですしハイパーパラメータのチューニング等の最適化も行っていないのであくまで流れを理解するための実装になっています。(Kaggleに挑戦する、運用環境で利用するなどであればチューニングが必要になります)
var mlContext = new MLContext(seed: 0);
var trainingDataView = mlContext.Data.LoadFromTextFile<Passenger>(_trainDataPath, hasHeader: true, separatorChar: ',');
var splitData = mlContext.Data.TrainTestSplit(trainingDataView, testFraction: 0.2);
var options = new LightGbmBinaryTrainer.Options
{
LabelColumnName = "Label",
FeatureColumnName = "Features",
Booster = new GossBooster.Options
{
TopRate = 0.3,
OtherRate = 0.2
}
};
string[] categoryFeatureNames = { "Sex", "Embarked" };
var survivedMap = new Dictionary<string, bool> { { "1", true }, { "0", false } };
var pipeline = mlContext.Transforms.Conversion.MapValue("Label", survivedMap)
.Append(mlContext.Transforms.Categorical.OneHotEncoding("Sex", inputColumnName: categoryFeatureNames[0]))
.Append(mlContext.Transforms.Categorical.OneHotEncoding("Embarked", inputColumnName: categoryFeatureNames[1]))
.Append(mlContext.Transforms.Concatenate("Features", new[] { "Pclass", "Sex", "SibSp", "Parch", "Fare", "Embarked" }))
.Append(mlContext.BinaryClassification.Trainers.LightGbm(options));
var model = pipeline.Fit(splitData.TrainSet);
var transformedTestData = model.Transform(splitData.TestSet);
// Convert IDataView object to a list.
var predictions = mlContext.Data
.CreateEnumerable<TitanicPrediction>(transformedTestData, reuseRowObject: false).ToList();
感想
PythonでLightGBMをよく使っていたのでその凄さは理解しているんですが、個人的にC#のアプリケーションを作ることも多いのでうまく取り込めないかなーって考えながら探していたらC#の機械学習ライブラリML.NET上でLightGBMが実装されていたので早速試してみました。
マイクロソフト社が作ってるC#とLightGBMの組み合わせはC#erとして試してみなければと思い実装しました。
触ってみた感想としては、慣れると流れが理解しやすいですがやはりPythonと書き方が大分異なるので慣れるまで時間は掛かるかもです。そしてML.NET自体のアップデートも頻繁でネット上に上がっている書き方だとうまくいかないところが多い印象でした。
あとMicrosoftのエンジニアが回答していたのですがLightGBM(ML.NET版)でもGPUが利用できるアップデートを行っているようなのでその点もわかってきたらそのうち記事にするかもです。
皆様もC#で機械学習を楽しみましょう!
参考
https://qiita.com/koshian2/items/dba923672219515d128f
https://github.com/seosoft/Titanic_MLNet
https://docs.microsoft.com/ja-jp/dotnet/api/microsoft.ml.lightgbmextensions.lightgbm?view=ml-dotnet