ML.NET 0.8特性简介

摘要:
ML.NET0.8中添加了一个使用矩阵分解的新推荐场景。模型可解释性为了使模型更具可解释性,ML.NET0.8引入了一个新的API,以帮助理解模型功能的重要性,并创建一个可由其他人解释的高效模型。ML.NET0.8中的新FilterByColumn()API可以帮助解决类似问题。

本周.NET生态圈内的更新源源不断,除了.NET Core 2.2,ASP.NET Core 2.2和Entity Framework Core 2.2之外,ML.NET 0.8也一并登上舞台。

新的推荐场景

ML.NET使用基于矩阵分解(Matrix Factorization)和场感知分解机(Field-aware Factorization Machine)的方法来作推荐。一般而言,场感知分解机是矩阵分解更通用的例子,它允许传入额外的元数据。

在ML.NET 0.8中新加了运用矩阵分解的推荐场景。

推荐场景推荐方案示例链接
基于产品Id,评价,用户Id和诸如产品描述,用户特征(年龄,国家)的额外元数据的产品推荐场感知分解机ML.NET 0.3
基于产品Id,评价,用户Id的产品推荐矩阵分解ML.NET 0.7
基于产品Id和与其一同购买的产品Id的产品推荐One Class矩阵分解ML.NET 0.8

在新的推荐场景中,即使没有可用的评价,也可以通过历史购买数据为用户构建"经常一起购买的产品"(Frequently Bought Together)的列表。

通过预览数据改进调试功能

在多数例子里,当开始运行你的机器学习管道(pipeline),且加载数据时,能看到已经载入的数据是很有用的功能。尤其是在某些中间转换过程之后,需要确保数据如预期的一样发生变化。

现在当你想要预览DataView的数据模式(Schema)时,可以悬停鼠标在IDataView对象上,展开它,观察它的数据模式属性。
ML.NET 0.8特性简介第1张

而要查看DataView中已加载的实际数据,通过以下三步可以达成目标。

  • 在调试模式中打开观察窗口
  • 输入DataView对象的变量名,调用它的Preview方法
  • 点开想看的某行,这样就能显示其中实际加载的数据

默认情况下,只会显示100行的数据,但可以在Preview方法里传入参数,比如Preview(500),以获得更多的数据。

模型可解释性

为了让模型更具可解释性,ML.NET 0.8引入了新的API,用以帮助理解模型的特征重要性(整体特征重要度(Overall Feature Importance))以及创建能被其他人解释的高效模型(广义加性模型(Generalized Additive Models))。

整体特征重要度用于评判在模型中哪些特性是整体上最重要的。它帮助理解哪些特征是最有价值的,从而得到更好的预测结果。例如,当预测汽车价格时,一些特性比如里程数和生产商品牌是更重要的,而其它特性,如汽车颜色,则是影响甚小。

模型的整体特征重要度可以通过"排列特征重要度"(Permutation Feature Importance)(PFI)技术来获得。PFI借由"如果特征值设为随机数,会怎样影响模型"这一问题以测量特征重要度。

PFI方法的好处是其与模型无关,任何模型都可以用它作评估,并且它还可以使用任意数据。

使用PFI的方法如下例代码所示:

// Compute the feature importance using PFI
var permutationMetrics = mlContext.Regression.PermutationFeatureImportance(model, data);

// Get the feature names from the training set
var featureNames = data.Schema.GetColumns()
                .Select(tuple => tuple.column.Name) // Get the column names
                .Where(name => name != labelName) // Drop the Label
                .ToArray();

// Write out the feature names and their importance to the model's R-squared value
for (int i = 0; i < featureNames.Length; i++)
  Console.WriteLine($"{featureNames[i]}	{permutationMetrics[i].rSquared:G4}");

生成的结果包括了特征名与它的重要度。

Console output:

    Feature            Model Weight    Change in R - Squared
    --------------------------------------------------------
    RoomsPerDwelling      50.80             -0.3695
    EmploymentDistance   -17.79             -0.2238
    TeacherRatio         -19.83             -0.1228
    TaxRate              -8.60              -0.1042
    NitricOxides         -15.95             -0.1025
    HighwayDistance        5.37             -0.09345
    CrimesPerCapita      -15.05             -0.05797
    PercentPre40s         -4.64             -0.0385
    PercentResidental      3.98             -0.02184
    CharlesRiver           3.38             -0.01487
    PercentNonRetail      -1.94             -0.007231

广义加性模型拥有很好的预测可解释性。在便于理解上,它类似于线性模型,但更加灵活,并具有更佳的性能以及利于分析的可视化能力。

更多的API增强

在DataView中过滤行

有时你会需要对数据集过滤一部分数据,比如那些离群值(outlier)。ML.NET 0.8中新加入了FilterByColumn()API可以帮助解决类似问题。

使用方法如下面的代码所示:

IDataView trainingDataView = mlContext.Data.FilterByColumn(baseTrainingDataView, "FareAmount", lowerBound: 1, upperBound: 150);

缓存功能的API

当对同一数据作多次迭代处理时,通过缓存数据可以大幅减少训练时间。

以下例子可以减少50%的训练时间:

var dataProcessPipeline = mlContext.Transforms.Conversion.MapValueToKey("Area", "Label")
        .Append(mlContext.Transforms.Text.FeaturizeText("Title", "TitleFeaturized"))
        .Append(mlContext.Transforms.Text.FeaturizeText("Description", "DescriptionFeaturized"))
        .Append(mlContext.Transforms.Concatenate("Features", "TitleFeaturized", "DescriptionFeaturized"))
        //Example Caching the DataView 
        .AppendCacheCheckpoint(mlContext) 
        .Append(mlContext.BinaryClassification.Trainers.AveragedPerceptron(DefaultColumnNames.Label,                                  
                                                                          DefaultColumnNames.Features,
                                                                          numIterations: 10));

以IDataView二进制格式保存读取数据

将经过转换的数据保存为IDataView二进制格式相较普通的文本格式,可以极大地提升效率。同时,由于此格式保留了数据模式,所以可以方便读取而不需要再指定列类型。

读取与保存的API如下所示,十分简单:

mlContext.Data.ReadFromBinary("pathToFile");
mlContext.Data.SaveAsBinary("pathToFile");

用于时间序列问题的状态性预测引擎

ML.NET 0.7里可以基于时间序列处理异常检查问题。然而,其预测引擎是无状态的,这意味着每次要指出最新的数据点是否是异常的,需要同时提供历史数据。
新的引擎中可以保留时间序列的状态,所以现在只要有最新的数据点,即可以进行预测。需要改动的地方是将CreatePredictionFunction()方法替换成CreateTimeSeriesPredictionFunction()

免责声明:文章转载自《ML.NET 0.8特性简介》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Android studio的一些常用快捷键弱回调与std::forward下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

使用vs2010自带的数据库的方法

Microsoft SQL Server Database File(SqlClient)。选择数据库文件目录,或者创建数据库文件的目录---一般选择工程所在目录,然后给数据库一个名字.mdf。选择Use Windows Authentication。然后选择OK,YES。……这样创建数据库呢不是很好。关于“数据库版本为655 无法打开,此服务器支持612...

数据库——Oracle(增删改查,单行函数,多行函数,多表查询)

Oracle简介 1、sqlplus连接远程Oracle命令 sqlplus(需要设置环境变量) scott(用户名)/5456(密码)@192.168.230.128:1521(IP)/orcl(数据库名)  --如果是本地的Oracle,@后面的不用写 2、查看当前用户 show user  --sqlplus命令 3、查看当前用户下的表 select...

产品经理 数据分析

如果要解决一个问题,首先我们要准确地定义这个问题(按照上期所讲,这个需要有深刻的业务洞察能力),然后通过一系列的数据分析,定位原因,最后讨论并实施对策(即实现项目影响)。左右两个图对比,我们可以看到,数据分析的能力框架并不是天马行空想出来的,它是从解决问题的流程中提炼出来的。 无论是业务洞察还是数据分析,都是服务于原因定位。而当原因定位好之后,如果和你配合...

使用Python Requests上传表单数据和文件

在Python环境下写一个HTTP客户端,发送POST请求,同时上传表单数据和文件,我们可以使用Requests模块来实现。代码如下: data = { 'name': 'nginx' } files = {'file': open("abc.csv", 'rb')} response = requests.post(url, data=data...

[读书笔记] Python 数据分析 (十一)经济和金融数据应用

resample: 重采样函数,可以按照时间来提高或者降低采样频率,fill_method可以使用不同的填充方式。 pandas.data_range 的freq参数枚举: Alias Description B business day frequency C custom business day frequency D calend...

[NewLife.XCode]百亿级性能

NewLife.XCode是一个有10多年历史的开源数据中间件,支持nfx/netcore,由新生命团队(2002~2019)开发完成并维护至今,以下简称XCode。 整个系列教程会大量结合示例代码和运行日志来进行深入分析,蕴含多年开发经验于其中,代表作有百亿级大数据实时计算项目。 开源地址:https://github.com/NewLifeX/X(求s...