如何在ML.NET中为FastTree等训练算法赋予表格近期数据更高权重
ML.NET 为近期数据赋予更高权重的实现方案
我想在ML.NET中让FastTree或FastForest这类训练算法更重视近期数据,数据表每行包含日期,希望给近期数据赋予更高权重。目前已知两种实现方法但不想用:
- 重复数据行(会增加训练时长)
- 滑动窗口(训练随时间递进的数据集子集)
请问是否可以直接为表格每行赋予实际权重?以下是示例代码和数据文件,权重值1-10代表近期数据权重更高的需求。
原示例数据文件(注:文件名应为
datafile.csv)Date,weight,feature1,feature2 06/30/2023,1,50,42 07/03/2023,2,52,45 07/05/2023,3,50,47 07/06/2023,4,54,43 07/07/2023,5,55,49 07/10/2023,6,57,44 07/11/2023,7,53,47 07/12/2023,8,52,45 07/13/2023,9,57,44 07/14/2023,10,53,42
可以直接通过样本权重列实现,FastTree/FastForest训练器原生支持指定样本权重,无需重复行或滑动窗口。具体步骤如下:
- 更新数据模型类
在Input类中添加对应权重列的字段,确保加载列索引与CSV对应:
public class Input { [LoadColumn(0)] public string Date; // 若不需要将日期作为特征,可保留或移除 [LoadColumn(1)] public float weight; [LoadColumn(2)] public float feature1; [LoadColumn(3)] public float feature2; }
- 修改训练器配置
初始化FastTree训练器时,通过SampleWeightColumnName参数指定权重列:
var context = new MLContext(seed: 0); // 加载数据 var data = context.Data.LoadFromTextFile<Input>("C:/datafile.csv", hasHeader: true, separatorChar: ','); var trainTestData = context.Data.TrainTestSplit(data, testFraction: 0.2, seed: 0); var trainData = trainTestData.TrainSet; var testData = trainTestData.TestSet; // 定义预处理与训练管道 var pipeline = mlContext.Transforms.Concatenate("Features", "feature1", "feature2") .Append(mlContext.Transforms.Conversion.ConvertType("Features", "Features", DataKind.Single)) .Append(mlContext.Transforms.NormalizeMinMax("Features")) // 指定权重列,让模型优先重视高权重样本 .Append(mlContext.Regression.Trainers.FastTree( sampleWeightColumnName: "weight")); var model = pipeline.Fit(trainData);
- 效果说明
模型训练时会自动根据每行的weight值调整样本重要性:权重越高的样本,在损失计算中的占比越大,FastTree会优先优化这些样本的预测误差,从而实现近期数据(高权重)被更重视的效果。
内容的提问来源于stack exchange,提问作者Andreas
相关产品推荐
相关产品推荐

