
针对学生行为数据,采用3个月滚动窗口聚合特征(如课程完成率、作业提交率等均值),构建XGBoost分类模型预测未来1-3个月辍学概率,通过AUC、F1及业务指标(如干预后辍学率降低)评估模型,确保模型既捕捉长期行为趋势又适应实时行为变化。
辍学预测属于二分类问题(目标变量为“是否辍学”,1=辍学,0=未辍学),核心是通过机器学习模型识别高辍学风险学生。
scale_pos_weight参数),避免模型倾向于预测“不辍学”。StandardScaler)确保量纲一致。| 模型类型 | 定义 | 特性 | 使用场景 | 注意点 |
|---|---|---|---|---|
| XGBoost(3个月滚动窗口聚合) | 集成学习,梯度提升树,结合时间序列聚合特征 | 非线性,正则化防止过拟合,能输出特征重要性,支持时间序列特征 | 高辍学风险预测,行为数据为主 | 需调参(学习率、树深度),处理数据不平衡(如SMOTE) |
| LightGBM(3个月滚动窗口聚合) | 集成学习,基于直方图的梯度提升 | 非线性,计算效率高,适合大数据 | 高维数据,样本量大 | 需验证特征重要性,处理不平衡时需调整参数(如is_unbalance=True) |
| 逻辑回归 | 线性分类模型 | 线性关系,计算简单,可解释性强 | 数据线性可分,样本量小 | 对非线性关系敏感,无法捕捉行为数据中的复杂关联 |
| 时间序列模型(如ARIMA) | 预测时间序列趋势 | 适合时间序列数据,但需大量历史数据 | 长期趋势预测,但行为数据为主时效果有限 | 需处理季节性、趋势,计算复杂 |
import pandas as pd
from sklearn.model_selection import train_test_split
from imblearn.over_sampling import SMOTE
from sklearn.preprocessing import StandardScaler
from xgboost import XGBClassifier
from sklearn.metrics import roc_auc_score, classification_report
# 1. 数据预处理:3个月滚动窗口聚合
data = pd.read_csv('student_behavior.csv')
data['时间戳'] = pd.to_datetime(data['时间戳'])
data['最近3个月行为'] = data.groupby('学生ID')['时间戳'].transform(lambda x: (x >= (x.max() - pd.Timedelta(days=90))).astype(int))
features = ['课程完成率', '作业提交率', '在线时长', '互动次数']
data['课程完成率_均值'] = data.groupby('学生ID')['课程完成率'].transform(lambda x: x.rolling(window=90, min_periods=1).mean())
data['作业提交率_均值'] = data.groupby('学生ID')['作业提交率'].transform(lambda x: x.rolling(window=90, min_periods=1).mean())
data['在线时长_均值'] = data.groupby('学生ID')['在线时长'].transform(lambda x: x.rolling(window=90, min_periods=1).mean())
data['互动次数_均值'] = data.groupby('学生ID')['互动次数'].transform(lambda x: x.rolling(window=90, min_periods=1).mean())
X = data[['课程完成率_均值', '作业提交率_均值', '在线时长_均值', '互动次数_均值']]
y = data['辍学标签']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, stratify=y)
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)
smote = SMOTE(random_state=42)
X_train_res, y_train_res = smote.fit_resample(X_train_scaled, y_train)
model = XGBClassifier(
objective='binary:logistic',
eval_metric='auc',
n_estimators=100,
max_depth=5,
learning_rate=0.1,
random_state=42,
scale_pos_weight=(1 - y_train_res.mean()) / y_train_res.mean()
)
model.fit(X_train_res, y_train_res)
y_pred_proba = model.predict_proba(X_test_scaled)[:, 1]
auc = roc_auc_score(y_test, y_pred_proba)
print(f'AUC值: {auc:.4f}')
print(classification_report(y_test, model.predict(X_test_scaled)))
# 2. 模型增量更新(每月用新数据训练)
def update_model(new_data):
new_data['课程完成率_均值'] = new_data.groupby('学生ID')['课程完成率'].transform(lambda x: x.rolling(window=90, min_periods=1).mean())
X_new = new_data[['课程完成率_均值', '作业提交率_均值', '在线时长_均值', '互动次数_均值']]
y_new = new_data['辍学标签']
X_new_scaled = scaler.transform(X_new)
smote = SMOTE(random_state=42)
X_new_res, y_new_res = smote.fit_resample(X_new_scaled, y_new)
model.fit(X_new_res, y_new_res)
return model
“面试官您好,针对学生行为数据预测未来1-3个月辍学概率,我的思路是:首先,采用3个月滚动窗口聚合行为数据(比如课程完成率、作业提交率的均值),因为预测期是1-3个月,用3个月的历史行为能更全面反映学生长期学习状态;然后,用XGBoost模型,因为它能处理非线性关系,还能输出特征重要性,帮助我们找到关键风险信号;接着,处理数据不平衡,比如用SMOTE过采样,确保模型对辍学学生(少数类)的识别能力;最后,用AUC和F1值评估,同时加入业务指标,比如模型预测的高风险学生中实际辍学率,验证模型对业务的价值。比如,课程完成率均值低于60%、作业提交率低于70%的学生,模型会预测其辍学概率较高,这样辅导员就能提前干预,比如一对一沟通,提供学习支持,降低辍学率。”