首页 > 解决方案 > 找出每一列对模型的重要性

问题描述

我有一个 ML.net 项目,到目前为止一切都很好。我有一个电机,每转一圈收集 256 次功率读数,然后我将其推入模型中。现在它几乎完美地确定了电机的状态。电机本身一次只能容纳 38 个值,因此我已经花费了数次旋转来收集完整的 256 个样本作为我的训练数据。

我想将样本大小减少到 38,这样每次旋转我都可以确定它的状态。如果我只是将样本均匀分布到 38 个,我的模型会大幅下降。我知道我并没有为模型提供它认为最重要的特征,而只是进行猜测并为模型随机选择数据。

有没有办法在训练过程中看到数组中每个值的重要性?我在想我可以为此使用 IDataView 并且我找到了以下关于它的声明(链接)。

标准 ML 模式:IDataView 系统没有定义或规定标准 ML 模式表示。例如,它不规定表示或区分列的不同语义解释,例如标签、特征、分数、权重等。但是,列元数据支持与约定一起可用于表示此类解释。

这是否意味着我可以打印出每列的重量等内容,我将如何做到这一点?

实际上,我现在只与 ML.net 合作了几周,所以如果这个问题很幼稚,我深表歉意,我向你保证,我已经尽可能多地搜索了这个问题。任何意见,将不胜感激。提前致谢。

编辑:

谢谢你的回答,我走上了一条完全没用的路。我一直在尝试按照您链接到的示例使其正常工作。我有 260 列数字和一列条件作为五个文本字符串之一。这是我试图预测的情况。

我第一次尝试它时抛出了一个错误“期望单身但得到字符串”。没问题,我使用 .Append(mlContext.Transforms.Conversion.MapValueToKey("Label", "Label")) 转换为键值,它抛出了预期的错误 Single, got Key UInt32。关于如何将其推入此功能的任何想法?

无论如何,谢谢您的回复,但我想我的赞成票还不算数对不起。希望我以后可以投票,或者这里的其他人可以投票。下面是代码示例。

  //Create MLContext
  MLContext mlContext = new MLContext();

  //Load Data
  IDataView data = mlContext.Data.LoadFromTextFile<ModelInput>(TRAIN_DATA_FILEPATH, separatorChar: ',', hasHeader: true);

  // 1. Get the column name of input features.
  string[] featureColumnNames =
      data.Schema
          .Select(column => column.Name)
          .Where(columnName => columnName != "Label").ToArray();

  // 2. Define estimator with data pre-processing steps
  IEstimator<ITransformer> dataPrepEstimator =
      mlContext.Transforms.Concatenate("Features", featureColumnNames)
          .Append(mlContext.Transforms.NormalizeMinMax("Features"))
          .Append(mlContext.Transforms.Conversion.MapValueToKey("Label", "Label"));

  // 3. Create transformer using the data pre-processing estimator
  ITransformer dataPrepTransformer = dataPrepEstimator.Fit(data);//error here

  // 4. Pre-process the training data
  IDataView preprocessedTrainData = dataPrepTransformer.Transform(data);

  // 5. Define Stochastic Dual Coordinate Ascent machine learning estimator
  var sdcaEstimator = mlContext.Regression.Trainers.Sdca();

  // 6. Train machine learning model
  var sdcaModel = sdcaEstimator.Fit(preprocessedTrainData);

  ImmutableArray<RegressionMetricsStatistics> permutationFeatureImportance =
      mlContext
          .Regression
          .PermutationFeatureImportance(sdcaModel, preprocessedTrainData, permutationCount: 3);


  // Order features by importance
  var featureImportanceMetrics =
      permutationFeatureImportance
          .Select((metric, index) => new { index, metric.RSquared })
          .OrderByDescending(myFeatures => Math.Abs(myFeatures.RSquared.Mean));

  Console.WriteLine("Feature\tPFI");

  foreach (var feature in featureImportanceMetrics)
  {
    Console.WriteLine($"{featureColumnNames[feature.index],-20}|\t{feature.RSquared.Mean:F6}");
  }

标签: machine-learningml.net

解决方案


我相信您正在寻找的是所谓的Permutation Feature Importance。这将通过单独更改每个功能,然后测量更改对模型性能指标的影响程度来告诉您哪些功能最重要。您可以使用它来查看哪些功能对模型最重要。

使用 Permutation Feature Importance 解释模型预测是描述如何在 ML.NET 中使用此 API 的文档。


推荐阅读