提升ML.NET模型的准确性
ML.NET是一个面向.NET开发人员的开源、跨平台的机器学习框架。
使用ML.NET,您可以轻松地为诸如情绪分析、价格预测、销售分析、推荐、图像分类等场景构建自定义机器学习模型。
ML.NET从0.8版开始,支持评估特性的重要性,从而了解哪些列对于预测最终值更重要。
排列特征的重要性在于,突出最重要的特征,以便理解哪些特征必须包括,哪些不用包括;从数据集中排除一些特性意味着减少噪音,结果会更好。
因此,通过PFI,我们可以了解在我们的学习pipeline中什么是最重要的列,并使用它们来预测值。
Pipeline
第一步与预测值的步骤相同,因此必须构建pipeline。
例如,一个标准pipeline可以是这样的:
var mlContext = new MLContext(); var dataView = MlContext.Data.LoadFromTextFile<T>(dataPath, separator, hasHeader: false); var pipeline = MlContext.Transforms.CopyColumns("Label", _predictedColumn.ColumnName).Append(MlContext.Transforms.Concatenate(_featureColumn, _concatenatedColumns));
这是一个非常简单的pipeline,从文件中加载数据,复制label列并添加feature列。
现在pipeline已经配置好了,我们可以构建模型了。
Model
建立模型意味着获取pipeline、附加选择算法,对其进行拟合和变换。
var tranformedDataView = pipeline.Append(MlContext.Regression.Trainers.LbfgsPoissonRegression()).Fit(DataView).Transform(DataView);
结果是一个转换后的数据视图,其中应用了pipeline转换所有数据,我们将在Permutation Feature Importance方法中使用这些转换。
Metrics
为了获得PFI指标,除了转换后的数据视图,我们还需要一个转换器:
var transformer = pipeline.MlContext.Regression.Trainers.LbfgsPoissonRegression().Fit(tranformedDataView);
现在我们可以得到度量:
var permutationMetrics = pipeline.MlContext.Regression.PermutationFeatureImportance(transformer, transformedDataView, permutationCount: 3);
使用permutation count参数,我们可以指定希望为回归度量执行的观察次数。
结果是一个回归度量统计数据的数组,并在一个特定的度量上可用的排序,比如平均值:
var regressionMetrics = permutationMetrics.Select((metric, index) => new { index, metric.RSquared }).OrderByDescending(features => Math.Abs(features.RSquared.Mean));
有了循环,我们现在可以打印的指标:
foreach (var metric in regressionMetrics) { if (metric.index >= transformedData.Schema.Count || (transformedData.Schema[metric.index].IsHidden || transformedData.Schema[metric.index].Name == "Label" || transformedData.Schema[metric.index].Name == "Features")) continue; Console.WriteLine($"{transformedData.Schema[metric.index].Name,-20}|\t{metric.RSquared.Mean:F6}"); }
在这个示例的情况下,输出是:
有了这个统计数据,我们可以了解什么是最重要的特性,并将更改应用到pipeline构建中。
这篇文章的源代码可以在GitHub项目上找到。
原文地址:https://www.cnblogs.com/BeanHsiang/p/11725679.html
- 真是热闹! Slade.com等多个域名被曝交易
- python编码问题之"encode"&"decode"
- python3编码问题终结者--还搞不懂你来找我
- Pycharm集成PyQt4并使用
- python遍历一个目录,输出所有文件名
- pyqt4实现tab界面切换
- 腾讯云Fintech云端系列论坛首站北京,揭秘如何全链路赋能互联网金融
- Flask入门笔记(一)
- 刷脸还是指纹识别,that's a question
- c#:使用using关键字自动释放资源未必一定就会有明显好处
- MongoDB 学习笔记(原创)
- Silverlight:ScorllViewer随Tab键自动跟随子控件的Focus滚动
- 老域名做新站如何能快速得上首页?
- Silverlight:分包下载及SEO优化方案
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 如何在 Linux 中查找一个命令或进程的执行时间
- Ubuntu 18.04 LTS中配置IP地址的完整步骤
- Linux系统下Nginx支持ipv6配置的方法
- 微信研发体系下的分布式配置系统设计概要
- Linux双网卡绑定脚本的方法示例
- Serverless 有一百种玩法,比好玩更好玩
- 如何在容器服务中获取客户端真实源IP
- Linux服务器间文件实时同步的实现
- centos7 设置grub密码及单用户登录实例代码
- Linux命令行快速技巧之定位一个文件的方法
- Linux低电量自动关机的实现方法
- ubuntn备份方法总结(四种)
- linux让程序开机自动运行最简单的方法
- centos克隆linux虚拟机的完整步骤分享
- CentOS7.4下MySQL5.7.28二进制方式安装的方法步骤