XGBoost进行数据预测

import pandas as pd
import numpy as np
from xgboost import XGBRegressor
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error,r2_score
data = pd.read_csv('raw_wind_power_data.csv')
# 假设数据有一列叫 'wind_power' 表示风电数据
data['时间戳'] = pd.to_datetime(data['时间戳']) # 如果有日期列
data.set_index('时间戳', inplace=True)
# 添加滞后变量
for lag in range(1, 13): # 添加过去12个月的滞后变量
data[f'lag_{lag}'] = data['风速'].shift(lag)
####################################################################
# 其他特征工程,例如提取日期特征
data['month'] = data.index.month
data['day'] = data.index.dayofweek
data['风向_sin'] = np.sin(np.deg2rad(data['风速']))
data['风向_cos'] = np.cos(np.deg2rad(data['风速']))
# 创建移动窗口特征(例如移动平均风速)
data['风速_3小时平均'] = data['风速'].rolling(window=3).mean()

data['month'] = data.index.month
data['day'] = data.index.dayofweek
# 提取更多时间特征
data['weekday'] = data.index.weekday # 星期几,0=星期一,6=星期天
data['quarter'] = data.index.quarter # 季度
data['is_weekend'] = (data['weekday'] >= 5).astype(int) # 是否为周末

# 添加季节特征
def get_season(month):
if month in [12, 1, 2]:
return 'winter'
elif month in [3, 4, 5]:
return 'spring'
elif month in [6, 7, 8]:
return 'summer'
else:
return 'autumn'
data['season'] = data['month'].apply(get_season)
# 将季节特征转换为数值类型(独热编码)
data = pd.get_dummies(data, columns=['season'], drop_first=True)
####################################################################
# 填补缺失值(可以使用插值法、均值填充等方法)
data.fillna(method='ffill', inplace=True) # 前向填充
data.fillna(method='bfill', inplace=True) # 后向填充
# 处理异常值,假设风速>30 m/s 或 风速<0 m/s 视为异常
data = data[(data['风速'] >= 0) & (data['风速'] <= 30)]
# 定义特征和目标变量
X = data.drop('发电功率', axis=1) # 特征
y = data['发电功率'] # 目标变量
# 划分训练集和测试集(最后一年用于测试)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, shuffle=False)
# 初始化并训练 XGBoost 模型
model = XGBRegressor(objective='reg:squarederror')
model.fit(X_train, y_train)
# 进行预测
y_pred = model.predict(X_test)
# 评估模型性能
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)
print(f'Mean Squared Error: {mse}')
print(f'R² Score: {r2}')
import matplotlib.pyplot as plt
plt.figure(figsize=(12, 6))
plt.plot(y_test.index, y_test, label='Actual', color='blue')
plt.plot(y_test.index, y_pred, label='Predicted', color='orange')
plt.xlabel('date')
plt.ylabel('Wind Power')
plt.title('Wind Power Prediction')
plt.legend()
plt.show()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值