机器学习框架ML.NET学习笔记自动学习
Posted 移动开发和人工智能
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了机器学习框架ML.NET学习笔记自动学习相关的知识,希望对你有一定的参考价值。
一、概述
本篇我们首先通过回归算法实现一个葡萄酒品质预测的程序,然后通过AutoML的方法再重新实现,通过对比两种实现方式来学习AutoML的应用。
该数据集,输入为一些葡萄酒的化学检测数据,比如酒精度等,输出为品酒师的打分,具体字段描述如下:
|
二、代码
关于泊松回归的算法,我们在进行人脸颜值判断的那篇文章已经介绍过了,这个程序没有涉及任何新的知识点,就不重复解释了,主要目的是和下面的AutoML代码对比用的。
三、自动学习
我们发现机器学习的大致流程基本都差不多,如:准备数据-明确特征-选择算法-训练等,有时我们存在这样一个问题:该选择什么算法?算法的参数该如何配置?等等。而自动学习就解决了这个问题,框架会多次重复数据选择、算法选择、参数调优、评估结果这一过程,通过这个过程找出评估效果最好的模型。
全部代码如下:
四、代码分析
1、自动学习过程
var progressHandler = new RegressionExperimentProgressHandler();
uint ExperimentTime = 200;
ExperimentResult<RegressionMetrics> experimentResult = mlContext.Auto()
.CreateRegressionExperiment(ExperimentTime)
.Execute(trainData, "Label", progressHandler: progressHandler);
Debugger.PrintTopModels(experimentResult); //打印所有模型数据
ExperimentTime 是允许的试验时间,progressHandler是一个报告程序,当每完成一种学习,系统就会调用一次报告事件。
public class RegressionExperimentProgressHandler : IProgress<RunDetail<RegressionMetrics>>
{
private int _iterationIndex;
public void Report(RunDetail<RegressionMetrics> iterationResult)
{
_iterationIndex++;
Console.WriteLine($"Report index:{_iterationIndex},TrainerName:{iterationResult.TrainerName},RuntimeInSeconds:{iterationResult.RuntimeInSeconds}");
}
}
调试结果如下:
1 2 3 4 5 6 7 8 9 10 11 12 |
|
学习结束后我们通过Debugger.PrintTopModels打印出所有模型数据:
public class Debugger
{
private const int Width = 114;
public static void PrintTopModels(ExperimentResult<RegressionMetrics> experimentResult)
{
var topRuns = experimentResult.RunDetails
.Where(r => r.ValidationMetrics != null && !double.IsNaN(r.ValidationMetrics.RSquared))
.OrderByDescending(r => r.ValidationMetrics.RSquared);
Console.WriteLine("Top models ranked by R-Squared --");
PrintRegressionMetricsHeader();
for (var i = 0; i < topRuns.Count(); i++)
{
var run = topRuns.ElementAt(i);
PrintIterationMetrics(i + 1, run.TrainerName, run.ValidationMetrics, run.RuntimeInSeconds);
}
}
public static void PrintRegressionMetricsHeader()
{
CreateRow($"{"",-4} {"Trainer",-35} {"RSquared",8} {"Absolute-loss",13} {"Squared-loss",12} {"RMS-loss",8} {"Duration",9}", Width);
}
public static void PrintIterationMetrics(int iteration, string trainerName, RegressionMetrics metrics, double? runtimeInSeconds)
{
CreateRow($"{iteration,-4} {trainerName,-35} {metrics?.RSquared ?? double.NaN,8:F4} {metrics?.MeanAbsoluteError ?? double.NaN,13:F2} {metrics?.MeanSquaredError ?? double.NaN,12:F2} {metrics?.RootMeanSquaredError ?? double.NaN,8:F2} {runtimeInSeconds.Value,9:F1}", Width);
}
public static void CreateRow(string message, int width)
{
Console.WriteLine("|" + message.PadRight(width - 2) + "|");
}
}
其中CreateRow代码功能用于排版。调试结果如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
|
根据结果可以看到,一些算法被重复试验,但在使用同一个算法时其配置参数并不一样,如阙值、深度等。
2、获取最优模型
RunDetail<RegressionMetrics> best = experimentResult.BestRun;
ITransformer trainedModel = best.Model;
获取最佳模型后,其评估和保存的过程和之前代码一致。用测试数据评估结果:
1 2 3 4 5 6 7 8 9 |
|
看结果识别率约70%左右,这种结果是没有办法用于生产的,问题应该是我们没有找到决定葡萄酒品质的关键特征。
五、小结
到这篇文章为止,《ML.NET学习笔记系列》就结束了。学习过程中涉及的原始代码主要来源于:https://github.com/dotnet/machinelearning-samples 。
该工程中还有一些其他算法应用的例子,包括:聚类、矩阵分解、异常检测,其大体流程基本都差不多,有了我们这个系列的学习基础有兴趣的朋友可以自己研究一下。
六、资源获取
回归工程名称:Regression_WineQuality
AutoML工程名称:Regression_WineQuality_AutoML
相关文章:
以上是关于机器学习框架ML.NET学习笔记自动学习的主要内容,如果未能解决你的问题,请参考以下文章
.NET机器学习 ML.NET 1.4预览版和模型生成器更新