关于ML.NET v0.6的发布说明
ML.NET 0.6版本提供了几项令人兴奋的新增功能:
-
用于构建和使用机器学习模型的新API
我们主要关注的是发布用于构建和使用模型的新ML.NET API的第一次迭代。这些新的,更灵活的API支持新任务和代码工作流,这是以前的
LearningPipeline
API 无法实现的。我们开始弃用当前的LearningPipeline
API。这是一项重大改变,旨在使您的机器学习更轻松,更强大。我们希望通过GitHub的公开讨论来反馈您的反馈,以帮助塑造长期的ML.NET API,以最大限度地提高您的生产力,灵活性和易用性。
了解有关新ML.NET API的更多信息
-
能够对预先训练的ONNX模型进行评分
图像分类,语音到文本和翻译等许多场景都可以从深度学习模型中使用预测中获益。在ML.NET 0.5中,我们添加了对使用TensorFlow模型的支持。现在在ML.NET 0.6中,我们增加了对从ONNX模型获取预测的支持。
了解有关在ML.NET中使用ONNX模型的更多信息
-
模型预测,.NET类型系统一致性等方面的显着性能改进
我们知道应用程序性能至关重要。在此版本中,我们将模型预测性能提高了100倍或更多。
其他增强功能包括:
- 对ML.NET TensorFlow评分的改进
- 与.NET类型系统更加一致
- 具有适用于Azure功能等无服务器工作负载的模型部署
最后,我们期待与开源社区合作,进一步开发和增加对.NET机器学习的支持。我们已经采取措施与Infer.NET集成,这是微软研究的一个项目,最近刚刚在.NET Foundation下作为开源项目发布。Infer.NET将扩展ML.NET以进行统计建模和在线学习,并在Microsoft.ML.Probabilistic
命名空间中提供。
接下来的部分将详细介绍上面列出的公告。
用于构建和使用机器学习模型的新API
虽然与ML.NET 0.1一起发布的现有LearningPipeline API很容易上手,但在我们之前的ML.NET博客文章中解释了一些限制。继续前进,LearningPipeline API已移至Microsoft.ML.Legacy命名空间(例如,基于使用LearningPipeline API的二进制分类的情感分析)。
新API旨在支持更广泛的场景,并严格遵循ML原则,并从其他流行的ML相关框架(如Apache Spark和Scikit-Learn)命名。
让我们来看一个使用新API构建情感分析模型的示例,并介绍新概念。
构建ML模型涉及以下高级步骤:
要使用ML.NET完成这些步骤,新API基本上有五个主要概念,让我们通过这个例子来看看它们:
第1步:加载数据
开始吧
使用ML.NET构建模型时,首先要创建ML上下文或环境。这与在实体框架中使用DbContext相当,但当然,在完全不同的域中。环境为ML作业提供了可用于异常跟踪和日志记录的上下文。
var env = new LocalEnvironment();
我们正在努力使这个概念/命名更接近EF和其他.NET框架。
加载您的数据
最重要的事情之一就是一如既往的数据!将数据集加载到ML管道中以用于训练模型。
在ML.NET中,数据类似于SQL视图。它被懒惰地评估,模式化,异质化。在此示例中,示例数据集如下所示:
Toxic(标签) | Comment(文字) |
---|---|
1 | == RUDE ==老兄,你老实了...... |
1 | ==好的!== IM即将破坏...... |
0 | 我还发现使用“人文主义者”一词令人困惑...... |
0 | 噢,谢谢DietLime先生...... |
要读入此数据,您将使用数据读取器,它是一个ML.NET组件。读者会接受环境并要求您定义数据的架构。在这种情况下,第一列(Toxic)的类型为Boolean,“label”(也指预测)和第二列(Comment)是我们将用于预测情绪的文本/字符串类型的特征。
var reader = TextLoader.CreateReader(env, ctx => (label: ctx.LoadBool(0), text: ctx.LoadText(1))); var traindata = reader.Read(new MultiFileSource(TrainDataPath));
您的数据模式包含两列:
- 布尔列(Toxic),它是“标签”并定位为第一列。
- 文本列(Comment),这是我们用来预测的功能。
请注意,这种情况,从文件加载您的训练数据,是最简单的入门方式,但ML.NET还允许您从数据库或内存中的集合加载数据。
第2步:提取功能(转换数据)
机器学习算法可以理解特征化数据,因此下一步是我们将文本数据转换为ML算法识别的格式。为此,我们创建一个估算器并使用FeaturizeText转换,如下面的代码段所示:
var est = reader.MakeNewEstimator().Append(row => { var featurizedText = row.text.FeaturizeText(); //Convert text to numeric vectors //... });
从数据获悉预估对象,并转换这个用于学习的结果。一个很好的例子是训练模型estimator.Fit()
,学习训练数据并产生机器学习模型。
第3步:训练你的模型
添加选定的ML学习者(算法)
现在,我们的文本已经featurized,下一步是添加一个学习者。在这种情况下,我们将使用SDCA分类学习器。
添加学习者还需要我们创建一个额外的上下文,因为我们正在为我们的情绪分析执行二元分类ML任务。
var bctx = new BinaryClassificationContext(env); var est = reader.MakeNewEstimator().Append(row => { var featurizedText = row.text.FeaturizeText(); //Convert text to numeric vectors var prediction = bctx.Trainers.Sdca(row.label, featurizedText); //Specify SDCA trainer return (row.label, prediction); //Return label and prediction columns });
学习者接受label
,并将特征 text
作为输入参数并返回prediction
包含predictedLabel
概率和得分字段三元组的内容。
训练你的模型
定义估算器后,使用Fit()API训练模型。这将返回用于预测的模型。
var model = est.Fit(traindata);
第4步:评估您训练的模型
现在您已经创建并训练了模型,使用不同的数据集对其进行评估,以获得质量保证和验证,代码类似于以下内容:
// Evaluate the model var predictions = model.Transform(testdata); var metrics = bctx.Evaluate(predictions, row => row.label, row => row.prediction); Console.WriteLine("PredictionModel quality metrics evaluation"); Console.WriteLine("------------------------------------------"); Console.WriteLine($"Accuracy: {metrics.Accuracy:P2}");
代码段实现以下内容:
- 加载测试数据集。
- 评估模型并创建指标。
- 根据指标显示模型的准确性。
现在,您拥有经过培训的模型,可用于您的应用程序和服务。
第5步:模型消费
现在,您可以通过使用刚刚创建和训练的模型来预测测试数据。
以下代码是您在“生产”应用程序中通过使用模型评分来预测某些内容时要编写的示例:
// Create the prediction function var predictionFunct = model.AsDynamic.MakePredictionFunction<SentimentIssue, SentimentPrediction>(env); // Predict the sentiment! var resultprediction = predictionFunct.Predict(new SentimentIssue { text = "This is a very rude movie" }); Console.WriteLine($"Text: {sampleStatement.text} | Prediction: {(resultprediction.PredictionLabel ? "Negative" : "Positive")} sentiment");
在该示例中,您可以猜测由于提供的文本,预测不会是正面的。
您可以在此处找到情绪分析示例的所有代码。
能够对预先训练的ONNX模型进行评分
ONNX是一种开放且不易操作的模型格式,可以使用在一个框架中训练的模型(即scikit-learn,TensorFlow,xgboost等)并在另一个框架中使用它们(如ML.NET)。
在ML.NET v0.3中,我们添加了将ML.NET模型导出为ONNX-ML格式的功能,因此额外的执行环境可以运行该模型(例如Windows ML)。
在这个新的v0.6版本中,ML.NET还可以使用ONNX模型来评分/预测使用ONNX标准v1.2的训练有素的ONNX模型。我们使用新的变换器和运行时启用了这个,用于评分ONNX模型,如下所示。
在多个框架中创建和培训了大量ONNX模型,可以将模型导出为ONNX格式。这些模型可用于图像分类,情感识别和对象检测等任务。
ML.NET 中的ONNX 转换器允许向现有的ONNX模型(例如上面的模型)提供一些数据并从中获得分数(预测)。
ML.NET中的ONNX运行时目前仅支持x64 CPU上的Windows。路线图中包含对其他平台(Linux和macOS)的支持。
在估算器中使用ONNX模型的方法是简单地使用类似于以下代码的行添加它:
.Append(row => (row.name, softmaxout_1: row.data_0.ApplyOnnxModel(modelFile)));
可以在此处找到进一步的示例用法。
TensorFlow模型评分功能的改进
在这个版本中,我们更容易在ML.NET中使用TensorFlow模型。使用TensorFlow评分转换需要知道要从中检索模型的哪个节点,因此我们添加了一个API来发现TensorFlow模型中的节点,以帮助识别TensorFlow模型的输入和输出。可以在此处找到示例用法。
此外,之前在ML.NET 0.5中我们只启用了“冻结”TensorFlow模型。现在在ML.NET 0.6中,也可以使用保存的模型格式的 TensorFlow模型。
性能改进
在ML.NET 0.6版本中,我们在从训练模型进行单一预测时进行了几项性能改进。第一项改进来自于从传统的LearningPipeline API迁移到新的Estimators API。第二个改进来自优化新API中PredictionFunction的性能。
要了解基准测试结果的详细信息,请参阅GitHub问题,其中详细介绍了这一点。
- 对Iris数据的预测:3,272倍加速(使用
Estimators
API加速29倍,加速进一步加速112倍PredictionFunction
)。 - 对情绪数据的预测:198倍加速(使用
Estimators
API 加速 22.8倍,加速进一步加速8.68倍PredictionFunction
)。这个模型包含一个文本特征,所以我们看到一个较小的增益就不足为奇了。 - 关于乳腺癌数据的预测:加速 6,541 倍(使用
Estimators
API 加速 59.7倍,加速进一步提高109倍PredictionFunction
)。
输入系统改进
为了使ML.NET更易于使用并利用.NET中的创新,在ML.NET 0.6中,我们已经用.NET的标准类型系统取代了Dv类型系统。
- ML.NET以前有自己的类型系统,可以帮助它更有效地处理缺失值(ML中的常见情况)。此类型系统要求用户使用DvText,DvBool,DvInt4等类型。
- 这种变化的一个影响是只有浮点数和双精度值具有缺失值,由NaN表示。更多信息可以在这里找到。
此外,由于改进的依赖注入方法,您现在还可以使用.NET应用程序模型(如Azure功能)轻松地在其他方案中部署ML.NET,而无需进行复杂的解决方法。
Infer.NET现在是开源的,并成为ML.NET系列的一部分
2018年10月5日,微软研究院宣布开放Infer.NET,这是一个基于模型的机器学习的跨平台框架。
Infer.NET与传统的机器学习框架的不同之处在于,它要求用户指定问题的统计模型。这允许高度可解释性,结合领域知识,进行无监督/半监督学习,以及在线推理 - 随着新数据的到来学习的能力。我们的免费在线预订课程中介绍了该方法及其许多应用。
在微软使用Infer.NET的地方包括TrueSkill - 一个用于Halo和Gears of War配对的技能评级系统,Matchbox-- Azure机器学习中的推荐系统,以及Alexandria - Satori的自动知识库构建,仅举几例。
我们正在与Infer.NET团队合作,使其成为ML.NET系列的一部分。已经朝着这个方向迈出的步骤包括在.NET Foundation下发布并将包名和命名空间更改为Microsoft.ML.Probabilistic。