数据入口:学生考试表现影响因素数据集 - Heywhale.com
本数据集提供了关于影响学生考试成绩的多种因素的全面概述。数据集包含了有关学习习惯、出勤率、家长参与、资源获取等方面的信息。
数据说明
字段名 | 说明 |
---|---|
Hours_Studied | 每周学习的小时数 |
Attendance | 出勤率(上课出席的百分比) |
Parental_Involvement | 家长参与程度(低,中,高) |
Access_to_Resources | 教育资源的可用性(低,中,高) |
Extracurricular_Activities | 课外活动参与情况(是,否) |
Sleep_Hours | 每晚平均睡眠时间(小时) |
Previous_Scores | 之前考试的分数 |
Motivation_Level | 学生的动机水平(低,中,高) |
Internet_Access | 互联网接入情况(是,否) |
Tutoring_Sessions | 每月参加辅导课的次数 |
Family_Income | 家庭收入水平(低,中,高) |
Teacher_Quality | 教师质量(低,中,高) |
School_Type | 学校类型(公立,私立) |
Peer_Influence | 同伴对学业表现的影响(积极,中立,消极) |
Physical_Activity | 每周平均体育活动时间(小时) |
Learning_Disabilities | 学习障碍(是,否) |
Parental_Education_Level | 父母的最高学历(高中,本科,研究生) |
Distance_from_Home | 家到学校的距离(近,适中,远) |
Gender | 学生性别(男,女) |
Exam_Score | 期末考试成绩 |
在本文中将分析不同学习习惯、家长参与度、资源获取等对学生考试成绩的影响以及构建机器学习模型预测学生的考试成绩。
一:影响因素分析
import pandas as pd
file_path = 'StudentPerformanceFactors.csv'
df = pd.read_csv(file_path)
df.info()
了解到该数据含有较少的空缺值,可以进行删除:
df = df[(df!= 0).all(axis=1)]
我们的目标是分析这些因素对Exam_Score(考试成绩)的影响。为了进行这个分析,我们可以采用以下步骤:
让我们首先进行描述性统计分析。
descriptive_stats = df[['Hours_Studied', 'Attendance', 'Parental_Involvement', 'Access_to_Resources',
'Extracurricular_Activities', 'Sleep_Hours', 'Previous_Scores', 'Motivation_Level',
'Internet_Access', 'Tutoring_Sessions', 'Family_Income', 'Teacher_Quality',
'School_Type', 'Peer_Influence', 'Physical_Activity', 'Learning_Disabilities',
'Parental_Education_Level', 'Distance_from_Home', 'Gender', 'Exam_Score']].describe()
descriptive_stats
以下是对相关字段的描述性统计分析结果:
接下来,我们可以进行相关性分析,以查看这些变量与考试成绩之间的相关性。
correlation_matrix = df[['Hours_Studied', 'Attendance', 'Sleep_Hours', 'Previous_Scores',
'Tutoring_Sessions', 'Physical_Activity', 'Exam_Score']].corr()
correlation_matrix['Exam_Score']
以下是与考试成绩(Exam_Score)的相关性分析结果:
为了更直观地展示这些关系,我们可以创建一些图表来可视化这些关系。我们可以从最相关的变量开始,比如学习时间、出勤率和历史成绩。让我们为这些变量创建散点图。
import matplotlib.pyplot as plt
import seaborn as sns
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
plt.figure(figsize=(15, 10))
plt.subplot(2, 2, 1)
sns.scatterplot(x='Hours_Studied', y='Exam_Score', data=df)
plt.title('学习时间 vs 考试成绩')
plt.subplot(2, 2, 2)
sns.scatterplot(x='Attendance', y='Exam_Score', data=df)
plt.title('出勤率 vs 考试成绩')
plt.subplot(2, 2, 3)
sns.scatterplot(x='Previous_Scores', y='Exam_Score', data=df)
plt.title('历史成绩 vs 考试成绩')
plt.tight_layout()
plt.show()
从上面的散点图中,我们可以观察到以下关系:
二:学业表现预测
为了构建一个适合的机器学习模型来预测学生的考试成绩,我们可以遵循以下步骤:
1:数据预处理
随机森林(Random Forest)和梯度提升树(Gradient Boosting Tree)在一定程度上可以从数值变量的标准化中受益,但通常不是严格必需的。
X = df.drop('Exam_Score', axis=1)
y = df['Exam_Score']
categorical_cols = X.select_dtypes(include=['object', 'category']).columns
X_encoded = pd.get_dummies(X, columns=categorical_cols, drop_first=True)
scaler = StandardScaler()
X_numeric = X_encoded.select_dtypes(include=['int', 'float'])
X_scaled = scaler.fit_transform(X_numeric)
X_scaled_df = pd.DataFrame(X_scaled, columns=X_numeric.columns)
X_scaled_df
由于数据集包含分类特征,我们需要对这些特征进行编码,使其能够被机器学习模型所使用。通常,我们可以使用独热编码(One-Hot Encoding)或标签编码(Label Encoding)来处理分类特征。在这个例子中,我们将使用独热编码来处理所有的分类特征。且对数值特征进行标准化。
在对数值特征进行标准化以及对分类特征进行了独热编码之后,生成了一个新的特征矩阵 X_encoded
。现在我们可以继续进行特征工程和模型选择。
由于数据集的特征较多,我们可能需要进行特征选择来提高模型的性能。一种常见的方法是使用基于树模型的特征重要性来选择最重要的特征。在这里,我们可以使用随机森林作为基模型来进行特征选择。让我们使用随机森林模型来确定特征的重要性,并选择最重要的特征。
from sklearn.ensemble import RandomForestRegressor
from sklearn.feature_selection import SelectFromModel
rf = RandomForestRegressor(n_estimators=100, random_state=42)
rf.fit(X_encoded, y)
selector = SelectFromModel(rf, threshold='median')
X_selected = selector.transform(X_encoded)
selected_features = X_encoded.columns[selector.get_support()]
selected_features.tolist()
我们已经使用随机森林模型选择了以下最重要的特征:
现在我们可以使用这些特征来训练我们的集成学习模型。在这里,我们将使用随机森林和梯度提升树(Gradient Boosting Tree)两种集成学习方法,并比较它们的性能。
2:随机森林与梯度提升树
首先,我们将数据集分为训练集和测试集,然后分别在训练集上训练两个模型,并在测试集上评估它们的性能。
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
from sklearn.ensemble import GradientBoostingRegressor
import numpy as np
X_train, X_test, y_train, y_test = train_test_split(X_selected, y, test_size=0.2, random_state=42)
rf = RandomForestRegressor(n_estimators=100, random_state=42)
gbt = GradientBoostingRegressor(n_estimators=100, random_state=42)
rf.fit(X_train, y_train)
gbt.fit(X_train, y_train)
rf_pred = rf.predict(X_test)
gbt_pred = gbt.predict(X_test)
rf_mse = mean_squared_error(y_test, rf_pred)
gbt_mse = mean_squared_error(y_test, gbt_pred)
rf_mse, gbt_mse
我们已经训练了随机森林和梯度提升树模型,并在测试集上评估了它们的性能。以下是两个模型的均方误差(MSE):
从结果来看,梯度提升树模型的性能略优于随机森林模型。这意味着梯度提升树模型可能更好地捕捉了数据中的模式和关系。
3:交叉验证
from sklearn.model_selection import cross_val_score
rf_scores = cross_val_score(rf, X_selected, y, scoring='neg_mean_squared_error', cv=5)
gbt_scores = cross_val_score(gbt, X_selected, y, scoring='neg_mean_squared_error', cv=5)
rf_mse_cv = -rf_scores.mean()
gbt_mse_cv = -gbt_scores.mean()
rf_mse_cv, gbt_mse_cv
分别求出随机森林与梯度提升树的交叉验证cv值分别约为6.41和5.52。
这段代码使用了Python的scikit-learn库来进行机器学习模型的交叉验证评分:
from sklearn.model_selection import cross_val_score
这里导入了cross_val_score
函数,它用于执行交叉验证并计算模型的性能指标。
随机森林模型的交叉验证:
rf_scores = cross_val_score(rf, X_selected, y, scoring='neg_mean_squared_error', cv=5)
梯度提升树模型的交叉验证:
gbt_scores = cross_val_score(gbt, X_selected, y, scoring='neg_mean_squared_error', cv=5)
计算交叉验证的平均MSE
rf_mse_cv = -rf_scores.mean()
gbt_mse_cv = -gbt_scores.mean()
rf_mse_cv, gbt_mse_cv
总结来说,这段代码的主要目的是通过5折交叉验证来评估随机森林和梯度提升树模型的性能,并比较它们在给定数据集上的均方误差。这种方法可以帮助我们了解模型在未知数据上的泛化能力。
在交叉验证中,cv
值(交叉验证折数)的大小可以说明以下几个方面:
4:集成学习
接下来,我们将选择堆叠(Stacking)作为集成策略。堆叠是一种分层模型集成技术,它首先使用多个不同的模型进行预测,然后使用另一个模型来学习如何最好地结合这些预测。
from sklearn.ensemble import StackingRegressor
from sklearn.linear_model import LinearRegression
stacking_regressor = StackingRegressor(estimators=[
('rf', rf),
('gbt', gbt)
], final_estimator=LinearRegression())
stacking_regressor.fit(X_train, y_train)
stacking_pred = stacking_regressor.predict(X_test)
stacking_mse = mean_squared_error(y_test, stacking_pred)
stacking_mse
得出均方误差(MSE)约为6.39。可以看出不一定集成学习比某单个模型的效果更好,但一般情况下集成学习比单个模型的预测效果较好。
想要探索多元化的数据分析视角,可以关注之前发布的内容。