Scikit-learnとML.NETを用いた素朴ベイズ分類器の実現

6973 ワード

私たちが機械の勉強を考えたとき、まず考えた言語はPythonかRです.これは,これらのアルゴリズムを実現する多くの可能性を提供するため理解できる.
しかし、私は毎日C#で仕事をしていて、私の注意力はML.NETに惹かれています.本稿では、Python言語のNaive Bayes分類器をScikit-learnで実装する方法と、ML.NETを用いてC#でNaive Bayes分類器を実装する方法について説明したい.
 
Naive Bayes分類器
Naive Bayes分類器は単純な確率分類器であり,独立変数が互いに独立していると仮定し,ベイズの定理に基づいて数学的に以下のように表現される.
データ#データ#
私はUCIマシン学習リポジトリのワイン品質データセットを用いて実験を行った.解析されたデータセットには11の機能と11のクラスがあります.これらの等級は0~10の数値範囲のワインの品質を決定する.
 
ML.NET
最初のステップは、コンソールアプリケーションプロジェクトを作成することです.その後、NuGetからML.NETライブラリをダウンロードする必要があります.これで、データセットのプロパティに対応するクラスを作成できます.作成したクラスがリストに表示されます.
次に、データセットをロードし続け、トレーニングセットとテストセットに分割できます.私はここで標準構造を採用しました.すなわち、80%のデータはトレーニングセットであり、残りはテストセットです.
var dataPath = "../../../winequality-red.csv";
var ml = new MLContext();
var DataView = ml.Data.LoadFromTextFile(dataPath, hasHeader: true, separatorChar: ';');

ML.NETライブラリで採用されている標準に従ってモデル構造を調整する必要がある.これは、指定されたクラスのプロパティをLabelと呼ぶ必要があることを意味します.残りのアトリビュートはFeaturesの下で集約する必要があります.
var partitions = ml.Data.TrainTestSplit( DataView, 
testFraction: 0.3);
var pipeline = ml.Transforms.Conversion.MapValueToKey(
inputColumnName: "Quality", outputColumnName: "Label")
.Append(ml.Transforms.Concatenate("Features", "FixedAcidity", "VolatileAcidity","CitricAcid", "ResidualSugar", "Chlorides", "FreeSulfurDioxide", "TotalSulfurDioxide","Density", "Ph", "Sulphates", "Alcohol")).AppendCacheCheckpoint(ml);

上記の手順が完了したら、トレーニングパイプの作成を続行できます.ここではNaive Bayes分類器を選択し、パラメータにLabelとFeaturesのカラム名を指定します.指定したプロパティは、予測ラベルも表します.
var trainingPipeline = pipeline.Append(ml.MulticlassClassification.Trainers.NaiveBayes("Label","Features"))
.Append(ml.Transforms.Conversion.MapKeyToValue(
"PredictedLabel"));

最後に、モデルのトレーニングとテストを続行できます.すべては2行のコードで終わります.
var trainedModel = trainingPipeline.Fit(partitions.TrainSet);
var testMetrics = ml.MulticlassClassification.Evaluate(trainedModel.Transform(partitions.TestSet));

 
Scikit-learn
Python実装の場合,データセットファイルの処理からも開始する.そのため、デジタルとパンダライブラリを使用します.リストには、ファイルからデータを取得し、そこからndarrayを作成するための関数が表示され、アルゴリズムに使用されます.
from sklearn.naive_bayes import GaussianNB
from common.import_data import ImportData
from sklearn.model_selection import train_test_split
if __name__ == "__main__":
data_set = ImportData()
x = data_set.import_all_data()
y = data_set.import_columns(np.array(['quality']))

次に、トレーニングとテストセットを作成します.この場合、テストセットに対して20%のデータを使用し、トレーニングセットに対して80%のデータを使用します.trainを使いましたtest_split関数です.sklearnライブラリから来ます.
X_train, X_test, y_train, y_test = train_test_split(x, y, test_size=0.2)

Naive Bayesカテゴリに移動できます.この場合、トレーニングとテストも数行のコードで終了します.
NB = GaussianNB()
NB.fit(X_train, y_train.ravel())
predictions = NB.predict(X_test)
print('Scores from each Iteration: ', NB.score(X_test, y_test))

 
結果とサマリー
Naive Bayes分類器によるScikit−learn実装の精度は56.5%であり,ML.NETは41.5%であった.相違は他のアルゴリズム実装方式に起因する可能性があるが,正確性のみに基づいて,どの方法がよりよいかは説明できない.しかし,C#とML.NETを用いるという有望な方法で機械学習アルゴリズムが登場し始めたと言える.