ML.NET 0.6版本提供了几项使人兴奋的新增功能:git
用于构建和使用机器学习模型的新APIgithub
咱们主要关注的是发布用于构建和使用模型的新ML.NET API的第一次迭代。这些新的,更灵活的API支持新任务和代码工做流,这是之前的LearningPipeline
API 没法实现的。咱们开始弃用当前的LearningPipeline
API。算法
这是一项重大改变,旨在使您的机器学习更轻松,更强大。咱们但愿经过GitHub的公开讨论来反馈您的反馈,以帮助塑造长期的ML.NET API,以最大限度地提升您的生产力,灵活性和易用性。数据库
了解有关新ML.NET API的更多信息api
可以对预先训练的ONNX模型进行评分服务器
图像分类,语音到文本和翻译等许多场景均可以从深度学习模型中使用预测中获益。在ML.NET 0.5中,咱们添加了对使用TensorFlow模型的支持。如今在ML.NET 0.6中,咱们增长了对从ONNX模型获取预测的支持。架构
了解有关在ML.NET中使用ONNX模型的更多信息框架
模型预测,.NET类型系统一致性等方面的显着性能改进机器学习
咱们知道应用程序性能相当重要。在此版本中,咱们将模型预测性能提升了100倍或更多。ide
其余加强功能包括:
最后,咱们期待与开源社区合做,进一步开发和增长对.NET机器学习的支持。咱们已经采起措施与Infer.NET集成,这是微软研究的一个项目,最近刚刚在.NET Foundation下做为开源项目发布。Infer.NET将扩展ML.NET以进行统计建模和在线学习,并在Microsoft.ML.Probabilistic
命名空间中提供。
接下来的部分将详细介绍上面列出的公告。
虽然与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基本上有五个主要概念,让咱们经过这个例子来看看它们:
使用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));
您的数据模式包含两列:
请注意,这种状况,从文件加载您的训练数据,是最简单的入门方式,但ML.NET还容许您从数据库或内存中的集合加载数据。
机器学习算法能够理解特征化数据,所以下一步是咱们将文本数据转换为ML算法识别的格式。为此,咱们建立一个估算器并使用FeaturizeText转换,以下面的代码段所示:
var est = reader.MakeNewEstimator().Append(row => { var featurizedText = row.text.FeaturizeText(); //Convert text to numeric vectors //... });
从数据获悉预估对象,并转换这个用于学习的结果。一个很好的例子是训练模型estimator.Fit()
,学习训练数据并产生机器学习模型。
如今,咱们的文本已经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);
如今您已经建立并训练了模型,使用不一样的数据集对其进行评估,以得到质量保证和验证,代码相似于如下内容:
// 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}");
代码段实现如下内容:
如今,您拥有通过培训的模型,可用于您的应用程序和服务。
如今,您能够经过使用刚刚建立和训练的模型来预测测试数据。
如下代码是您在“生产”应用程序中经过使用模型评分来预测某些内容时要编写的示例:
// 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是一种开放且不易操做的模型格式,可使用在一个框架中训练的模型(即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)));
能够在此处找到进一步的示例用法。
在这个版本中,咱们更容易在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问题,其中详细介绍了这一点。
Estimators
API加速29倍,加速进一步加速112倍PredictionFunction
)。Estimators
API 加速 22.8倍,加速进一步加速8.68倍PredictionFunction
)。这个模型包含一个文本特征,因此咱们看到一个较小的增益就不足为奇了。Estimators
API 加速 59.7倍,加速进一步提升109倍PredictionFunction
)。为了使ML.NET更易于使用并利用.NET中的创新,在ML.NET 0.6中,咱们已经用.NET的标准类型系统取代了Dv类型系统。
此外,因为改进的依赖注入方法,您如今还可使用.NET应用程序模型(如Azure功能)轻松地在其余方案中部署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。