プログラミングや電子工作などについての記事がほとんどです

C#で使える機械学習ライブラリ「Accord.NET」

2 件のコメント

この記事はC# Advent Calender 2015の4日目です。

基礎的なことを書きます。なんてコメントをしていましたが、記事公開日前日にC#に機械学習ライブラリで有名なものがあったかな?という疑問が突然浮かんできたのでこのようなタイトルの記事を書くことにしました。

C#で機械学習をするということ

機械学習をする言語といえば、scikit-learnという機械学習ライブラリやNumPy, SciPy, matplotlibなどの数値計算、グラフ描画のライブラリが充実しているPythonが有名です。他にデータマイニング用のソフトウェアWEKAの実装言語として使用されているJavaも選択肢の一つですね。

また、Googleが2015年11月10日にオープンソースとしてリリースしたTensorFlowという機械学習ライブラリは、Python ,C++から利用可能です。

この現状から、機械学習は圧倒的にPython優勢という土俵と言えますが、これまでC#を使ってきた私としてはC#でも機械学習をやってみたい。そんなモチベーションでこの記事を書きました。

パターン認識と機械学習 上
C.M. ビショップ
丸善出版
売り上げランキング: 28,712

C#で使える機械学習ライブラリ「Accord.NET Framework」

Accord.NET Machine Learning Framework

今回紹介するライブラリはAccord.NET Frameworkというライブラリです。こちらは機械学習に関するオープンソースのライブラリ群で、統計処理や行列計算、ニューラルアルゴリズム、信号処理、画像解析などやりたいことはこれで大体できそうなくらい充実しているようです。胸が高鳴りますね。なお、2015年12月3日現在バージョン3.0が公開されています。githubではソースを見ることも可能です。

できることの一例を紹介

ディープラーニング

深層ニューラルネットワーク、いわゆるディープラーニングを利用することができます。こちらはディープラーニングを利用した文字認識のアプリケーションの例です。

SVM(サポートベクタマシン)

分類器の一種であるSupport Vector Machineを使うこともできます。こちらも文字認識の例です。

ジェスチャコントローラ

画像認識の技術を用いてジェスチャ認識することも可能です。 こちらの例は顔の向きを解析し、ジェスチャとして認識するアプリケーション例です。

HMM(隠れマルコフモデル)

タッチインターフェースのジェスチャ認識をHMMを使用して実装している例です。C#という性質を生かしてWindows PhoneのアプリケーションやWindowsタブレット端末への応用ができそうですね。

カーネル判別分析

カーネル判別分析によりデータの分類もできます。

データサイエンティスト養成読本 機械学習入門編 (Software Design plus)
比戸 将平 馬場 雪乃 里 洋平 戸嶋 龍哉 得居 誠也 福島 真太朗 加藤 公一 関 喜史 阿部 厳 熊崎 宏樹
技術評論社
売り上げランキング: 3,836

サンプルコードを試してみる

Classification · accord-net/framework Wiki

公式ページのサンプルコードを実際に動かしてみたいと思います。環境はVisualStudio 2013を想定しています。

まずはグラフを表示するところから

プロジェクトの作成

C#のコンソールアプリケーションを作成しましょう。 今回プロジェクト名はAccordNetTestとします。

Accord.Net Frameworkのインストール

ツールバーのプロジェクト(P)>NuGetパッケージの管理を選択します。 左カラムのオンラインを選択したのち、検索窓にaccordと入力しましょう。そこから

  • Accord.Controls
  • Accord.Math
  • Accord.IO をインストールしましょう。 ひょっとすると依存関係の都合で同時に何かインストールされるかもしれませんが、気にしなくて大丈夫です。

使用するExcelデータの配置

こちらから今回使用するサンプルのExcelシートを保存します。配置位置はAccordNetTestプロジェクトの bin/Debug/ディレクトリに配置します。

なお、このデータには2次元の数値データと、そのデータの分類の正解のクラス(ラベリング)が記録されています。

ソースコード

Program.csを次のように編集します。便宜上公式のサンプルコードを少し変更しています。

using System.Data;
using System.Windows;

using Accord.Controls;
using Accord.IO;
using Accord.Math;

namespace AccordNetTest
{
    class Program
    {
        static void Main(string[] args)
        {
            //エクセルシートの読み込み
            DataTable table = new ExcelReader("examples.xls").GetWorksheet(1);

            //データテーブルから2次元ベクトルに変換
            double[][] inputs = table.ToArray<double>("X", "Y");
            int[] outputs = table.Columns["G"].ToArray<int>();

            //データをプロットする
            ScatterplotBox.Show("Yin-Yang", inputs, outputs).Hold();
        }
    }
}

ScatterplotBox.Show(string title, double[][] x, int[] z)の各引数は title:グラフのタイトル、x:(x,y)のデータのペア、z:xに対応するラベル、を意味しています。つまりinputにはX,Yのデータの対を格納し、outputにはそのラベルを格納しています。

参照の追加

このまま実行すると「参照されていないアセンブリで定義されています」といったエラーが表示されるかと思います。これはScatterplotBoxというAccord.NETのクラスがSystem.Windows.Formを継承しているためです。またdoubleの二次元配列を使用するためにSystem.Numerics.Complexを参照するみたいです。なのでツールバーのプロジェクト(P)>参照の追加(R)からSystem.NumericsSystem.Windows.Formsの参照を追加します。

実行

実行すると、データはエクセルで定義されたクラス通りプロットされたグラフが表示されます。

ナイーブベイズで分類してみる

先ほどのソースコードを少し編集し、Accord.NETライブラリを活用してデータを分類器にかけてみます。 今回試してみるのはNaive Bayesで、機械学習を勉強した時に初めて目にする分類器だと思います。日訳で単純ベイズ分類器というだけに、ベイズの定理で表せるシンプルな分類器です。

ソースコード

公式サンプルコードのまま実行するとエラーがでます。バージョンアップによる仕様変更が原因だと思いますが、それをサクっと解消して実行しましょう。

using System.Data;
using System.Windows;

using Accord.Controls;
using Accord.IO;
using Accord.Math;
using Accord.Statistics.Distributions.Univariate;
using Accord.MachineLearning.Bayes;

namespace AccordNetTest
{
    class Program
    {
        static void Main(string[] args)
        {
            //エクセルシートの読み込み
            DataTable table = new ExcelReader("examples.xls").GetWorksheet(1);

            //データテーブルから2次元ベクトルに変換
            double[][] inputs = table.ToArray<double>("X", "Y");
            int[] outputs = table.Columns["G"].ToArray<int>();

            // 2入力の分類器を作成
            var nb = new NaiveBayes<NormalDistribution>(classes: 2,
                inputs: 2, initial: new NormalDistribution());

            // ナイーブベイズ分類器はクラスのラベルが0から始まる自然数である必要がある。
            // そのため、-1のラベルを0に変換する。
            outputs = outputs.Apply(x => x < 0 ? 0 : x);

            // ナイーブベイズの度数分布表を初期化
            double error = nb.Estimate(inputs, outputs);

            //構築したモデルでサンプルデータを分類
            int[] answers = inputs.Apply(nb.Compute);

            // 結果をプロット
            ScatterplotBox.Show("Expected results", inputs, outputs);
            ScatterplotBox.Show("Naive Bayes results", inputs, answers)
                .Hold();
        }
    }
}

実行

実行すると2つのウィンドウが表示されます。 Expected resultsという名前のウィンドウには先ほど表示したものと同じ正解のグラフが、 Naive Bayes resultsという名前のウィンドウにはNaiveBayesで分類した結果のグラフが表示されます。

事例+演習で学ぶ機械学習 ビジネスを支えるデータ活用のしくみ
速水 悟
森北出版
売り上げランキング: 14,321

サンプルが動いたら

今回動かしてみたのは分類問題ですが、画像処理や音声信号処理など色々できるので公式ドキュメントを読んで色々遊んでみてください!

Sample gallery - Accord.NET Machine Learning in C#
公式のサンプルが非常に充実しています。 是非参考にしながら使ってみてください。

Framework modules
また、リファレンスが詳しく丁寧に書かれているので困ったらこれを読むといいと思います。

まとめ

今回初めてAccord.NETというライブラリを触ってみましたが、簡単なコードで機械学習を実装できます。 ちょっと凝ったアプリケーションを作ってみたい人や、研究における検証にも使えるのではないでしょうか。 今後Unityのコードに埋め込んで活用するという例も出てきそうですね。(出来るかはよくわからない) 以上C#コーダのための機械学習ライブラリの紹介でした。

ITエンジニアのための機械学習理論入門
中井 悦司
技術評論社
売り上げランキング: 1,911

2 件のコメント :

  1. 私もC#で機械学習をやってみたかったので、参考になりました。
    時間が空いたら試してみようと思います。

    返信削除
    返信
    1. ご感想ありがとうございます!
      是非お試しください!

      削除