<link crossorigin="anonymous" media="all" integrity="sha512-PcJMPDRp7jbbEAmTk9kaL2kRQqg69QZ26WsZf07xsPyaipKsi3wVG0805PZNYXxotPDAliKKFvNSQPhD8fp1FQ==" rel="stylesheet" href="https://assets-cdn.github.com/assets/site-50c740d9290419d070dd6213a7cd03b5.css">css
ML.NET 示例中文版:https://github.com/feiyun0112/machinelearning-samples.zh-cn/blob/master/samples/csharp/getting-started/BinaryClassification_HeartDiseaseDetection 英文原版請訪問:https://github.com/dotnet/machinelearning-samples/tree/master/samples/csharp/getting-started/BinaryClassification_HeartDiseaseDetectionhtml
ML.NET 版本 | API 類型 | 狀態 | 應用程序類型 | 數據類型 | 場景 | 機器學習任務 | 算法 |
---|---|---|---|---|---|---|---|
v1.0.0 | 動態 API | 最新版 | 控制檯應用程序 | .txt 文件 | 心臟病預測 | 二元分類 | FastTree |
在這個介紹性示例中,您將看到如何使用ML.NET預測心臟病。在機器學習領域中,這種類型的預測被稱爲二元分類。git
數據集使用的是: [UCI Heart disease] (https://archive.ics.uci.edu/ml/datasets/heart+Disease) 此數據庫包含76個屬性,但全部已發佈的實驗都只使用了其中14個屬性的子集。github
該數據集的引用文獻可在此處獲取DataSets-Citation算法
該問題集中在基於14個屬性預測是否有心臟病。 爲了解決這個問題,咱們將構建一個ML模型,它將4個參數做爲輸入: 屬性信息:數據庫
並預測患者心臟病的存在,整數值從0到4: 克利夫蘭數據庫(本例中使用的數據集)的實驗集中於簡單地嘗試區分存在(值1)和不存在(值0)。app
二元分類通常用於將項目分類爲兩個類中的一個的問題(將項目分類爲兩個以上的類稱爲多類分類)。機器學習
全部這些示例的共同特徵是咱們想要預測的參數只能採用兩個值中的一個。 換句話說,該值由 boolean
類型表示。學習
要解決這個問題,首先咱們將創建一個機器學習模型。而後,咱們將在現有數據上訓練模型,評估其有多好,最後咱們將使用該模型來預測心臟病是否存在。測試
創建模型包括:
定義要使用TextLoader加載(HeartTraining.tsv
和 HeartTest.csv
)到數據集的數據模式。
經過將特徵鏈接到單個「features」列來建立估算器
選擇訓練器/學習算法(好比FastTree
)來訓練模型。
初始代碼相似如下內容:
// STEP 1: Common data loading configuration var trainingDataView = mlContext.Data.LoadFromTextFile<HeartData>(TrainDataPath, hasHeader: true, separatorChar: ';'); var testDataView = mlContext.Data.LoadFromTextFile<HeartData>(TestDataPath, hasHeader: true, separatorChar: ';'); // STEP 2: Concatenate the features and set the training algorithm var pipeline = mlContext.Transforms.Concatenate("Features", "Age", "Sex", "Cp", "TrestBps", "Chol", "Fbs", "RestEcg", "Thalac", "Exang", "OldPeak", "Slope", "Ca", "Thal") .Append(mlContext.BinaryClassification.Trainers.FastTree(labelColumnName: "Label", featureColumnName: "Features"));
訓練模型是在訓練數據上運行所選算法以調整模型參數的過程。它是在估算器對象的 Fit()
方法中實現。
爲了執行訓練,您須要在爲DataView對象提供了訓練數據集後調用 Fit()
方法。
ITransformer trainedModel = pipeline.Fit(trainingDataView);
請注意,ML.NET使用延遲加載方式處理數據,因此在實際調用.Fit()方法以前,沒有任何數據真正加載到內存中。
咱們須要這一步驟來斷定咱們的模型對新數據的準確性。 爲此,上一步中的模型再次針對測試數據集(HeartTest.csv
)運行。 此數據集包含了已知的標籤。
Evaluate()
將測試數據集與預測值進行比較,並生成各類指標,例如準確性,您能夠對其進行探究。
var predictions = trainedModel.Transform(testDataView); var metrics = mlContext.BinaryClassification.Evaluate(data: predictions, labelColumnName: "Label", scoreColumnName: "Score");
訓練完模型後,您可使用Predict()
API來預測心臟病是否出如今心臟數據集列表中。
// Create prediction engine related to the loaded trained model var predictionEngine = mlContext.Model.CreatePredictionEngine<HeartData, HeartPrediction>(trainedModel); foreach (var heartData in HeartSampleData.heartDataList) { var prediction = predictionEngine.Predict(heartData); Console.WriteLine($"=============== Single Prediction ==============="); Console.WriteLine($"Age: {heartData.Age} "); Console.WriteLine($"Sex: {heartData.Sex} "); Console.WriteLine($"Cp: {heartData.Cp} "); Console.WriteLine($"TrestBps: {heartData.TrestBps} "); Console.WriteLine($"Chol: {heartData.Chol} "); Console.WriteLine($"Fbs: {heartData.Fbs} "); Console.WriteLine($"RestEcg: {heartData.RestEcg} "); Console.WriteLine($"Thalac: {heartData.Thalac} "); Console.WriteLine($"Exang: {heartData.Exang} "); Console.WriteLine($"OldPeak: {heartData.OldPeak} "); Console.WriteLine($"Slope: {heartData.Slope} "); Console.WriteLine($"Ca: {heartData.Ca} "); Console.WriteLine($"Thal: {heartData.Thal} "); Console.WriteLine($"Prediction Value: {prediction.Prediction} "); Console.WriteLine($"Prediction: {(prediction.Prediction ? "A disease could be present" : "Not present disease" )} "); Console.WriteLine($"Probability: {prediction.Probability} "); Console.WriteLine($"=================================================="); Console.WriteLine(""); Console.WriteLine(""); }
原文出處:https://www.cnblogs.com/feiyun0112/p/10961117.html