You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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训练器原生支持指定样本权重,无需重复行或滑动窗口。具体步骤如下:

  1. 更新数据模型类
    在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;
}
  1. 修改训练器配置
    初始化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);
  1. 效果说明
    模型训练时会自动根据每行的weight值调整样本重要性:权重越高的样本,在损失计算中的占比越大,FastTree会优先优化这些样本的预测误差,从而实现近期数据(高权重)被更重视的效果。

内容的提问来源于stack exchange,提问作者Andreas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 15:23:20