1. 赛题
构建风电功率预测模型,基 2018年1月1日某风机的实际运行数据,预测2020年3月30日风机输出功率。
2. 数据:
本数据集来自某风机的实际运行数据(已对风机坐标和型号进行脱敏处理),包含气温、风速和风向三个关键气象要素以及相应的时刻的风机输出功率,时间分辨率为10min。
训练集时间段为2018年1月1日2019年12月31日,共计67855个样本;2020年3月30日,共计10657个样本。
测试集时间段为2020年1月1日
训练集(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。