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

C# ML.NET:如何用新数据重新训练文本分类模型,c#,.net,machine-learning,ml.net,C#,.net,Machine Learning,Ml.net,一般来说,我对机器学习非常陌生,尤其是对Microsoft ML.NET。 我想做的是为文本分类创建一个可重用的模型。 假设我有一篇文章(用于培训)和一篇文章预测(用于分类): 根据对可再培训模型的分析,我得出结论,我需要两条管道——准备管道和培训管道。以及“准备好的”数据的单独中间模型,以便进行再培训: public class ArticlePrepared : Article { [VectorType(???)] public float[] Features { get

一般来说,我对机器学习非常陌生,尤其是对Microsoft ML.NET。 我想做的是为文本分类创建一个可重用的模型。 假设我有一篇文章(用于培训)和一篇文章预测(用于分类):

根据对可再培训模型的分析,我得出结论,我需要两条管道——准备管道和培训管道。以及“准备好的”数据的单独中间模型,以便进行再培训:

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);
}
publicstaticvoidretain(MLContext-ctx,Article)
{
var prepModel=ctx.Model.Load(PreparationPipelinePath,out var 41;;
var RetainModel=ctx.Model.Load(TrainingPipelinePath,out var _)作为单一特性预测变压器;
var modelParams=(MaximumEntropyModelParameters)RetainModel.Model;
var prepData=prepModel.Transform(ctx.Data.LoadFromEnumerable(new[]{article}));
var retrainedModel=ctx.MulticlassClassification.Trainers
.LbfgsMaximumEntropy(“标签”,“特征”,历史大小:50,L1正则化:0.1f)
.Fit(prepData,modelParams);//砰!
ctx.Model.Save(retainedmodel、prepData.Schema、TrainingPipelinePath);
}
收到的异常是未找到有效的培训实例,所有实例都缺少功能。 我有几个问题:

  • 在我看来,文本中的每个单词都被转换为模型特征。这意味着,当我尝试用一篇新的
    文章
    对模型进行再培训时,经过培训的模型并不具备这篇新的
    文章
    的所有功能(因为我想用的新文本是不同的)。这就是我收到例外情况的原因吗

  • 在对文本进行特征化时,无法确定prepared
    ArticlePrepared
    模型应该具有多少特征(即
    VectorType
    属性的大小,或
    特征的长度
    数组属性)。是否可以使用动态数量的功能?如果您检查GitHub repo(下面的链接),您将看到
    VectorType
    的大小为131,但这是一个硬编码的值,取自已保存的模式。不用说,像这样的硬编码在现实场景中是行不通的

我创建了一个可以用来重现问题的

有没有办法去做我想做的事,或者我是在走一个完全错误的方向?任何帮助或见解都将不胜感激

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);
}