machine-learning - 找出每一列对模型的重要性
问题描述
我有一个 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}");
}
解决方案
我相信您正在寻找的是所谓的Permutation Feature Importance。这将通过单独更改每个功能,然后测量更改对模型性能指标的影响程度来告诉您哪些功能最重要。您可以使用它来查看哪些功能对模型最重要。
使用 Permutation Feature Importance 解释模型预测是描述如何在 ML.NET 中使用此 API 的文档。
推荐阅读
- maven - com.sun.proxy.$Proxy16 执行时出错
- wpf - 带有 CheckBox 的 WPF DataGrid 标头检查了 DataGrid 中的所有 CheckBox
- scala - Spark:Split 不是 org.apache.spark.sql.Row 的成员
- java - 如何修复 ClassNotFoundException:javax.servlet.http.HttpFilter
- asp.net - @model 到底是做什么的?
- java - 忽略在 Json 对象中传递的字段
- android - 即使连接到 cdma 网络,我也需要以编程方式获取我的 android 设备的 imei 号
- html - 仅使用 CSS,无限次循环播放 30 张图像,创建燃烧的火焰效果
- javascript - Vue-Form-Generator 模式对计算属性没有反应
- javascript - 如何将更改状态道具传递给组件?