ML.NET Cookbook:(20)我如何定义自己的数据转换?

ML.NET有很多内置的转换器,但是我们不可能涵盖所有内容。不可避免地,您将需要执行自定义的用户定义操作。为此,我们添加了MLContext.Transforms.CustomMapping就是为了这个目的:这是用户定义的数据的任意映射

假设我们有一个带有float数据的'Income'列的数据集,我们要计算'Label',如果收入超过50000,则等于true,否则等于false

这是我们如何通过自定义转换器执行此操作的方法:

// 为我们打算使用的所有输入列定义一个类。
class InputRow
{
    public float Income { get; set; }
}

// 为我们打算产生的所有输出列定义一个类。
class OutputRow
{
    public bool Label { get; set; }
}

public static IDataView PrepareData(MLContext mlContext, IDataView data)
{
    // 定义操作代码。
    Action<InputRow, OutputRow> mapping = (input, output) => output.Label = input.Income > 50000;
    // 创建一个定制的估计器并转换数据。
    var estimator = mlContext.Transforms.CustomMapping(mapping, null);
    return estimator.Fit(data).Transform(data);
}

您还可以在估计器管道中插入自定义映射:

public static ITransformer TrainModel(MLContext mlContext, IDataView trainData)
{
    // 使用自定义操作。
    Action<InputRow, OutputRow> mapping = (input, output) => output.Label = input.Income > 50000;
    // 构建学习管道。
    var estimator = mlContext.Transforms.CustomMapping(mapping, null)
        .AppendCacheCheckpoint(mlContext)
        .Append(mlContext.BinaryClassification.Trainers.FastTree(labelColumnName: "Label"));

    return estimator.Fit(trainData);
}

请注意,您需要将mapping操作变成“纯函数”

  • 它应该是可重入的(我们将从多个线程同时调用它)

  • 它不应该有副作用(我们可以在任何时候任意调用,或忽略调用)

一个重要的警告是:如果希望自定义转换成为已保存模型的一部分,则需要为其提供contractName。在加载时,您需要向MLContext注册自定义转换器。

下面是一个完整的示例,用于保存和加载带有自定义映射的模型。

/// <summary>
/// 一个类包含我们的模型所需的自定义映射功能。
/// 
/// It has a <see cref="CustomMappingFactoryAttributeAttribute"/> on it and
/// derives from <see cref="CustomMappingFactory{TSrc, TDst}"/>.
/// </summary>
[CustomMappingFactoryAttribute(nameof(CustomMappings.IncomeMapping))]
public class CustomMappings : CustomMappingFactory<InputRow, OutputRow>
{
    // 这是自定义映射。我们现在将它分离为一个方法,以便在训练和加载中都可以使用它。
    public static void IncomeMapping(InputRow input, OutputRow output) => output.Label = input.Income > 50000;

    // 当加载模型以获取映射操作时,将调用此工厂方法。
    public override Action<InputRow, OutputRow> GetMapping()
    {
        return IncomeMapping;
    }
}
// 构建学习管道。请注意,我们现在为自定义映射提供了一个约定名称:否则我们将无法保存模型。
var estimator = mlContext.Transforms.CustomMapping<InputRow, OutputRow>(CustomMappings.IncomeMapping, nameof(CustomMappings.IncomeMapping))
    .Append(mlContext.BinaryClassification.Trainers.FastTree(labelColumnName: "Label"));

// 如果内存足够,我们可以将数据缓存在内存中,以避免在多次访问文件时从文件中加载数据。
var cachedTrainData = mlContext.Data.Cache(trainData);

// 训练模型
var model = estimator.Fit(cachedTrainData);

// 保存模型。
using (var fs = File.Create(modelPath))
    mlContext.Model.Save(model, fs);

// 现在假设我们在一个不同的过程中。

// 向ComponentCatalog注册包含“CustomMappings”的程序集,以便在加载模型时可以找到它。
newContext.ComponentCatalog.RegisterAssembly(typeof(CustomMappings).Assembly);

// 现在我们可以加载模型了。
ITransformer loadedModel = newContext.Model.Load(modelPath, out var schema);

欢迎关注我的个人公众号”My IO“

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
《Docker Cookbook: Over 100 Practical and Innovative Recipes to help you efficiently build, debug, and deploy modern applications with Docker》这本书是一本关于Docker的烹饪书,提供了100多个实用且创新的配方,帮助读者更有效地使用Docker构建、调试和部署现代应用程序。 这本书的重点是Docker的实际应用。它通过提供各种示例和场景,教读者如何使用Docker来解决真实世界中的问题。无论是初学者还是有经验的开发者,读者都能从中获得实用的技巧和最佳实践。 该书涵盖了Docker的各个方面,包括基础知识、容器管理、网络设置、数据管理、安全性、监视和调试等。每个章节都以一个具体的问题或需求开始,并提供了解决方案的详细步骤和代码示例。 这本书的一个重要特点是它的实用性。每个配方都针对特定的问题,并提供了详细的步骤和解释,使读者能够快速上手。读者可以根据自己的需求选择感兴趣的配方,并直接应用到他们的项目中。 另一个亮点是书中的创新性。作者不仅仅介绍了最基本的Docker功能,还分享了许多高级技巧和最新的工具。这些创新的配方将帮助读者更好地利用Docker的强大功能,提高他们的开发效率和部署质量。 总的来说,这本《Docker Cookbook: Over 100 Practical and Innovative Recipes to help you efficiently build, debug, and deploy modern applications with Docker》是一本实用而创新的Docker资源,适合所有对Docker感兴趣的开发者。无论是初学者还是有经验的专家,都能从中获得新的技能和知识,提高他们在使用Docker时的能力和效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值