當我們想到機器學習時,首先想到的語言是 Python 或 R。這是可以理解的,因為它們為我們提供了實現這些算法的許多可能性。
然而,我每天在用 C# 工作,我的注意力被 ML.NET 所吸引。在本文中,我想演示如何使用 Scikit-learn 實現 Python 語言中的 Naive Bayes 分類器,以及使用 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<Features>(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"));
最后,您可以繼續訓練和測試模型。一切都以兩行代碼搞定。
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。