Machine learning 找出每个列对模型的重要性

Machine learning 找出每个列对模型的重要性,machine-learning,ml.net,Machine Learning,Ml.net,我有一个ML.net项目,现在一切都很顺利。我有一个马达,在每次旋转时收集256次的功率读数,我把它推到一个模型中。现在它几乎完美地确定了马达的状态。马达本身一次只能容纳38个值,所以我花了几次旋转来收集完整的256个样本,用于我的训练数据 我想把样本量减少到38,这样每次旋转我都可以确定它的状态。如果我只是均匀地将样本间隔到38,我的模型会退化很多。我知道我不是在向模型提供它认为最重要的特性,而是在猜测并随机选择模型的数据 在培训过程中,我是否有办法了解数组中每个值的重要性?我在想我可以使用I

我有一个ML.net项目,现在一切都很顺利。我有一个马达,在每次旋转时收集256次的功率读数,我把它推到一个模型中。现在它几乎完美地确定了马达的状态。马达本身一次只能容纳38个值,所以我花了几次旋转来收集完整的256个样本,用于我的训练数据

我想把样本量减少到38,这样每次旋转我都可以确定它的状态。如果我只是均匀地将样本间隔到38,我的模型会退化很多。我知道我不是在向模型提供它认为最重要的特性,而是在猜测并随机选择模型的数据

在培训过程中,我是否有办法了解数组中每个值的重要性?我在想我可以使用IDataView来实现这一点,我发现了下面关于它的陈述()

标准ML模式:IDataView系统不定义或规定标准ML模式表示。例如,它不规定列的不同语义解释(如标签、特征、分数、权重等)的表示或区别。但是,可以使用列元数据支持以及约定来表示此类解释

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

事实上,我只在ML.net上工作了几个星期,所以如果这个问题太天真,我很抱歉,我向你保证,我已经用谷歌搜索了尽可能多的方法。如有任何建议,将不胜感激。提前谢谢

编辑:

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

第一次尝试时,它抛出了一个错误“预期为single但得到string”。没问题,我使用了.Append(mlContext.Transforms.Conversion.MapValueToKey(“Label”、“Label”))将其转换为键值,它抛出了预期的错误,即单个get 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}");
  }
//创建MLContext
MLContext MLContext=新的MLContext();
//加载数据
IDataView data=mlContext.data.LoadFromTextFile(序列数据文件路径,分隔符字符:',',哈希头:true);
// 1. 获取输入要素的列名。
字符串[]featureColumnNames=
数据模式
.Select(column=>column.Name)
.Where(columnName=>columnName!=“Label”).ToArray();
// 2. 用数据预处理步骤定义估计器
激励数据估计器=
mlContext.Transforms.Concatenate(“功能”,featureColumnNames)
.Append(mlContext.Transforms.normalize(“功能”))
.Append(mlContext.Transforms.Conversion.MapValueToKey(“标签”、“标签”));
// 3. 使用数据预处理估计器创建变压器
ITransformer dataPrepTransformer=dataPrepEstimator.Fit(数据)//这里出错
// 4. 对训练数据进行预处理
IDataView预处理TrainData=dataPrepTransformer.Transform(数据);
// 5. 定义随机双坐标上升机器学习估计器
var sdcaEstimator=mlContext.Regression.Trainers.Sdca();
// 6. 训练机器学习模型
var sdcaModel=sdcaEstimator.Fit(预处理数据);
不可变数组排列特性重要性=
mlContext
.回归
.排列特征重要性(sdcaModel,预处理的TrainData,排列计数:3);
//按重要性排序特征
var特征重要度量=
排列特征重要性
.Select((metric,index)=>new{index,metric.RSquared})
.OrderByDescending(myFeatures=>Math.Abs(myFeatures.RSquared.Mean));
Console.WriteLine(“功能\tPFI”);
foreach(featureImportanceMetrics中的var特征)
{
WriteLine($“{featureColumnNames[feature.index],-20}|\t{feature.RSquared.Mean:F6}”);
}

我相信你要找的东西叫做。这将通过单独更改每个特性来告诉您哪些特性最重要,然后测量这些更改对模型性能指标的影响程度。可以使用此选项查看哪些功能对模型最重要


是描述如何在ML.NET中使用此API的文档。

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


是描述如何在ML.NET中使用此API的文档。

您也可以使用一组开源软件包,它们比ML.NET中的软件包复杂得多。我在GitHub上有一个例子,说明如何使用R和高级解释程序包来解释ML.NET模型。您可以获取本地实例以及全局模型分解/详细信息/诊断/功能交互等


您还可以使用一组开源软件包,它们比ML.NET中的软件包复杂得多。我在GitHub上有一个例子,说明如何使用R和高级解释程序包来解释ML.NET模型。您可以获取本地实例以及全局模型分解/详细信息/诊断/功能交互等


如果您尝试获取功能重要性,而不考虑您使用的型号,请尝试
前向/后向功能选择
。如果您尝试获取特征重要性,而不考虑您使用的模型,那么请尝试
正向/反向fea