ML.NET: как переучить модель классификации текста новыми данными - PullRequest
1 голос
/ 06 октября 2019

Я довольно новичок в машинном обучении в целом и в Microsoft ML.NET в частности. Я пытаюсь создать переучиваемую модель для классификации текста. Предположим, у меня есть Article (для обучения) и ArticlePrediction (для классификации):

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

В соответствии с документацией для переучиваемых моделей и этой проблемой GitHub Я пришел к выводу, что мне понадобятся два трубопровода - подготовительный и обучающий. И отдельная промежуточная модель для «подготовленных» данных, для того чтобы сделать переобучение:

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 или длина свойства массива Features). Можно ли работать с динамическим количеством функций? Если вы осмотрите репозиторий GitHub (ссылка ниже), вы увидите, что VectorType имеет размер 131, но это жестко заданное значение, которое было взято из уже сохраненной схемы. Излишне говорить, что подобное жесткое кодирование не будет работать в реальном сценарии.

У меня есть GitHub-репозиторий , который можно использовать для воспроизведенияпроблема.

Есть ли способ сделать то, что я пытаюсь сделать, или я иду в совершенно неправильном направлении? Любая помощь или идеи приветствуются.

...