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

Darts+LightGBM:无法获取原始列名进行特征重要性分析

解决Darts LightGBMModel特征重要性映射到原始列名的问题

要把LightGBM返回的通用column_x特征名映射回Darts TimeSeries的原始列名及滞后信息,核心是明确Darts构建模型输入特征的固定顺序,手动生成对应特征名称列表后替换通用名称即可。

特征顺序规则

Darts为LightGBMModel构建输入特征时,遵循以下顺序:

  • 目标变量滞后特征:按滞后步数从大到小排列(例如lags=12时,顺序为target_lag_12 → target_lag_11 → ... → target_lag_1)
  • 过去协变量滞后特征:按协变量传入顺序,每个协变量的滞后同样从大到小排列(例如单个过去协变量+lags_past_covariates=12时,顺序为rain (mm)_lag_12 → ... → rain (mm)_lag_1)
  • 未来协变量特征:按lags_future_covariates参数的顺序排列,每个协变量对应这些滞后值(例如lags_future_covariates=[0,1,2,3,4,5]时,顺序为T (degC)_lag_0 → ... → T (degC)_lag_5)

实现映射的代码示例

基于你的代码修改后,可直接得到带原始名称的特征重要性:

from darts.datasets import WeatherDataset
from darts.models import LightGBMModel

# 加载数据并准备变量
series = WeatherDataset().load()
target = series['p (mbar)'][:100]
past_cov = series['rain (mm)'][:100]
future_cov = series['T (degC)'][:106]

# 初始化并训练模型
model = LightGBMModel(
    lags=12,
    lags_past_covariates=12,
    lags_future_covariates=[0,1,2,3,4,5],
    output_chunk_length=6,
    verbose=-1
)
model.fit(target, past_covariates=past_cov, future_covariates=future_cov)

# --------------------------
# 核心:生成对应特征名称列表
# --------------------------
def generate_feature_names(target, past_covs, future_covs, model):
    feature_names = []
    
    # 添加目标变量的滞后特征名
    target_name = target.columns[0]
    for lag in reversed(range(1, model.lags + 1)):
        feature_names.append(f"{target_name}_lag_{lag}")
    
    # 添加过去协变量的滞后特征名
    if past_covs is not None:
        past_cov_names = past_covs.columns
        for cov_name in past_cov_names:
            for lag in reversed(range(1, model.lags_past_covariates + 1)):
                feature_names.append(f"{cov_name}_lag_{lag}")
    
    # 添加未来协变量的特征名
    if future_covs is not None:
        future_cov_names = future_covs.columns
        for cov_name in future_cov_names:
            for lag in model.lags_future_covariates:
                feature_names.append(f"{cov_name}_lag_{lag}")
    
    return feature_names

# 生成特征名称列表
feature_names = generate_feature_names(target, past_cov, future_cov, model)

# 提取并映射特征重要性
for i, estimator in enumerate(model.model.estimators_):
    print(f"目标序列{i} 重要性(Gain):")
    booster = estimator.booster_
    generic_names = booster.feature_name()
    importance = booster.feature_importance(importance_type='gain')
    
    # 映射为原始名称(通用列名顺序与自定义特征名列表完全对应)
    named_importance = dict(zip(feature_names, importance))
    
    # 按重要性排序输出(可选)
    sorted_importance = sorted(named_importance.items(), key=lambda x: x[1], reverse=True)
    for name, val in sorted_importance:
        print(f"  {name}: {val:.2f}")
    print("-"*50)

多未来协变量的处理(如日期属性)

如果添加多个未来协变量(比如编码后的星期几),只需确保传入future_covariates时是包含所有列的TimeSeries对象,生成特征名称的函数会自动遍历所有协变量列:

# 生成星期几编码的未来协变量
from darts.dataprocessing.transformers import DateTimeIndexTransformer

dt_transformer = DateTimeIndexTransformer(
    extract=["dayofweek"],
    one_hot_encode=["dayofweek"]
)
future_cov_with_dow = dt_transformer.fit_transform(future_cov)

# 重新训练模型
model = LightGBMModel(
    lags=12,
    lags_past_covariates=12,
    lags_future_covariates=[0],
    output_chunk_length=6,
    verbose=-1
)
model.fit(target, past_covariates=past_cov, future_covariates=future_cov_with_dow)

# 自动生成包含星期几编码的特征名称
feature_names = generate_feature_names(target, past_cov, future_cov_with_dow, model)

最终会得到类似T (degC)_lag_0、dayofweek_0_lag_0这类清晰的特征名称,直接对应原始数据的列和滞后信息。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 08:04:59