ML.NET:如何使用新数据重新训练文本分类模型

时间:2019-10-06 14:29:00

标签: c# .net machine-learning ml.net

对于机器学习,特别是对Microsoft ML.NET,我是一个新手。 我正在尝试做的是创建一个可重新训练的文本分类模型。 假设我有一条文章(用于培训)和一条文章预测(用于分类):

public class Article
{
    public string Text { get; set; }
    public string Topic { get; set; }
}

public class ArticlePrediction
{
    public float[] Score { get; set; }
    public uint PredictedLabel { get; set; }
}

documentation和可重训练模型this GitHub issue之后,我得出结论,我将需要两个管道-准备管道和训练管道。并为“准备好的”数据建立一个单独的中间模型,以便进行重新训练:

public class ArticlePrepared : Article
{
    [VectorType(???)]
    public float[] Features { get; set; }
    public uint Label { get; set; }
}

模型的实际训练很简单:

public static void Train(MLContext ctx, IDataView data)
{
    var prepPipeline = ctx.Transforms.Conversion.MapValueToKey("Label", "Topic")
        .Append(ctx.Transforms.Text.FeaturizeText("Features", "Text"));
    var trainPipeline = ctx.MulticlassClassification.Trainers
        .LbfgsMaximumEntropy("Label", "Features", historySize: 50, l1Regularization: 0.1f);

    var prepModel = prepPipeline.Fit(data);
    var prepData = prepModel.Transform(data);
    var trainModel = trainPipeline.Fit(prepData);

    ctx.Model.Save(prepModel, data.Schema, PreparationPipelinePath);
    ctx.Model.Save(trainModel, prepData.Schema, TrainingPipelinePath);
}

再培训部分是我一直在努力的部分,现在我怀疑这是否可能:

public static void Retrain(MLContext ctx, Article article)
{
    var prepModel = ctx.Model.Load(PreparationPipelinePath, out var _);
    var retrainModel = ctx.Model.Load(TrainingPipelinePath, out var _) as ISingleFeaturePredictionTransformer<object>;
    var modelParams = (MaximumEntropyModelParameters)retrainModel.Model;

    var prepData = prepModel.Transform(ctx.Data.LoadFromEnumerable(new[] { article }));

    var retrainedModel = ctx.MulticlassClassification.Trainers
        .LbfgsMaximumEntropy("Label", "Features", historySize: 50, l1Regularization: 0.1f)
        .Fit(prepData, modelParams); // boom!

    ctx.Model.Save(retrainedModel, prepData.Schema, TrainingPipelinePath);
}

收到的异常是未找到有效的训练实例,所有实例均缺少功能。 我有几个问题:

  • 在我看来,文本中的每个单词都将转换为模型特征。这意味着当我尝试使用新的Article重新训练模型时,训练后的模型并不具有该新Article的所有功能(因为新文本,我想使用, 是不同的)。这是我收到例外的原因吗?

  • 在使文本具有特色时,无法判断准备好的ArticlePrepared模型应具有多少个功能(即VectorType属性的大小或{ {1}}数组属性)。可以使用动态数量的功能吗?如果检查GitHub存储库(下面的链接),您会看到Features的大小为131,但这是从已保存的架构中获取的硬编码值。不用说,这种硬编码在现实情况下是行不通的。

我创建了一个GitHub repository,可用于重现该问题。

是否有办法去做我想做的事情,或者我走的方向完全错误?任何帮助或见解都将受到赞赏。

0 个答案:

没有答案