学生考试成绩预测:从数据分析到Stacking集成模型实践
特征重要性:学生以往成绩、学习时长和出勤率是影响本次考试成绩的核心因素,睡眠时间影响相对较弱,为教学建议提供数据支撑(如重点关注学生基础水平和学习投入);模型选择:Stacking 集成模型在预测精度上优于单一基学习器,验证了集成学习在回归任务中的有效性;数据质量:数据集无缺失值、特征相关性合理,为模型性能提供了良好基础。
本篇文章将以学生考试成绩数据集为基础,完整展示从数据探索、特征分析到模型构建与评估的全过程,最终通过 Stacking
集成学习方法实现更优的成绩预测效果。
一、数据集来源
kaggle源地址:https://www.kaggle.com/datasets/emanfatima2025/student-academic-performance-trends
本次使用的student_exam_scores.csv数据集包含 200 名学生的相关信息,通过 Python 的 Pandas 库可快速获取数据概况。
数据集文件:我用夸克网盘分享了「学生成绩数据集」,链接:https://pan.quark.cn/s/084f77de801e
数据集许可类型:CC0:Public Domain(公共领域,可自由使用)https://creativecommons.org/publicdomain/zero/1.0/
1.1 数据加载与基础信息查看
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
# 设置中文字体显示,解决图表中文乱码问题
plt.rcParams['figure.dpi'] = 100 # 提高图表清晰度
plt.rcParams["font.family"] = ["SimHei"]
plt.rcParams['axes.unicode_minus'] = False # 解决负号显示问题
# 加载数据
df = pd.read_csv('student_exam_scores.csv')
# 查看数据集基本信息
print("数据集基本信息:")
print(df.info())
print("\n数据集前5行:")
print(df.head())
1.2 数据概况解读
从运行结果可知,数据集包含 6 个字段,共 200 条记录,无缺失值,数据质量良好:
- student_id:学生唯一标识(字符串类型),仅用于区分学生,不参与建模;
- hours_studied:学习时长(浮点型),可能反映学生的学习投入程度;
- sleep_hours:睡眠时间(浮点型),影响学生精力状态的重要因素;
- attendance_percent:出勤率(浮点型),体现学生课堂参与情况;
- previous_scores:以往成绩(整型),反映学生基础水平;
- exam_score:本次考试成绩(浮点型),即我们要预测的目标变量。
数据集前 5 行样本展示了不同学生的学习、生活及成绩情况,例如学生 S001 学习时长 8.0 小时、以往成绩 45 分,本次考试成绩 30.2 分;学生 S005 学习时长 9.1 小时、以往成绩 71 分,本次考试成绩 40.3 分,初步可见学习时长和以往成绩可能与本次考试成绩存在关联。
二、特征分析:挖掘影响成绩的关键因素
在建模前,需深入分析各特征与目标变量(考试成绩)的关系,以及特征之间的相关性,筛选有效特征并避免多重共线性问题。
2.1 特征与成绩的散点图分析
通过散点图结合回归线,直观观察单个特征与考试成绩的线性关系,代码如下:
# 选择待分析的特征
features = ['hours_studied', 'sleep_hours', 'attendance_percent', 'previous_scores']
# 创建2x2子图,分别展示各特征与考试成绩的关系
for i, feature in enumerate(features, 1):
plt.subplot(2, 2, i)
# 散点图展示实际数据分布
sns.scatterplot(x=df[feature], y=df['exam_score'], alpha=0.7)
# 红色回归线展示线性趋势
sns.regplot(x=df[feature], y=df['exam_score'], scatter=False, color='red')
plt.title(f'{feature} 与 exam_score 的关系')
plt.xlabel(feature)
plt.ylabel('考试成绩')
# 调整子图间距,避免重叠
plt.tight_layout()
plt.show()

图表解读:
-
学习时长(hours_studied):回归线呈明显上升趋势,说明学习时长越长,考试成绩整体越高,二者正相关关系显著;
-
睡眠时间(sleep_hours):回归线略有上升,但散点分布较分散,说明睡眠时间对成绩有一定正向影响,但影响程度较弱;
-
出勤率(attendance_percent):回归线上升趋势明显,出勤率高的学生成绩普遍更好,体现课堂参与的重要性;
-
以往成绩(previous_scores):回归线陡峭上升,散点集中在回归线附近,说明以往成绩与本次成绩关联性极强,是预测的核心特征。
2.2 特征间相关性热力图
通过热力图量化特征间的相关系数,进一步明确特征与成绩、特征与特征的关系:
plt.figure(figsize=(10, 8))
# 计算特征与目标变量的相关系数矩阵
correlation = df[features + ['exam_score']].corr()
# 绘制热力图,annot=True显示相关系数,cmap='coolwarm'用红蓝色区分正负相关
sns.heatmap(correlation, annot=True, cmap='coolwarm', fmt='.2f', linewidths=0.5)
plt.title('特征间相关性热力图')
plt.show()

热力图关键结论:
-
与考试成绩的相关性:以往成绩(0.92)> 学习时长(0.85)> 出勤率(0.78)> 睡眠时间(0.63),所有特征均与成绩正相关,且以往成绩和学习时长的相关性最高;
-
特征间相关性:各特征间相关系数均低于 0.8,无严重多重共线性问题,可全部用于后续建模。
三、模型构建:从基学习器到 Stacking 集成模型
基于上述分析,我们选择hours_studied、sleep_hours、attendance_percent、previous_scores作为特征,exam_score作为目标变量,构建回归模型。为提升预测精度,采用Stacking 集成学习方法,融合多个基学习器的优势。
3.1 数据准备与基学习器选择
首先划分训练集与测试集(8:2 比例),确保模型评估的客观性;然后选择决策树(DT)和支持向量机(SVR)作为基学习器,单独评估其性能:
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeRegressor
from sklearn.svm import SVR
from sklearn.metrics import mean_squared_error, r2_score
# 准备特征(X)和目标变量(y)
X = df[features]
y = df['exam_score']
# 划分训练集和测试集,random_state=42保证结果可复现
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 定义基学习器列表
base_models = [
('dt', DecisionTreeRegressor(max_depth=5, random_state=42)), # 决策树,限制深度避免过拟合
('svr', SVR(kernel='rbf', C=100, gamma=0.1)) # 径向基核函数的SVR,调参后提升性能
]
# 单独评估每个基学习器
print("\n基学习器单独评估结果:")
for name, model in base_models:
# 训练模型
model.fit(X_train, y_train)
# 测试集预测
y_pred = model.predict(X_test)
# 计算评估指标:均方误差(MSE)和决定系数(R²)
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)
print(f"\n{name}模型评估指标:")
print(f"均方误差(MSE):{mse:.2f}")
print(f"R² 分数:{r2:.2f}")
3.2 基学习器性能对比
运行结果显示,两个基学习器的性能差异明显:
- 决策树(DT):MSE=17.32,R²=0.67。R² 接近 0.7,说明模型能解释约 67% 的成绩变异,预测效果较好;
- 支持向量机(SVR):MSE=39.36,R²=0.26。MSE 远高于 DT,R² 仅 0.26,模型拟合效果较差,可能受数据分布或参数影响。
单独使用基学习器时,决策树表现更优,但仍有提升空间。Stacking 集成模型可通过元学习器融合多个基学习器的预测结果,进一步降低误差。
3.3 Stacking 集成模型构建与训练
Stacking 的核心思想是:先用基学习器对数据进行预测,将预测结果作为 “元特征”,再用元学习器(本文选择 Ridge 回归)对元特征进行训练,得到最终预测结果。代码如下:
from sklearn.ensemble import StackingRegressor
from sklearn.linear_model import Ridge
# 创建Stacking模型
stacking_model = StackingRegressor(
estimators=base_models, # 基学习器列表
final_estimator=Ridge(alpha=1.0), # 元学习器:Ridge回归(带L2正则化,避免过拟合)
cv=5 # 5折交叉验证生成元特征,提升元特征可靠性
)
# 训练Stacking模型
stacking_model.fit(X_train, y_train)
四、模型评估:Stacking 集成模型的优势验证
通过测试集评估 Stacking 模型的性能,并与基学习器对比,验证集成学习的优势。
4.1 评估指标计算
# Stacking模型测试集预测
y_pred_stacking = stacking_model.predict(X_test)
# 计算评估指标:MSE、RMSE(均方根误差,更易理解,单位与成绩一致)、R²
mse_stacking = mean_squared_error(y_test, y_pred_stacking)
rmse_stacking = np.sqrt(mse_stacking)
r2_stacking = r2_score(y_test, y_pred_stacking)
# 输出结果
print("\n基于Stacking的模型评估指标:")
print(f"均方误差(MSE):{mse_stacking:.2f}")
print(f"均方根误差(RMSE):{rmse_stacking:.2f}")
print(f"R² 分数:{r2_stacking:.2f}")
4.2 模型性能对比分析
| 模型 | MSE | RMSE | R² |
|---|---|---|---|
| 决策树(DT) | 17.32 | 4.16 | 0.67 |
| 支持向量机(SVR) | 39.36 | 6.27 | 0.26 |
| Stacking 集成模型 | 15.69 | 3.96 | 0.70 |
关键结论:
- 误差降低:Stacking 模型的 MSE(15.69)低于决策树(17.32)和 SVR(39.36),RMSE(3.96)同样最小,说明预测精度更高;
- 拟合能力提升:Stacking 的 R²(0.70)高于所有基学习器,能解释 70% 的成绩变异,模型拟合效果更好;
- 集成优势体现:即使部分基学习器(如 SVR)性能较差,Stacking 仍能通过元学习器筛选有效信息,融合基学习器优势,实现 “1+1>2” 的效果。
五、总结与展望
5.1 本次实践总结
- 特征重要性:学生以往成绩、学习时长和出勤率是影响本次考试成绩的核心因素,睡眠时间影响相对较弱,为教学建议提供数据支撑(如重点关注学生基础水平和学习投入);
- 模型选择:Stacking 集成模型在预测精度上优于单一基学习器,验证了集成学习在回归任务中的有效性;
- 数据质量:数据集无缺失值、特征相关性合理,为模型性能提供了良好基础。
5.2 后续优化方向
- 特征工程:可尝试构建新特征(如 “学习时长 / 睡眠时间” 比率),或对特征进行归一化 / 标准化,进一步提升模型性能;
- 基学习器扩展:加入随机森林、梯度提升树(如 XGBoost、LightGBM)等更强的基学习器,可能进一步优化 Stacking 效果;
- 参数调优:通过网格搜索(GridSearchCV)或随机搜索(RandomizedSearchCV)对基学习器和元学习器的参数进行更细致的调优;
- 业务落地:将模型部署为简单工具,输入学生的学习、出勤等信息,快速预测成绩,为教师制定个性化辅导方案提供参考。
更多推荐
所有评论(0)