<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