进阶上分方向学习笔记
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