可以说我有一个复杂的类型:
class Policy
{
string Name { get; set; }
DateTime InceptionDate { get; set; }
DateTime ExpirationDate { get; set; }
List<Location> Locations { get; set; }
}
class Location
{
string Street { get; set; }
string City { get; set; }
string State { get; set; }
string PostalCode { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
如何将 的集合转换Locations
为特征列以供 ML.NET 理解?
我对机器学习非常陌生,我偶然发现了以下问题。考虑到官方的纽约市出租车票价金额预测教程,假设我想预测另一个实际值,例如TripTime
。我修改了我的代码如下:
public class TripFarePrediction // this class is used to store prediction result
{
[ColumnName("Score")]
public float FareAmount { get; set; }
[ColumnName("Score2")]
public float TripTime { get; set; }
}
private static ITransformer Train(MLContext mlContext, string trainDataPath)
{
IDataView dataView = _textLoader.Read(trainDataPath);
var pipelineForTripTime = mlContext.Transforms.CopyColumns("Label", "TripTime")
.Append(mlContext.Transforms.Categorical.OneHotEncoding("VendorId"))
.Append(mlContext.Transforms.Categorical.OneHotEncoding("RateCode"))
.Append(mlContext.Transforms.Categorical.OneHotEncoding("PaymentType"))
.Append(mlContext.Transforms.Concatenate("Features", "VendorId", "RateCode", "PassengerCount", "TripDistance", "PaymentType"))
.Append(mlContext.Regression.Trainers.FastTree());
var pipelineForFareAmount = mlContext.Transforms.CopyColumns("Label", "FareAmount")
.Append(mlContext.Transforms.Categorical.OneHotEncoding("VendorId"))
.Append(mlContext.Transforms.Categorical.OneHotEncoding("RateCode"))
.Append(mlContext.Transforms.Categorical.OneHotEncoding("PaymentType"))
.Append(mlContext.Transforms.Concatenate("Features", "VendorId", "RateCode", "PassengerCount", "TripDistance", "PaymentType"))
.Append(mlContext.Regression.Trainers.FastTree());
var model = …
Run Code Online (Sandbox Code Playgroud) ML.NET 的文档展示了如何使用context.Transforms.Text.ProduceWordBags
获取词袋。该方法将Transforms.Text.NgramExtractingEstimator.WeightingCriteria
作为参数之一,因此可以请求使用TfIdf
权重。最简单的例子是:
// Get a small dataset as an IEnumerable and then read it as a ML.NET data set.
IEnumerable<SamplesUtils.DatasetUtils.SampleTopicsData> data = SamplesUtils.DatasetUtils.GetTopicsData();
var trainData = ml.Data.LoadFromEnumerable(data);
var pipeline = ml.Transforms.Text.ProduceWordBags("bags", review, ngramLength: 1, weighting: Transforms.Text.NgramExtractingEstimator.WeightingCriteria.TfIdf);
var transformer = pipeline.Fit(trainData);
var transformed_data = transformer.Transform(trainData);
Run Code Online (Sandbox Code Playgroud)
一切都很好,但我如何得到实际结果transformed_data
呢?
我在调试器中做了一些挖掘,但我仍然对这里实际发生的事情感到困惑。
首先,运行管道会添加三个额外的列transformed_data
:
预览数据后,我可以看到这些列中的内容。为了让事情更清楚,这里是GetTopicsData
返回的内容,这就是我们运行转换的内容:
animals birds cats dogs fish horse
horse birds house fish duck cats
car truck driver bus pickup
car truck driver …
Run Code Online (Sandbox Code Playgroud) 我正在尝试将以下 ML.NET F# 产品推荐示例改编为我自己的用例:https://github.com/dotnet/machinelearning-samples/tree/master/samples/fsharp/getting-started/MatrixFactorization_ProductRecommendation
但是,在我的数据集中,我没有两个数字 ID。相反,我有一个 UserId(数字)和一个 ProductId(字符串)。因为键值似乎只能是数字,所以我尝试使用该MapValueToKey
函数来映射它。但是,我仍然收到以下错误:
Unhandled Exception: System.InvalidOperationException: Column 'UserId' with role MatrixColumnIndex should be a known cardinality U4 key, but is instead 'UInt32'
at Microsoft.ML.Recommender.RecommenderUtils.CheckRowColumnType(RoleMappedData data, ColumnRole role, Column& col, Boolean isDecode)
at Microsoft.ML.Recommender.RecommenderUtils.CheckAndGetMatrixIndexColumns(RoleMappedData data, Column& matrixColumnIndexColumn, Column& matrixRowIndexColumn, Boolean isDecode)
at Microsoft.ML.Trainers.MatrixFactorizationTrainer.TrainCore(IChannel ch, RoleMappedData data, RoleMappedData validData)
at Microsoft.ML.Trainers.MatrixFactorizationTrainer.Fit(IDataView trainData, IDataView validationData)
at Microsoft.ML.Trainers.MatrixFactorizationTrainer.Fit(IDataView input)
at <StartupCode$Recommender>.$Program.main@() in /Users/nat/Projects/Recommender/Recommender/Program.fs:line 75
Run Code Online (Sandbox Code Playgroud)
我的数据的架构类似于以下内容:
UserId,ProductId
1,test-product-id
Run Code Online (Sandbox Code Playgroud)
这是失败的代码,改编自链接的示例:
Unhandled Exception: System.InvalidOperationException: Column 'UserId' with role MatrixColumnIndex …
Run Code Online (Sandbox Code Playgroud) 我只是尝试制作我的第一个ML.NET项目,之前我使用 Azure ML、可视化界面、Python 等构建了该项目,但现在我想使用C#来完成。
我正在遵循本教程,但具有完全不同的数据集和目的。
数据集有很多额外的列,但我的数据模型如下所示(指向数据集中列的索引):
using Microsoft.ML.Data;
namespace ML_Net
{
public class Earthquake
{
[LoadColumn(1)]
public int geo_level_1_id { get; set; }
[LoadColumn(2)]
public int geo_level_2_id { get; set; }
[LoadColumn(3)]
public int geo_level_3_id { get; set; }
[LoadColumn(4)]
public int count_floors_pre_eq { get; set; }
[LoadColumn(5)]
public int age { get; set; }
[LoadColumn(6)]
public int area { get; set; }
[LoadColumn(7)]
public int height { get; set; }
[LoadColumn(8)]
public int …
Run Code Online (Sandbox Code Playgroud) 我正在尝试实现 ML.Net 的示例之一。示例中的项目面向 .Net core 2.1,我正在 .NET 4.7 Framework 中构建我的项目。我遇到的问题是下面的行无法编译
mlContext.Transforms.LoadRawImageBytes(.....等)
我得到的错误是
错误 CS1061“TransformsCatalog”不包含“LoadRawImageBytes”的定义,并且找不到接受“TransformsCatalog”类型的第一个参数的可访问扩展方法“LoadRawImageBytes”(您是否缺少 using 指令或程序集引用?)。我已经看过,LoadRawImageBytes 应该是方法的一部分,但它不被识别。我正在使用 ML.Net 1.4.0 Nuget 包。有任何想法吗?非常感谢
Microsoft.ML 在 Xamarin 中工作吗?
我关注了https://dotnet.microsoft.com/learn/ml-dotnet 上的许多教程和视频。简单教程(此处)列出了我遵循的核心流程(在 Xamarin 项目中),但我无法使用 iOS(或 Android)Xamarin 应用程序查看MLModel.zip
从模型生成器生成的文件。它设置为“始终复制”。
我可以这样做,还是 Microsoft.ML 与 Xamarin(用于 ARM)不兼容?
ML NET 1.4 的发行说明(https://devblogs.microsoft.com/dotnet/announcing-ml-net-1-4-global-availability-machine-learning-for-net/)表明它将作为 .NET 运行Core 3.0 等应该可用于 ARM 处理器,但我无法确认或否认 ML.NET 在 Xamarin 跨平台开发方面的状态。
我目前正在开发 .NET Framework 4.8 中的桌面工具,该工具接收具有潜在裂纹的图像列表,并使用经过 ML.Net (C#) 训练的模型来执行裂纹检测。理想情况下,我希望 10 个图像的预测时间少于 100 毫秒(注意:单个图像预测需要 36-41 毫秒)。
首先,我尝试使用 PredictionEngines 列表和 Parallel.For 循环在不同线程中执行多个预测(使用线程列表,因为 .Net Framework 没有 PredictionEnginePool 实现)。后来我了解到,使用 ITransformer 进行预测是 .Net Framework 推荐的线程安全方法,并转而使用该方法,但在这两种情况下,它都没有给我带来我所希望的性能。
执行以下代码大约需要 255-281 毫秒(平均 267.1 毫秒):
MLContext mlContext = new MLContext();
IDataView inputData = mlContext.Data.LoadFromEnumerable(inputDataEnumerable);
IDataView results = _LoadedModel.Transform(inputData);
var imageClassificationPredictions = mlContext.Data.CreateEnumerable<ImageClassificationPrediction>(results, false).ToList();
Run Code Online (Sandbox Code Playgroud)
其中_LoadedModel是一个ITransformer,表示之前训练和加载的模型,inputDataEnumerable是ModelInput的列表,它包含两个属性:ImageData(从png图像中提取的图像数据的byte[])和Label(字符串类型,设置为null)。
SciSharp.TensorFlow.Redist
我尝试通过将 TensorFlow 包依赖项从 切换为 来
加速此过程,如本教程SciSharp.TensorFlow.Redist-Windows-GPU
中所述。
然而,执行时间几乎保持不变(10 个图像的平均时间为 262.4 毫秒)。我还尝试比较了 5760 张图像的小数据集的训练时间,但看不出有太大差异(两者都花费了大约 7 分 21 秒)。
从这些结果来看,它似乎没有使用 GPU,所以我首先尝试删除项目的 …
我们有一个场景,需要使用机器学习算法来预测值。由于一些问题,我们希望在 ML.NET 中实现这一点。
我们在一个项目中尝试了 AutoML,并使用近 8 万条数据记录对其进行了训练。我们对数据进行了 30 多分钟的训练。csv 文件为 22MB。数据如下所示。
------------------------------------
Col1 col2
------------------------------------
Some text 21
Some other text 2
Run Code Online (Sandbox Code Playgroud)
我们有一些上述类型的历史数据。我们需要从 col1 文本中预测 col2。即使该列是整数,它也会以小数形式预测结果。
有人用 python 创建了一个模型,目前正在按预期工作。我们想在 ML.NET 中使用它。
我们是否有可能在 ML.NET 中使用由 python 创建的模型?
我有一个 ML.NET 应用程序,我必须在编译后动态创建接口 IDataView 以用于训练。我找到了这个线程,并且我已经能够成功地为训练数据集创建动态接口,然后用它来训练模型。当我尝试使用相同的界面以便使用经过训练的模型创建预测时,我的问题就出现了。文档显示您应该创建一个预测引擎,您必须在其中定义输入和输出类类型才能创建引擎。就像是:
mlContext.Model.CreatePredictionEngine<TSrc,TDst>(ITransformer, DataViewSchema)
Run Code Online (Sandbox Code Playgroud)
其中TSrc和TDst是编译时已知的类类型。我的问题是我在编译时不知道输入类类型的结构,并且必须为输入数据源创建动态接口。由于参数已知,因此可以定义输出类对象,但我不确定如何继续进行动态输入。
我想我可以尝试在接口上使用类似GetType()的东西,但它说“隐式类型变量不能有多个声明符”。我的简化示例如下所示:
public class ModelOutput
{
public string PredictedLabel { get; set; }
public float[] Score { get; set; }
}
public class MakePrediction
{
protected void Solve(IDataView data, ITransformer model)
{
var mlContext = new MLContext();
var engine = mlContext.Model.CreatePredictionEngine<data.GetType(), ModelOutput>(model, data.Schema);
}
}
Run Code Online (Sandbox Code Playgroud) ml.net ×10
c# ×7
.net ×2
automl ×1
collections ×1
f# ×1
ios ×1
microsoft.ml ×1
prediction ×1
tensorflow ×1
tf-idf ×1
windows ×1
xamarin ×1