ML.NET AutoML 保存的模型架构问题

ML.NET AutoML saved model schema issue

我可以使用 ML.NET 手动训练模型、保存模型、加载模型以创建 PredictionEngine 并进行预测。但是,当我尝试使用 AutoML 功能时,由于下面的模式绑定问题,我 运行 在加载模型时遇到问题。

有人知道问题出在哪里吗?如果我在不使用 AutoML 的情况下训练和保存模型,我可以让我的模型正常加载并做出预测,所以这让我很困惑。

System.InvalidOperationException
  Message=Can't bind the IDataView column 'CategoricalFeature1' of type 'Vector<Single, 42>' to field or property 'CategoricalFeature1' of type 'System.String'.
  Source=Microsoft.ML.Data

下面是我如何加载模型并使用 modelSchema 创建 PredictionEngine

var trainedModel = mlContext.Model.Load(@"D:\Best_Model.zip", out var modelSchema);

var predictionEngine = mlContext.Model.CreatePredictionEngine<MyData, MyDataPrediction>(trainedModel, modelSchema);

以下是我如何使用 AutoML 训练我的模型并保存最佳模型。

var experimentSettings = new BinaryExperimentSettings
{
    MaxExperimentTimeInSeconds = 60 * 1,
    CancellationToken = cancellationTokenSource.Token,
    OptimizingMetric = BinaryClassificationMetric.AreaUnderRocCurve,
    CacheDirectoryName = CACHE_DIRECTORY_NAME
};

var dataView = mlContext.Data.LoadFromTextFile<MyData>(@"D:\MyDataset.csv", separatorChar: ',', hasHeader: true);

var experiment = mlContext.Auto().CreateBinaryClassificationExperiment(experimentSettings);

var crossValidationExperimentResult = experiment.Execute(dataView, numberOfCVFolds: 10);

var bestCrossValidationResult = crossValidationExperimentResult.BestRun.Results
    .OrderByDescending(result => result.ValidationMetrics.AreaUnderRocCurve)
    .First();

mlContext.Model.Save(bestCrossValidationResult.Model, dataView.Schema, @$"D:\Best_Model.zip");

这是我的数据class

public class MyData
{
    [LoadColumn(0)]
    public string CategoricalFeature1 { get; set; } = string.Empty;

    [LoadColumn(1)]
    public Boolean Label { get; set; }
}

这是我的预测class

public class MyPrediction : MyData
{

    [ColumnName("PredictedLabel")]
    public bool Prediction { get; set; }

    public float Probability { get; set; }

    public float Score { get; set; }
}

我认为您需要使用 EstimatorChain 指定您的 CategoricalFeature1 列既是字符串又是分类列。这是因为在幕后,所有 ML 模型仅使用浮点向量。

尝试像这样添加 IEstimater:

var dataProcessPipeline = mlContext.Transforms.Conversion.OneHotEncoding(new[] { new InputOutputColumnPair("CategoricalFeature1","CategoricalFeature1")})

var crossValidationExperimentResult = experiment.Execute(dataView, numberOfCVFolds: 10, prefeaturizer: dataProcessPipeline);

这会将您的数据编码为分类数据并将其转换为浮点向量。

AutoML 有一种方法可以推断您的列。也许这会有所帮助。

ColumnInferenceResults columnInference = mlContext.Auto().InferColumns(TrainDataPath, LabelColumnName, groupColumns: false);

您可以在此处使用列推断找到完整示例 - https://github.com/dotnet/machinelearning-samples/tree/main/samples/csharp/getting-started/AdvancedExperiment_AutoML