☰
基于LSTM与熵权模糊综合评价的教学质量量化建模方案
2026/10/28 2:07:34 网站建设 项目流程

简介:这份资源是2022年江苏省研究生数学建模科研创新实践大赛B题的完整赛题文档,面向备战研究生数学建模竞赛的高校学生与指导教师,聚焦高校课堂教学质量数据的量化分析问题。赛题围绕专家评语量化、课程分类、教学团队授课质量排序、专家评价客观性与专业性、三年教学质量变化趋势等任务展开,涉及LSTM二分类模型、文本相似度计算、K-means++聚类、熵权法与模糊综合评价、灰色模型等建模方法,可作为跨学科建模思路与论文写作的参考范本。资源包共1个PDF文件,大小约1.12MB,内容包含题目背景、问题重述、模型构建与求解过程及结果分析,结构完整便于对照研读。目前已有1501人学习下载,适合需要系统了解赛题解法、积累建模案例与查漏补缺的参赛者。

1. 从一份“评语表格”说起:这套方案到底要解决什么

带过建模竞赛的人都有一个共识:真正拉开差距的,往往不是模型有多花哨,而是你能不能把一堆“没法算”的东西变成“能算”的东西。2022年江苏省研究生数学建模B题就是典型——附件里给的是高校课堂教学质量数据,核心字段是专家评语、教师教学综合评价、学生学习综合评价,全是文本和等级,没有现成的分数。你要做的,是把这些非结构化信息量化,再回答“课程有没有差异、团队怎么排序、专家靠不靠谱、三年质量怎么变”这一串问题。

这套方案适合两类人:正在做数学建模毕设或课程设计、需要一套完整建模流程参考的学生;以及要交付教学质量评价方案、需要可复现技术路线的从业者。它覆盖了从文本分类、文本相似度量化,到聚类检验、熵权模糊综合评价、灰色预测的完整链路,每一环都有明确的输入输出,不是纸上谈兵。

2. 需求拆解与技术选型:五个问题对应五套模型

2.1 把五个问题翻译成可执行的技术任务

原题给了五个问题,但直接照着问题写代码会卡住,因为问题描述是业务语言,不是技术语言。我一般会先做一次“翻译”:

问题业务诉求技术任务选型
问题一评语转成分数课程二分类 + 文本相似度量化LSTM + text2vec
问题二课程有没有差异、团队排序聚类检验 + 模糊综合评价Kmeans++ + 熵权法
问题三专家专不专业、客不客观评语规范性量化 + 评分偏离度相似度 + 差异度量
问题四三年质量怎么变时间序列趋势分析灰色模型 + 线性拟合
问题五还能挖出什么相关性统计与归因统计分析

这张表是整个方案的地基。很多队伍翻车就翻在这里——问题一还没搞清楚“课程类型未知”这个坑,就直接上模型,结果评语量化全错。注意,问题一其实藏了两个子任务:先判断课程是理论课还是实践课,再按对应评分标准量化评语。评分标准表分两套,权重不同,用错了整套分数都偏。

2.2 为什么是 LSTM 而不是别的分类器

课程类型二分类,本质是中文短文本分类。可选方案有朴素贝叶斯、SVM、TextCNN、LSTM。原方案对比了 LinearRegression、SVC 和 LSTM,验证集上 F1 分别是 0.543、0.683、0.750,LSTM 胜出。原因不玄学:评语里“实验、操作、仪器”这类词的出现位置和上下文有关,LSTM 的门控结构能记住序列中隔得较远的线索,而词袋类方法会丢掉顺序信息。

但要注意,LSTM 能赢的前提是你有足够的标注数据。原方案用关键词规则打了 1712 条标签(247 条实践课、1465 条理论课),按 9:1 划分训练验证。如果你的数据量只有几百条,SVM 加 TF-IDF 反而更稳,别硬上深度模型。

2.3 文本相似度为什么选 text2vec 而不是编辑距离

评语量化要和评分标准表逐条比对语义,编辑距离只看字符重叠,“教学态度端正”和“教学认真负责”字符几乎不重合,但语义接近。text2vec 的做法是取词向量平均得到句向量,再算余弦相似度,对同义表达更鲁棒。这是整个量化链路的核心算子,后面问题三的专家专业性评价也复用它,所以这一环的准确性直接决定后面几问的可信度。

3. 问题一落地:课程分类与评语量化的完整实现

3.1 关键词打标签与数据集构建

原始数据没有课程类型字段,得自己造标签。做法是用 jieba 分词后统计词频,含“设备、示范、实验、操作、仪器”的判为实践课,含“板书、直播、课件”的判为理论课。这一步是启发式规则,不追求百分百准,目的是给监督模型提供种子样本。

import jieba import pandas as pd # 读取评语数据,I 列为专家评语 df = pd.read_excel("teaching_eval.xlsx") practice_kw = {"设备", "示范", "实验", "操作", "仪器"} theory_kw = {"板书", "直播", "课件"} def label_course(text): words = set(jieba.cut(str(text))) if words & practice_kw: return 1 # 实践课 if words & theory_kw: return 0 # 理论课 return -1 # 未标注 df["label"] = df["I"].apply(label_course) labeled = df[df["label"] != -1] print(labeled["label"].value_counts())

这段代码的关键在label_course的优先级:先判实践课再判理论课,因为实践课关键词更具体,误判率低。跑完你会得到约 1712 条有标签样本,剩下 4180 条待预测。参数上,jieba.cut默认精确模式即可,不需要加载自定义词典,因为这里的词都是通用词。

3.2 LSTM 分类模型的关键参数

模型结构不复杂:Embedding 层把词映射成向量,LSTM 层提取序列特征,全连接层输出二分类概率。真正影响效果的是几个参数:序列最大长度取 128(评语普遍不长,取太长 padding 会稀释信号)、Embedding 维度 100、LSTM 隐藏单元 64、dropout 0.3 防过拟合、学习率 1e-3 配 Adam。

from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Embedding, LSTM, Dense, Dropout from tensorflow.keras.preprocessing.sequence import pad_sequences MAX_LEN = 128 VOCAB_SIZE = 5000 model = Sequential([ Embedding(VOCAB_SIZE, 100, input_length=MAX_LEN), LSTM(64, dropout=0.3, recurrent_dropout=0.3), Dense(1, activation="sigmoid") ]) model.compile(loss="binary_crossentropy", optimizer="adam", metrics=["accuracy"]) model.fit(pad_sequences(X_train, maxlen=MAX_LEN), y_train, validation_data=(pad_sequences(X_val, maxlen=MAX_LEN), y_val), epochs=10, batch_size=32)

训练完在验证集上看 Precision、Recall、F1 三个指标,别只看 accuracy——理论课样本远多于实践课,类别不平衡时 accuracy 会骗人。原方案 LSTM 的 F1 是 0.750,比 SVC 的 0.683 高,但差距不算大,说明如果你的算力有限,SVC 加 TF-IDF 也能交差,只是答辩时说服力弱一点。

3.3 评语量化的相似度映射函数

量化模型的核心是把“评语小句与评分标准条目的相似度”映射成分数。原方案用了一个分段函数:相似度 ≥0.7 记满分 1,0.4 到 0.7 之间线性映射到 0 到 1,低于 0.4 记 0。这个设计的意思是:语义高度接近的直接给分,模棱两可的按比例给,明显不相关的直接砍掉,避免噪声拉高总分。

def map_similarity(sim): if sim >= 0.7: return 1.0 elif sim >= 0.4: return (sim - 0.4) / 0.3 else: return 0.0 def quantify_comment(comment, standard_items, weights): # standard_items: 评分标准各条目的文本列表 # weights: 对应条目权重,理论课为 [0.2,0.3,0.3,0.2] total = 0.0 for sent in split_sentences(comment): # 按句切分 best = max(sim(sent, item) for item in standard_items) total += map_similarity(best) * weights[standard_items.index(...)] return total

这里有个容易忽略的细节:评语要先去掉“建议”部分再量化。原方案假设建议部分是教师欠缺的,不属于评价得分,如果混进去会把分数拉低。切句用标点正则即可,不用上复杂的分句模型。

4. 问题二落地:聚类检验与模糊综合评价排序

4.1 数据模糊化与 Kmeans++ 聚类

问题二要判断课程间有没有差异。直接拿原始分数聚类不行,因为专家严苛程度不同,同一门课不同专家打分方差很大。原方案先做模糊化:把评语量化值按区间映射到 95、85、75、60 四个等级,相当于给分数“降噪”。然后构造三维向量(教师教学、专家评语、学生学习),标准化后用 Kmeans++ 聚成两类。

Kmeans++ 相比普通 Kmeans 的改进只在初始质心选择:先随机选一个中心,之后每个新中心按“距离已有中心越远、被选中概率越大”的规则挑,避免初始点扎堆导致局部最优。代码上 sklearn 直接调KMeans(n_clusters=2, init="k-means++")就行,不用手写。

聚类效果用三个指标验收:紧密性 CP=1.686、轮廓系数 0.602、邓恩系数 0.443。轮廓系数超过 0.5 说明类间分离度可以接受。差异判断的逻辑是看每门课落在“优秀类”的比例,比如课程 0072 优秀率 70.45%,课程 0345 只有 16.21%,差距悬殊,结论就成立。

4.2 熵权法定权重

七个团队排序需要综合三个指标,权重不能拍脑袋。熵权法的逻辑是:某指标在各样本间差异越大,说明它携带的区分信息越多,权重应该越高。计算步骤是标准化、算信息熵、按熵值反比定权。

import numpy as np def entropy_weight(X): # X: n 个样本 × m 个指标,已正向化 P = X / X.sum(axis=0) # 比重矩阵 n = X.shape[0] h = -np.sum(P * np.log(P + 1e-12), axis=0) / np.log(n) # 信息熵 w = (1 - h) / (1 - h).sum() # 权重 return w

原方案算出的三个权重是 0.2381、0.2464、0.5154,专家评语权重最高,符合直觉——评语是专家对课堂的直接判断,信息量最大。注意1e-12是防止 log(0) 的后悔药,别省。

4.3 模糊综合评价与二级评判排序

有了权重,用频率法构造模糊关系矩阵:统计每个团队在各等级(优秀、良好、一般、合格)上的隶属频率,再和权重做模糊合成,得到综合评价向量。排序规则是二级评判——先比等级,等级高的排前面;等级相同再比隶属度。

团队优秀良好一般合格
课程00970.57630.40880.00740.0000
课程01380.49560.47760.01190.0129
课程00580.31870.59660.04940.0315

按最大隶属度定等级,课程0097 优秀隶属度最高排第一,课程0138 次之。这个排序结果在答辩时最好配上聚类散点图一起展示,评委一眼能看出类间边界。

5. 问题三到问题五:专家评价、趋势分析与归因

5.1 专家专业性与客观性的双维度量化

专家专业性看评语规范性,本质还是文本相似度,但要做长度惩罚——评语越长,累积相似度天然越高,不惩罚的话“话多的专家”永远得分高。原方案用sim / log(|S|+1)修正,这个处理很关键,属于血泪经验:不做惩罚,模型会奖励啰嗦。

客观性分两块。评分客观性算专家对同一门课的评分与其他专家均值的平均偏离,偏离越小越客观;职称客观性先验证不同职称群体本身得分有差异(正高 88.27 分、初职 84.57 分),确认这是真实差异而非专家偏见,再简化认为所有专家都具备职称客观性。综合评分用Score = α·专业性 + (1-α)·客观性,α 取 0.5 时专家002 综合最高。

5.2 灰色模型与线性拟合看趋势

问题四分析三年质量变化。年份维度样本少(只有三年),用灰色 GM(1,1) 预测趋势,结论是整体下降、2020 年降幅大;月份维度样本多,用线性模型拟合,发现下降且带周期性。这里要注意:灰色模型适合小样本贫信息,但预测值只能看趋势不能当精确值用,答辩时别把预测数字说得太死。

5.3 问题五的归因逻辑

问题五要挖有用结论,原方案从师资结构切入:课程量增速高于教师人数增速,人均授课数上升;正高教师占比从 8% 降到 4%,初职从 6% 涨到近 14%。骨干减少加新人大量引进,解释了质量下降。这条归因链的说服力在于数据支撑,不是拍脑袋,做课设时这一问最容易写成空话,务必用统计表说话。

6. 避坑与验收:答辩前必须走一遍的检查清单

6.1 四个最容易翻车的点

现象:评语量化分数普遍偏高,区分度差。原因:相似度映射函数阈值设太松,或者没去掉建议部分。解决:把 0.7 阈值上调到 0.75 试一次,对比分数分布;确认切句时过滤了“建议、希望”开头的句子。

现象:聚类两类样本数极度不均衡,一类只有几门课。原因:模糊化区间划分不合理,或标准化没做。解决:检查模糊化边界(60/67.5/86.5),确认按列标准化后再聚类,Kmeans++ 的n_init设 10 以上多跑几次取稳定结果。

现象:熵权法算出的权重和直觉相反。原因:指标没正向化,或某指标方差接近零导致信息熵趋近 1。解决:先确认所有指标“越大越好”,负向指标取倒数或极差变换;检查是否有常数列。

现象:专家客观性得分全是高分,拉不开差距。原因:偏离度没做正向化,或评分均值计算时把专家自己算进去了。解决:算其余专家均值时排除当前专家,偏离度用1 - normalized_diff转成正向。

6.2 验收标准与答辩技巧

验收这套方案,我一般看四个硬指标:问题一分类 F1 不低于 0.7;聚类轮廓系数不低于 0.5;模糊综合评价的排序结果与聚类优秀率排序方向一致(不一致说明某一环有 bug);趋势分析的结论有至少两个维度(年份、月份)互相印证。

答辩时最容易被问的是“你的模型假设合不合理”。原方案有四条假设,其中“专家评语建议部分是教师所缺乏的”这条最容易被挑战,提前准备好回应:这是为了剥离非评价信息,若评委认为不合理,可展示去掉该假设后的敏感性分析。另外,把问题一到问题五画成一张数据流图(输入→预处理→模型→输出),比逐页念公式有效得多。

从那以后我每次带建模方案,都强制要求先跑一遍“输入输出对齐表”——每个模型的输入字段、输出字段、下游谁用,三列写清楚,对不上的地方就是隐藏 bug。这套习惯帮我省了太多返工。希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询