ML.NET 示例:心臟病預測

<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個參數做爲輸入: 屬性信息:數據庫

  • (age) - 年齡
  • (sex) - (1 = 男性; 0 = 女性)
  • (cp) - 胸痛類型 - 值1:典型心絞痛 - 值2:非典型心絞痛 - 值3:非心絞痛 - 值4:無症狀
  • (trestbps) - 靜息血壓(入院時單位:mm Hg)
  • (chol) - 血清膽固醇(mg/dl)
  • (fbs) -(空腹血糖>120 mg/dl)(1=是;0=否)
  • (restecg) - 心電圖檢查結果——值0:正常——值1:有ST-T波異常(T波倒置和/或ST擡高或下降>0.05 mV)——值2:根據ESTES標準顯示可能或肯定的左室肥大。
  • (thalach) - 最大心率
  • (exang) - 運動性心絞痛(1=是;0=否)
  • (oldpeak) - 運動引發ST段壓低
  • (slope) - 峯值運動ST段的斜率——值1:上坡——值2:平坡——值3:下坡
  • (ca) - 用熒光染色的主要血管數(0-3)
  • (thal) - 3 =正常; 6 =固定缺陷; 7 =可逆缺陷
  • (num) -(預測屬性)心臟病診斷(血管造影疾病狀態)--值0:<50%直徑變窄--值1:>50%直徑變窄

並預測患者心臟病的存在,整數值從0到4: 克利夫蘭數據庫(本例中使用的數據集)的實驗集中於簡單地嘗試區分存在(值1)和不存在(值0)。app

機器學習任務 - 二元分類

二元分類通常用於將項目分類爲兩個類中的一個的問題(將項目分類爲兩個以上的類稱爲多類分類)。機器學習

  • 預測保險索賠是否有效。
  • 預測飛機是否會延誤或將準時到達。
  • 預測face ID(照片)是否屬於設備的全部者。

全部這些示例的共同特徵是咱們想要預測的參數只能採用兩個值中的一個。 換句話說,該值由 boolean 類型表示。學習

解決方案

要解決這個問題,首先咱們將創建一個機器學習模型。而後,咱們將在現有數據上訓練模型,評估其有多好,最後咱們將使用該模型來預測心臟病是否存在。測試

Build -> Train -> Evaluate -> Consume

1. 創建模型

創建模型包括:

  • 定義要使用TextLoader加載(HeartTraining.tsvHeartTest.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"));

2. 訓練模型

訓練模型是在訓練數據上運行所選算法以調整模型參數的過程。它是在估算器對象的 Fit() 方法中實現。

爲了執行訓練,您須要在爲DataView對象提供了訓練數據集後調用 Fit() 方法。

ITransformer trainedModel = pipeline.Fit(trainingDataView);

請注意,ML.NET使用延遲加載方式處理數據,因此在實際調用.Fit()方法以前,沒有任何數據真正加載到內存中。

3. 評估模型

咱們須要這一步驟來斷定咱們的模型對新數據的準確性。 爲此,上一步中的模型再次針對測試數據集(HeartTest.csv)運行。 此數據集包含了已知的標籤。

Evaluate()將測試數據集與預測值進行比較,並生成各類指標,例如準確性,您能夠對其進行探究。

var predictions = trainedModel.Transform(testDataView);
var metrics = mlContext.BinaryClassification.Evaluate(data: predictions, labelColumnName: "Label", scoreColumnName: "Score");

4. 使用模型

訓練完模型後,您可使用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

相關文章
相關標籤/搜索