datawhale AI夏令营

进阶上分方向学习笔记

1. 引言

目标是通过各种数据分析和机器学习方法,在电力现货市场价格预测竞赛中取得优异成绩。本文将讨论时间序列挖掘这一关键方向

2. 时间序列挖掘

时间序列挖掘是电力现货市场价格预测的基础。在这一部分,我将详细介绍如何进行特征工程、数据处理和模型训练,并提供一些策略优化的方法。

2.1 特征工程

特征工程是数据预处理过程的一部分,涉及从原始数据中提取和创建新特征,以提高机器学习模型的性能。以下是常见的时间序列特征及其构造方法:

  • 时间戳特征:包括年、月、日、小时、分钟等,这些特征可以反映出数据的时间依赖性。例如:

    df['year'] = df['timestamp'].dt.year
    df['month'] = df['timestamp'].dt.month
    df['day'] = df['timestamp'].dt.day
    df['hour'] = df['timestamp'].dt.hour
    
  • 历史信息特征:如过去n期同日期的均值、标准差,可以捕捉时间序列的长期趋势。例如:

    df['mean_7'] = df['load'].rolling(window=7).mean()
    df['std_7'] = df['load'].rolling(window=7).std()
    
  • 滞后特征:将数据平移n期,如平移7期,帮助模型捕捉短期趋势。例如:

    df['lag_1'] = df['load'].shift(1)
    df['lag_7'] = df['load'].shift(7)
    
  • 滑窗特征:计算历史7天、14天等的均值、标准差、最大值、最小值等,用于捕捉滑动窗口内的变化趋势。例如:

    df['rolling_mean_14'] = df['load'].rolling(window=14).mean()
    df['rolling_max_14'] = df['load'].rolling(window=14).max()
    
  • 周期特征:将年、月、日等时间特征转为正余弦函数,帮助模型捕捉周期性模式。例如:

    df['dayofweek_sin'] = np.sin(2 * np.pi * df['timestamp'].dt.dayofweek / 7)
    df['dayofweek_cos'] = np.cos(2 * np.pi * df['timestamp'].dt.dayofweek / 7)
    
  • 异常值特征:利用3标准差原则发现总负荷的异常值,通过特征工程捕捉异常值对预测的影响。例如:

    df['is_anomaly'] = (df['load'] > df['load'].mean() + 3 * df['load'].std()) | (df['load'] < df['load'].mean() - 3 * df['load'].std())
    
  • 节假日特征与外部数据:如节假日和天气数据,这些外部因素可能会对电力负荷产生显著影响。例如:

    holidays = [...]  # 节假日列表
    df['is_holiday'] = df['timestamp'].isin(holidays)
    
2.2 数据处理与模型训练

在特征工程完成后,进行以下步骤:

  • 数据读取和预处理:包括缺失值处理、数据平滑等,确保数据完整性和一致性。

    df.fillna(method='ffill', inplace=True)
    df.dropna(inplace=True)
    
  • 特征提取和构造:利用上述特征工程方法构造新的特征,确保特征能够充分反映数据的时间依赖性和周期性。

  • 模型选择和训练:使用线性回归和LightGBM作为Baseline模型,分别训练。

    from sklearn.linear_model import LinearRegression
    from lightgbm import LGBMRegressor
    
    # 训练线性回归模型
    lr = LinearRegression()
    lr.fit(X_train, y_train)
    y_pred_lr = lr.predict(X_test)
    
    # 训练LightGBM模型
    lgb = LGBMRegressor()
    lgb.fit(X_train, y_train)
    y_pred_lgb = lgb.predict(X_test)
    
  • 模型预测和融合:分别用模型进行预测,并将预测结果进行融合。

    y_pred_ensemble = 0.5 * y_pred_lr + 0.5 * y_pred_lgb
    
2.3 策略优化

通过不断优化特征工程、模型选择和融合策略,可以进一步提高预测精度。以下是一些策略优化的方法:

  • 特征选择和重要性分析:通过特征选择算法(如递归特征消除、随机森林特征重要性等)识别和选择重要特征。

    from sklearn.feature_selection import RFE
    selector = RFE(lr, n_features_to_select=10, step=1)
    selector = selector.fit(X_train, y_train)
    important_features = selector.support_
    
  • 模型调参:使用网格搜索(GridSearchCV)或随机搜索(RandomizedSearchCV)优化模型参数。

    from sklearn.model_selection import GridSearchCV
    
    param_grid = {
        'n_estimators': [100, 200, 300],
        'max_depth': [3, 5, 7],
        'learning_rate': [0.01, 0.05, 0.1]
    }
    grid_search = GridSearchCV(estimator=lgb, param_grid=param_grid, cv=5, scoring='neg_mean_squared_error')
    grid_search.fit(X_train, y_train)
    best_params = grid_search.best_params_
    
  • 交叉验证和模型评估:使用交叉验证评估模型性能,防止过拟合。

    from sklearn.model_selection import cross_val_score
    
    scores = cross_val_score(lr, X_train, y_train, cv=5, scoring='neg_mean_squared_error')
    mean_score = scores.mean()
    
  • 时间序列分割策略:根据时间序列的特性,选择合适的训练和测试集分割策略,确保模型的泛化能力。

    from sklearn.model_selection import TimeSeriesSplit
    
    tscv = TimeSeriesSplit(n_splits=5)
    for train_index, test_index in tscv.split(X):
        X_train, X_test = X[train_index], X[test_index]
        y_train, y_test = y[train_index], y[test_index]
    
  • 数据增强和平滑:通过数据增强技术(如时间序列数据的平滑、插值等)提高数据质量和模型稳定性。

    df['load_smoothed'] = df['load'].rolling(window=3).mean()
    

3. 总结

通过上述方法和步骤,可以更好地进行电力现货市场价格预测,并在比赛中获得更高的分数。


我的改进方案

探讨模型融合的最优比例,从原始数据集中分层抽样出一个分布与训练集大致相同的验证集,在上面进行损失函数计算以及模型融合参数 h h h的优化,提交后分数从11302.0459上涨到10845.9262


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值