和鲸社区AI实训季 风电功率预测

46 阅读2分钟

1. 赛题

构建风电功率预测模型,基 2018年1月1日某风机的实际运行数据,预测2020年3月30日风机输出功率。

2. 数据:

本数据集来自某风机的实际运行数据(已对风机坐标和型号进行脱敏处理),包含气温、风速和风向三个关键气象要素以及相应的时刻的风机输出功率,时间分辨率为10min。

训练集时间段为2018年1月1日2019年12月31日,共计67855个样本;
测试集时间段为2020年1月1日
2020年3月30日,共计10657个样本。

训练集(train.csv)字段:

  • Time:时刻
  • Temperatue:气温
  • WindDirection:风向
  • WindSpeed:风速
  • Power:功率

训练集(test.csv)字段:

  • ID:数据唯一标识
  • Time:时刻
  • Temperatue:气温
  • WindDirection:风向
  • WindSpeed:风速

为了提高预测精度,我们同时训练多个机器学习模型,并比较它们在验证集上的 RMSE 表现,最终选择最优模型进行预测。

3. 数据预处理

3.1 加载数据

从指定路径读取 train.csv 与 test.csv:

train_df = pd.read_csv('/home/mw/input/es_data1750/train.csv')
test_df = pd.read_csv('/home/mw/input/es_data1750/test.csv')

3.2 分类变量编码(Label Encoding)

数据中 division、package、salary 均为离散类别,模型不能直接处理,因此采用 LabelEncoder 进行数字化:

for col in ['division', 'package', 'salary']:
    train_df[col] = le.fit_transform(train_df[col])
    test_df[col] = le.transform(test_df[col])

说明:

  • fit_transform() 用于训练集
  • transform() 用于测试集(保持一致的编码映射)
  • 避免类别错位问题

4. 特征与目标变量

预测目标是 satisfaction_level

X_train = train_df.drop(columns=['satisfaction_level', 'ID'])
y_train = train_df['satisfaction_level']
X_test = test_df.drop(columns=['ID'])

删除 ID,因为它不包含任何训练价值。

采用 80% 训练、20% 验证:

X_tr, X_val, y_tr, y_val = train_test_split(
    X_train, y_train, test_size=0.2, random_state=42
)

设置 random_state=42 保证结果可复现。

5. 定义并训练多个模型

本项目使用的模型包括:

  • RandomForestRegressor
  • GradientBoostingRegressor
  • ExtraTreesRegressor
  • XGBoostRegressor
  • LightGBMRegressor

目的:
对比不同模型的预测能力,选择表现最佳的模型用于最终预测。

代码:

models = {
    "RandomForest": RandomForestRegressor(n_estimators=300, random_state=42),
    "GradientBoosting": GradientBoostingRegressor(random_state=42),
    "ExtraTrees": ExtraTreesRegressor(n_estimators=300, random_state=42),
    "XGBoost": xgb.XGBRegressor(objective='reg:linear', eval_metric='rmse', n_estimators=1000),
    "LightGBM": lgb.LGBMRegressor(num_leaves=31, learning_rate=0.05, n_estimators=500)
}

6. 模型性能比较(验证集 RMSE)

循环训练所有模型:

for name, model in models.items():
    model.fit(X_tr, y_tr)
    val_pred = model.predict(X_val)
    rmse = mean_squared_error(y_val, val_pred, squared=False)

使用 RMSE(均方根误差)作为评价指标,更直观体现预测误差大小。误差越小,模型越好。

将每个模型的 RMSE 保存起来:

rmse_scores[name] = rmse

7. 自动选择性能最优的模型

从所有模型中选出 RMSE 最小者

best_model_name = min(rmse_scores, key=rmse_scores.get)
best_model = models[best_model_name]

输出最优模型及对应 RMSE,这里测试的最佳模型为ExtraTrees。

8. 使用最优模型预测测试数据

在全部训练数据上重新训练最优模型:

best_model.fit(X_train, y_train)
test_predictions = best_model.predict(X_test)

将预测结果保存为 CSV:

result_df.to_csv('employee_satisfaction_predictions.csv', index=False)

最后得分为62.86175516094214。