关于ML.NET v0.8的发布说明

 

ML.NET容许您建立和使用针对场景的机器学习模型,以实现常见任务,如情绪分析,问题分类,预测,推荐,欺诈检测,图像分类等。您能够使用ML.NET示例GitHub仓库中查看这些常见任务 。ML.NET 0.8发布之际,咱们能够解释为何到目前为止它是最好的版本!此版本侧重于为推荐方案添加改进的支持,以特征重要性的形式添加模型可解释性,经过预览内存数据集提供可调试性,API缓存(如缓存,过滤等)。git

如下是此版本的一些亮点。github

  • 全新推荐方案
  • 改进了可调试性
  • 模型可解释性
  • 其余API改进

全新推荐方案

 

推荐系统能够为产品目录,歌曲,电影等中的产品生成推荐列表。像Netflix,亚马逊,Pinterest这样的产品在过去十年中已经保持公平合理原则使用相似推荐的方案。api

ML.NET使用Matrix Factorization和Field Aware Factorization基于机器的推荐方法来实现如下场景。一般,Field Aware Factorization机器是矩阵分解的更通常化的状况,并容许传递额外的元数据。缓存

使用ML.NET 0.8,咱们为Matrix Factorization添加了另外一种方案,能够提供建议。架构

推荐场景 推荐解决方案 连接到示例
产品建议基于产品ID,评级,用户ID和其余元数据,如产品描述,用户人口统计(年龄,国家等) 现场感知分解机器 ML.NET 0.3(此处示例
产品建议仅基于产品ID,评级和用户ID 矩阵分解 ML.NET 0.7(此处示例
基于产品ID和共同购买的产品ID的产品建议 一类矩阵分解 ML.NET 0.8中的新功能(此处示例

即便您只有商店的历史订单购买数据,仍然能够提供产品建议。app

这是一种流行的场景,由于在许多状况下您可能没有可用的评级。机器学习

使用历史购买数据,您仍然能够经过向用户提供“常常购买”产品列表来构建建议。ide

如下快照来自Amazon.com,其中推荐基于用户选择的产品的一组产品。函数

咱们如今在ML.NET 0.8中支持这种状况,您能够尝试这个基于亚马逊共同购买数据集执行产品推荐的示例性能

经过预览数据提升可调试性

 

在大多数状况下,当开始使用管道并加载数据集时,查看加载到ML.NET DataView中的数据很是有用,甚至正如所料在通过一些中间转换步骤后查看它以确保数据转换。

首先,您能够检查DataView的架构。
您须要作的就是将鼠标悬停在IDataView对象上,展开它,而后查找Schema属性。 

若是要查看DataView中加载的实际数据,能够执行动画下方显示的步骤。 

具体步骤是:

  • 在调试时,打开Watch窗口
  • 输入您的DataView对象的变量名称(在本例中testDataView)并Preview()为其调用方法。
  • 如今,单击要检查的行。这将显示DataView中加载的实际数据。

默认状况下,咱们在ColumnView和RowView中输出前100个值。可是能够经过将您感兴趣的行数传递给Preview()函数做为参数来改变,例如Preview(500)。

模型可解释性

在ML.NET 0.8版本中,咱们已经包含了咱们在Microsoft内部使用的模型可解释性API,以帮助机器学习开发人员更好地理解模型的功能重要性(“总体功能重要性”)并建立能够解释的高容量模型其余(“广义附加模型”)。

整体特征重要性令人们了解哪些特征对于模型而言整体上最重要。在建立机器学习模型时,一般不足以简单地进行预测并评估其准确性。如上图所示,功能重要性可帮助您了解哪些数据特征对模型最有价值,以便进行良好预测。例如,在预测汽车价格时,某些功能更重要,如里程和品牌/品牌,而其余功能可能会影响较少,如汽车的颜色。

经过名为“置换特征重要性”(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]}\t{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

请注意,在当前的ML.NET v0.8中,PFI仅适用于基于二进制分类和回归的模型,但咱们将在即将发布的版本中扩展到其余ML任务。

有关使用PFI分析模型的功能重要性的完整示例,请参阅ML.NET存储库中的示例。

广义附加模型或(GAM)具备很是可解释的预测。它们在易于理解方面相似于线性模型,但更灵活,能够具备更好的性能,而且还能够进行可视化/绘图以便于分析。

可在此处找到如何训练GAM模型,检查和解释结果的示例用法

ML.NET 0.8中的其余API改进

在此版本中,咱们还为API添加了其余加强功能,这些加强功能有助于过滤DataViews中的行,缓存数据,容许用户将数据保存为IDataView(IDV)二进制格式。您能够在此处了解这些功能。

过滤DataView中的行

有时您可能须要过滤用于训练模型的数据。例如,因为任何缘由(如“异常值”数据),您可能须要删除特定列的值低于或高于某些边界的行。

如今可使用FilterByColumn()API之类的其余过滤器来完成此操做,例如在ML.NET示例中示例应用程序的如下代码,咱们但愿仅保留介于1美圆和150美圆之间的付款行,由于对于此特定状况,由于考虑高于150美圆“异常值”(极端数据扭曲模型)和低于1美圆多是数据错误: 

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

得益于上面提到的Visual Studio中添加的DataView预览,您如今能够检查DataView中的过滤数据。

其余示例代码可在此处获取

 

一些估算器屡次迭代数据。您能够选择缓存数据,以便有时加快训练执行速度,而不是始终从文件中读取数据。

当训练使用针对相同数据运行屡次迭代的OVA(One Versus All)训练器时,如下是一个很好的示例。经过消除屡次从磁盘读取数据的须要,您能够将模型培训时间减小多达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));

实现此示例代码,并在ML.NET Samples repo 中的此示例应用程序测量执行时间

可在此处找到其余测试示例

启用以IDataView(IDV)二进制格式保存和加载数据以提升性能

 

在转换数据后保存数据有时颇有用。例如,您可能已将全部文本特征化为稀疏向量,并但愿使用不一样的预训练模型执行重复实验,而无需不断重复数据转换。

IDV格式是ML.NET提供的二进制数据视图文件格式。

IDV格式保存和加载文件一般比使用文本格式快得多,由于它是压缩的。

另外,由于它已经在“文件内”进行了模式化,因此您不须要像使用常规TextLoader那样指定列类型,所以除了更快以外,使用的代码也更简单。

可使用如下简单的代码行读取二进制数据文件:

mlContext.Data.ReadFromBinary("pathToFile");

可使用如下代码编写二进制数据文件:

mlContext.Data.SaveAsBinary("pathToFile");

为异常检测等时间序列问题启用状态预测引擎

ML.NET 0.7基于时间序列启用了异常检测方案。可是,预测引擎是无状态的,这意味着每次要肯定最新数据点是不是异常时,您还须要提供历史数据。这是不天然的。

预测引擎如今能够保持到目前为止看到的时间序列数据的状态,所以您如今能够经过提供最新的数据点来得到预测。这是经过使用CreateTimeSeriesPredictionFunction()而不是使用CreatePredictionFunction()

能够在此处找到示例用法。 

开始吧!

 

若是你尚未开始使用ML.NET这些资源对你或许有帮助:

相关文章
相关标签/搜索