機械学習というと、PythonとTensorFlowやPyTorchを使うのが一般的だと思われがちです。
しかし、.NET開発者にとっては、慣れ親しんだC#やF#で機械学習を実装できる強力なフレームワークがあります。
それが、Microsoftが開発・提供する「ML.NET」です。
この記事では、ML.NETの基本概念から特徴、使い方、実際の応用例まで、中学生でも理解できるよう丁寧に解説します。
ML.NETとは
ML.NETは、Microsoftが開発した.NET開発者向けの機械学習フレームワークです。
2018年に最初のバージョンがリリースされ、現在はオープンソースプロジェクトとして継続的に開発が進められています。
ML.NETの基本的な定義
ML.NETは、.NETアプリケーションに機械学習機能を統合するためのクロスプラットフォームフレームワークです。
C#やF#といった.NET言語を使って、カスタム機械学習モデルを構築、トレーニング、デプロイできます。
オンライン環境でもオフライン環境でも動作し、ネットワーク接続なしでも予測を行えます。
Pythonなどの他の言語を学ぶ必要がなく、既存の.NETスキルを活用できます。
機械学習とAIの基礎知識
機械学習について簡単におさらいしましょう。
AI(人工知能)は、通常は人間の知能を必要とすることを、コンピューターに学習させることで実現する技術の総称です。
機械学習はAIのサブセット(一部)であり、コンピューターがデータから学習してパターンを検出し、新しいデータに対して自動的に予測できるようにする技術です。
従来のプログラミングでは、ルールを明示的にコードで記述します。
一方、機械学習では、大量のデータ(学習データ)からパターンを自動的に見つけ出し、そのパターンを使って未知のデータを予測します。
ML.NETの主な特徴
ML.NETには、.NET開発者にとって魅力的な特徴が数多くあります。
オープンソース・無料・クロスプラットフォーム
ML.NETは完全にオープンソースで、無料で利用できます。
GitHubで公開されており、誰でもソースコードを閲覧したり、貢献したりできます。
Windows、macOS、Linuxのすべてで動作するクロスプラットフォーム対応です。
64ビットはすべてのプラットフォームでサポートされています。
32ビットはWindowsでサポートされていますが、TensorFlow、LightGBM、ONNX関連の機能は除きます。
.NET統合とスキルの再利用
既存の.NETスキル、知識、コード、ライブラリをそのまま活用できます。
Pythonなどの新しい言語を学習する必要がありません。
C#やF#で機械学習モデルを記述できるため、学習コストを大幅に抑えられます。
Webアプリ、モバイルアプリ、デスクトップアプリ、マイクロサービス、Azure Functions、コンソールアプリなど、ほぼすべての.NETアプリケーションでML.NETを使用できます。
AutoML(自動機械学習)機能
ML.NETには、AutoML(Automated Machine Learning:自動機械学習)という最先端技術が組み込まれています。
AutoMLは、最適な機械学習モデルを自動的に見つけ出すプロセスを自動化します。
通常、機械学習では、アルゴリズムの選択、ハイパーパラメーターの調整、特徴エンジニアリングなど、多くの試行錯誤が必要です。
これには数週間から数か月かかることもあります。
AutoMLを使えば、データを読み込むだけで、残りのモデル構築プロセスを自動的に実行してくれます。
Model BuilderとML.NET CLI
ML.NETには、コーディングなしでモデルを構築できる便利なツールが用意されています。
Model Builderは、Visual Studio用の拡張機能で、直感的なグラフィカルユーザーインターフェース(GUI)を提供します。
機械学習の専門知識がなくても、データと解決したい問題を用意するだけで、カスタムモデルを構築できます。
ML.NET CLIは、コマンドラインツールで、コマンドラインからモデルのトレーニングとコード生成を自動化できます。
どちらのツールもAutoMLを使用して、シナリオに最適なモデルを自動的に探索します。
他のフレームワークとの連携
ML.NETは拡張可能なプラットフォームとして設計されています。
TensorFlow、ONNX(Open Neural Network Exchange)、Infer.NETなど、他の人気のある機械学習フレームワークと連携できます。
これにより、画像分類、物体検出など、さらに多くの機械学習シナリオにアクセスできます。
事前トレーニング済みのTensorFlowやONNXモデルをインポートして、ML.NET内で使用することも可能です。
実績のあるフレームワーク
ML.NETは、Microsoftの多くの製品で実際に使用されています。
Power BI、Microsoft Defender、Outlook、Bingなど、認知度の高いMicrosoft製品で採用されています。
これらの製品で実証済みの信頼性と性能を持つフレームワークです。
ML.NETの動作環境
ML.NETを使用するには、以下の環境が必要です。
対応する.NETバージョン
.NET Core 2.1以降で動作します。
.NET Framework 4.6.1以降でも動作しますが、4.7.2以降が推奨されています。
最新の.NET(以前は.NET Coreと呼ばれていたもの)での使用が最も推奨されます。
開発環境
Visual Studio 2019以降(Windows)を使用できます。
Visual Studio for Mac(macOS)でも利用可能です。
Visual Studio Codeや、その他の.NET対応IDEでも開発できます。
コマンドラインからML.NET CLIを使用することもできます。
ML.NETで扱える機械学習タスク
ML.NETは、様々な機械学習タスクをサポートしています。
分類(Classification)
分類は、データをカテゴリに分類するタスクです。
二項分類(Binary Classification)は、データを2つのカテゴリのいずれかに分類します。
例:顧客レビューを肯定的または否定的に分類する感情分析、銀行取引が不正かどうかを検出する不正検出、スパムメールの検出など。
多クラス分類(Multiclass Classification)は、データを3つ以上のカテゴリに分類します。
例:GitHubの問題を「UI」「ドキュメント」「バグ」などのカテゴリに分類、製品レビューを星の数(1~5)に分類など。
回帰(Regression)
回帰は、連続した数値を予測するタスクです。
例:住宅価格の予測、タクシー運賃の予測、売上予測、気温の予測など。
ある数値が別の数値と比例関係にある場合によく使用されます。
クラスタリング(Clustering)
クラスタリングは、似た特徴を持つデータをグループ化するタスクです。
例:顧客を購買パターンに基づいてグループ化、類似した製品をグループ化など。
教師なし学習の一種で、事前にカテゴリを定義する必要がありません。
レコメンデーション(Recommendation)
レコメンデーションは、ユーザーの好みに基づいて推奨アイテムを提案するタスクです。
例:映画の推薦、製品の推薦、音楽の推薦など。
他のユーザーとの好みの類似度に基づいて、特定のユーザーに対する推奨アイテムのリストを予測します。
協調フィルタリングという手法を使用します。
画像分類(Image Classification)
画像に写っているものが何かを分類するタスクです。
例:製品の品質検査(不良品の検出)、医療画像の分類、動物や植物の種類の識別など。
通常、事前トレーニング済みのTensorFlowモデルを転移学習で再トレーニングして使用します。
物体検出(Object Detection)
画像内の物体の位置を特定し、その物体が何かを識別するタスクです。
例:自動運転車での歩行者や標識の検出、防犯カメラでの不審者検出など。
ONNXモデルを使用して実装できます。
異常検出(Anomaly Detection)
通常とは異なるパターンやイベントを検出するタスクです。
例:製品売上のスパイク検出、ネットワークトラフィックの異常検出、機器の故障予測など。
時系列データでよく使用されます。
ML.NETの基本的な使い方
ML.NETを使った機械学習の基本的な流れを見ていきましょう。
機械学習の基本ステップ
ML.NETでの機械学習は、ほぼすべてのシナリオで同じ基本ステップに従います。
- データの読み込み
- データの変換(前処理)
- モデルのトレーニング(学習)
- モデルの評価
- モデルの保存
- 予測の実行
これらのステップを順番に実行することで、機械学習モデルを構築できます。
MLContextの作成
ML.NETのすべての操作は、MLContextから始まります。
MLContextは、機械学習のワークフロー全体で使用される中心的なオブジェクトです。
using Microsoft.ML;
MLContext mlContext = new MLContext();
MLContextのインスタンスを作成すると、データの読み込み、変換、アルゴリズムの選択、モデルのトレーニング、評価などが可能になります。
データの定義とIDataView
ML.NETでは、データはIDataViewとして表現されます。
IDataViewは、表形式データ(行と列)を柔軟かつ効率的に記述する方法です。
数値、テキスト、ブール値、ベクトルなど、様々なデータ型を含めることができます。
まず、データ構造をC#のクラスとして定義します。
public class HouseData
{
public float Size { get; set; }
public float Price { get; set; }
}
このクラスが、機械学習モデルの入力データの構造を表します。
データの読み込み
ファイルからデータを読み込む場合:
IDataView trainingData = mlContext.Data.LoadFromTextFile<HouseData>(
path: "housing.csv",
hasHeader: true,
separatorChar: ','
);
メモリ内のデータから読み込む場合:
HouseData[] houseData = new[]
{
new HouseData { Size = 1.1F, Price = 1.2F },
new HouseData { Size = 1.9F, Price = 2.3F },
new HouseData { Size = 2.8F, Price = 3.0F }
};
IDataView trainingData = mlContext.Data.LoadFromEnumerable(houseData);
パイプラインの構築
ML.NETでは、データ処理とモデルトレーニングをパイプラインとして定義します。
パイプラインは、複数の変換(Transform)を連鎖させたものです。
var pipeline = mlContext.Transforms.Concatenate("Features", "Size")
.Append(mlContext.Regression.Trainers.Sdca(labelColumnName: "Price"));
この例では、以下の処理を行っています。
- “Size”列を”Features”という名前の特徴ベクトルに変換
- SDCA(Stochastic Dual Coordinate Ascent)アルゴリズムで回帰モデルをトレーニング
モデルのトレーニング
パイプラインを定義したら、Fitメソッドでモデルをトレーニングします。
ITransformer model = pipeline.Fit(trainingData);
Fitメソッドは、学習データに対してパイプライン内のすべての変換を適用し、最終的なモデルを生成します。
予測の実行
トレーニングしたモデルを使って予測を行います。
まず、予測結果を格納するクラスを定義します。
public class Prediction
{
[ColumnName("Score")]
public float Price { get; set; }
}
次に、予測エンジンを作成して予測を実行します。
var predictionEngine = mlContext.Model.CreatePredictionEngine<HouseData, Prediction>(model);
var inputData = new HouseData { Size = 2.5F };
var prediction = predictionEngine.Predict(inputData);
Console.WriteLine($"予測価格: ${prediction.Price}");
モデルの評価
モデルの性能を評価するために、テストデータを使用します。
IDataView testData = mlContext.Data.LoadFromTextFile<HouseData>(
path: "housing-test.csv",
hasHeader: true
);
IDataView predictions = model.Transform(testData);
var metrics = mlContext.Regression.Evaluate(predictions, labelColumnName: "Price");
Console.WriteLine($"R二乗値: {metrics.RSquared}");
Console.WriteLine($"平均絶対誤差: {metrics.MeanAbsoluteError}");
評価メトリックは、機械学習タスクの種類によって異なります。
回帰タスクでは、R二乗値(RSquared)、平均絶対誤差(MAE)、二乗平均平方根誤差(RMSE)などが使用されます。
分類タスクでは、正確度(Accuracy)、精度(Precision)、再現率(Recall)、F1スコアなどが使用されます。
モデルの保存と読み込み
トレーニングしたモデルをファイルに保存できます。
mlContext.Model.Save(model, trainingData.Schema, "model.zip");
保存したモデルを読み込んで使用します。
ITransformer loadedModel = mlContext.Model.Load("model.zip", out var modelInputSchema);
これにより、一度トレーニングしたモデルを繰り返し使用できます。
Model Builderの使い方
Model Builderは、コーディングなしで機械学習モデルを構築できるVisual Studio拡張機能です。
Model Builderのインストール
Visual Studioを開きます。
「拡張機能」→「拡張機能の管理」を選択します。
検索ボックスに「ML.NET Model Builder」と入力します。
「ML.NET Model Builder」を見つけてインストールします。
Visual Studioを再起動します。
Model Builderでのモデル作成手順
Visual Studioでプロジェクトを開きます。
ソリューションエクスプローラーでプロジェクトを右クリックします。
「追加」→「機械学習」を選択します。
Model Builderが起動し、新しいmbconfig構成ファイルの作成が求められます。
プロジェクトに名前を付けてmbconfigファイルを作成します。
シナリオの選択
Model Builderでは、まずシナリオを選択します。
利用可能なシナリオには以下があります。
- データ分類(Data classification):データをカテゴリに分類
- 値の予測(Value prediction):数値を予測
- 画像分類(Image classification):画像の内容を分類
- 推奨事項(Recommendation):ユーザーに製品やサービスを推薦
- カスタムシナリオ(Custom scenario):その他のシナリオ
例えば、製品レビューの感情分析を行いたい場合は「データ分類」を選択します。
データの読み込み
シナリオを選択したら、学習データを読み込みます。
ローカルファイル(CSV、TSVなど)からデータを読み込めます。
SQL Serverデータベースからデータを読み込むこともできます。
データを読み込むと、Model Builderが自動的にデータの構造を分析します。
トレーニング
データを読み込んだら、トレーニング時間を設定します。
トレーニング時間が長いほど、より多くのモデルが試され、最適なモデルが見つかる可能性が高まります。
初めての場合は、10~60秒程度の短い時間で試すことをお勧めします。
「トレーニング開始」ボタンをクリックすると、AutoMLがさまざまなアルゴリズムとパラメーターを自動的に試行します。
評価
トレーニングが完了すると、最適なモデルとその性能メトリックが表示されます。
例えば、分類タスクの場合、正確度(Accuracy)が表示されます。
正確度が高いほど(100%または1.0に近いほど)、モデルの性能が良いことを示します。
回帰タスクの場合、R二乗値(RSquared)が表示されます。
コードの生成と統合
満足のいく性能が得られたら、「コード」ステップに進みます。
Model Builderは、以下のファイルを自動的に生成します。
- モデルファイル(Model.zip):トレーニング済みのML.NETモデル
- モデル使用コード(ModelConsume.cs):モデルを使用して予測を行うコード
- モデルトレーニングコード(ModelTraining.cs):モデルを再トレーニングするコード
これらのファイルは、自動的にプロジェクトに追加されます。
生成されたコードを使用して、アプリケーションから簡単に予測を実行できます。
ML.NETの実用例
ML.NETは、様々な実世界の問題に適用できます。
感情分析
顧客レビューやソーシャルメディアの投稿を分析して、肯定的か否定的かを判定します。
Yelp、Amazonなどのレビューサイトのデータを使用できます。
二項分類タスクとして実装します。
テキストデータを特徴ベクトルに変換(FeaturizeText)してから、分類アルゴリズム(SdcaLogisticRegression、FastTreeなど)でトレーニングします。
製品やサービスの改善点を特定するのに役立ちます。
価格予測
不動産価格、タクシー運賃、製品価格などを予測します。
過去の取引データ(面積、場所、築年数などの特徴と実際の価格)を使用します。
回帰タスクとして実装します。
特徴を正規化(Normalize)してから、回帰アルゴリズム(Sdca、FastTreeなど)でトレーニングします。
新しい物件やサービスの適正価格を推定できます。
不正検出
クレジットカード取引、保険請求、オンライン購入などで不正を検出します。
過去の正常な取引と不正な取引のデータを使用します。
二項分類タスクまたは異常検出タスクとして実装します。
取引の金額、時間、場所、頻度などの特徴を使用します。
リアルタイムで不正の可能性を判定し、疑わしい取引をフラグ付けできます。
製品レコメンデーション
ECサイトで顧客に製品を推薦します。
ユーザーの過去の購入履歴や評価データを使用します。
レコメンデーションタスク(Matrix Factorization)として実装します。
Amazonの「この商品を買った人はこんな商品も買っています」のような機能を実現できます。
売上の向上とユーザーエクスペリエンスの改善に貢献します。
画像分類と品質検査
製造業での製品の品質検査を自動化します。
良品と不良品の画像データを収集します。
画像分類タスクとして、事前トレーニング済みのTensorFlowモデル(ResNetやInceptionなど)を転移学習で再トレーニングします。
コンクリート構造物のひび割れ検出、製品の傷や汚れの検出などに応用できます。
人間の検査官よりも高速で一貫性のある検査が可能になります。
スパム検出
メールやメッセージがスパムかどうかを判定します。
スパムメールと正常なメールのデータセットを使用します。
二項分類タスクとして実装します。
テキスト内の特定のキーワード、送信者情報、リンクの数などを特徴として使用します。
受信トレイを清潔に保ち、ユーザーの時間を節約できます。
売上予測
小売業や製造業で将来の売上を予測します。
過去の売上データ、季節性、プロモーション情報などを使用します。
回帰タスクまたは時系列予測タスクとして実装します。
在庫管理、生産計画、予算策定に役立ちます。
ML.NETのパフォーマンス
ML.NETは、高いパフォーマンスを実現しています。
ベンチマーク結果
Microsoftが公開した論文「Machine Learning at Microsoft with ML.NET」によると、感情分析タスクで以下の結果が得られました。
9GBのAmazonレビューデータセットを使用して、ML.NETは95%の精度でモデルをトレーニングしました。
他の人気のある機械学習フレームワーク(名前は明示されていませんが、おそらくscikit-learnなどを指すと思われます)は、メモリエラーのためにこのデータセットを処理できませんでした。
すべてのフレームワークがトレーニングを完了できるようにデータセットの10%を使用した場合、ML.NETが最も高い速度と精度を示しました。
クリックスルー率予測やフライト遅延予測など、他の機械学習シナリオでも同様の結果が得られています。
パフォーマンスが高い理由
ML.NETは、.NETランタイムの効率的なメモリ管理を活用します。
大規模データセットを扱う際のメモリ効率が優れています。
並列処理とマルチスレッド処理を効果的に利用します。
最適化されたアルゴリズム実装により、高速なトレーニングと予測が可能です。
ML.NETの課題と制限
ML.NETには多くの利点がありますが、いくつかの課題や制限もあります。
Pythonエコシステムとの比較
機械学習の分野では、Pythonが圧倒的に普及しています。
PythonにはTensorFlow、PyTorch、scikit-learn、Kerasなど、成熟したライブラリが豊富にあります。
研究論文の多くはPythonでの実装例が提供されます。
オンラインのチュートリアル、書籍、コミュニティのサポートもPythonが充実しています。
ML.NETは、.NET開発者にとっては便利ですが、機械学習専門家がゼロから学ぶには、Pythonの方が情報が多いかもしれません。
対応するアルゴリズムの制限
ML.NETは主要なアルゴリズムをカバーしていますが、Pythonライブラリほど幅広くはありません。
最新の研究成果がML.NETに実装されるまでに時間がかかることがあります。
ただし、TensorFlowやONNXモデルをインポートできるため、この制限は大幅に緩和されています。
ドキュメントとコミュニティ
ML.NETの日本語ドキュメントは充実していますが、Pythonに比べるとコミュニティは小さいです。
Stack Overflowなどでの質問回答も、Pythonの機械学習ライブラリに比べると少ない傾向があります。
ただし、Microsoft公式のドキュメントは質が高く、チュートリアルも豊富に用意されています。
ML.NETの学習リソース
ML.NETを学習するための豊富なリソースが用意されています。
公式ドキュメント
Microsoft Learnには、包括的なML.NETドキュメントがあります。
日本語版も完全に用意されており、英語が苦手でも学習できます。
基本概念から高度なトピックまで、段階的に学べます。
URL: https://learn.microsoft.com/ja-jp/dotnet/machine-learning/
チュートリアル
以下のような実践的なチュートリアルが用意されています。
- 感情分析:二項分類タスク
- GitHub問題分類:多クラス分類タスク
- 価格予測:回帰タスク
- Irisクラスタリング:クラスタリングタスク
- 映画レコメンデーション:レコメンデーションタスク
- 画像分類:転移学習を使用した画像分類
各チュートリアルには、詳細な説明とサンプルコードが含まれています。
GitHubサンプル
dotnet/machinelearning-samplesリポジトリには、多数のサンプルコードがあります。
実際のユースケースに基づいたサンプルが豊富に用意されています。
コードをダウンロードして、そのまま実行・改変できます。
URL: https://github.com/dotnet/machinelearning-samples
API リファレンス
Microsoft.ML名前空間のAPI リファレンスが公開されています。
各クラス、メソッド、プロパティの詳細な説明があります。
インテリセンスでも情報が表示されるため、Visual Studio内で参照しながら開発できます。
ML.NETの今後の展望
ML.NETは継続的に進化しています。
クラウド統合の強化
Azure Machine Learningとの統合が進んでいます。
クラウドでの大規模なモデルトレーニングと管理が容易になります。
MLOps(機械学習のDevOps)のサポートも強化されています。
.NETエコシステムの一部として
.NETの進化(パフォーマンス向上、クロスプラットフォーム対応の強化など)とともに、ML.NETも進化します。
Blazorなどの新しい.NET技術との統合も進んでいます。
IoTデバイスでの機械学習にも対応が進んでいます。
コミュニティの成長
オープンソースプロジェクトとして、コミュニティからの貢献が増えています。
.NET開発者の間で機械学習への関心が高まっています。
教育機関でもML.NETを教材として採用する動きがあります。
まとめ
ML.NETは、Microsoftが開発した.NET開発者向けの機械学習フレームワークです。
主な特徴は以下の通りです。
- オープンソース、無料、クロスプラットフォーム(Windows、macOS、Linux)
- C#やF#で機械学習モデルを構築可能
- AutoML機能により、最適なモデルを自動的に探索
- Model BuilderとML.NET CLIにより、コーディングなしでモデルを構築可能
- TensorFlow、ONNX、Infer.NETなど他のフレームワークと連携可能
- Power BI、Microsoft Defender、Outlook、Bingなど実績のある製品で使用されている
ML.NETで扱える主な機械学習タスクは、分類、回帰、クラスタリング、レコメンデーション、画像分類、物体検出、異常検出などです。
基本的な使い方は、MLContextの作成、データの読み込み、パイプラインの構築、モデルのトレーニング、評価、予測の実行という流れになります。
実用例として、感情分析、価格予測、不正検出、製品レコメンデーション、画像分類、スパム検出、売上予測などがあります。
ML.NETは高いパフォーマンスを実現しており、大規模データセットでも効率的に動作します。
Pythonエコシステムと比較すると、コミュニティや対応アルゴリズムの面で制限がありますが、.NET開発者にとっては既存のスキルを活用できる大きなメリットがあります。
公式ドキュメント、チュートリアル、GitHubサンプルなど、豊富な学習リソースが日本語で用意されています。
.NET開発者で機械学習に興味がある方、または既存の.NETアプリケーションに機械学習機能を追加したい方にとって、ML.NETは最適な選択肢と言えるでしょう。

コメント