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
相关产品推荐
相关产品推荐

