使用 Scikit-learn 和 ML.NET 實現朴素貝葉斯(Naive Bayes)分類器


當我們想到機器學習時,首先想到的語言是 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。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM