理解「认知诊断」

2018-07-20  本文已影响300人  Pope怯懦懦地

我们总在抱怨传统的教育方式有问题、不适合现在这个时代了。不考虑教学内容方面的原因,单就测试这块就还停留在工业时代。一次很偶然的机会[1],我读到其实这块早在二十年前就有解决方案了,自己真是井底之蛙。

简单地说,考试这档子事,目前的问题在于反馈不准 & 反馈太慢:

这里主要解决「反馈不准」的问题,至于改进反馈的即时性,可以用游戏化的手法解决,暂时先放一放。

我们先来看一张成绩单:

学生 题1 题2 题3 题4 题5 做对题数
丁一 5
陈二 4
张三 3
李四 2
王五 1
赵六 1

可以看到王五和赵六都只得了 1 分,你就能说他俩学得一样好了吗?赵六做出来的那道题,全班只有他和丁一做出来了,而王五做出来的那题,全班除了赵六都能做出来。每道题的难度是不一样的,这,是不是该区分一下啊?

学生 题1 题2 题3 题4 题5 做对题数
丁一 5
陈二 4
张三 3
李四 2
王五 1
赵六 1
做错的人数 4 4 3 2 1

我们可以把「做错的人数」近似地看作「题目的难度」。其实如果要细究「难度的定义」,应该从「涉及的知识点」去考虑。这块后面还会回头来考虑。

现在我们用难度重新给每道题赋分:

学生 题1 题2 题3 题4 题5 得分
丁一 4 4 3 2 1 14
陈二 0 4 3 2 1 10
张三 0 0 3 2 1 6
李四 0 0 0 2 1 3
王五 0 0 0 0 1 1
赵六 4 0 0 0 0 4

但这么算的话,李四该跳起来了「我做对了 2 道题,赵六才做对了 1 道,凭什么他的分比我还高?也许那一题是他蒙对的呢?」

有道理啊!但我怎么知道他是不是蒙的呢?李四又在旁边使坏水「你看赵六那人就不是能做出题 1 的人,他其他题一道都没做出来,肯定是蒙的!!!」

呃~~有点道理。那我们就用「总共做对了几道题」近似地去评估「一个人的总体实力」。实力越强,蒙的可能性越低;实力越弱,越可能是蒙的。

现在我们用「实力 - 难度」试试:

学生 题1 题2 题3 题4 题5 得分
丁一 5 - 4 5 - 3 5 - 2 5 - 1 5 - 0 15
陈二 0 4 - 3 4 - 2 4 - 1 4 - 0 10
张三 0 0 3 - 2 3 - 1 3 - 0 6
李四 0 0 0 2 - 1 2 - 0 3
王五 0 0 0 0 1 - 0 1
赵六 1 - 4 0 0 0 0 -3

我们可以看到,「实力 - 难度」这个指标不光是一个算分的中间值,它还是一个用来衡量「某人做出这道题的可能性大小」的工具。比如,哪怕让丁一去做题 1 ,也会很费劲 5 - 4 = 1;但让他去做题 5 ,则很轻松 5 - 0 = 5

那如果这几道题,不是考题,而是知识点呢?我们能不能用这个工具去评估学生对各个知识点的掌握程度呢?我们只需要对它做一个 logistic 变换,就可以把它变成一个 0 到 1 之间的小数,我们能否用这个小数作为「某人做出某道题的概率」?

某人做出某道题的概率 = 1/ 1 + exp(-(实力 - 难度))
学生 知识点1 知识点2 知识点3 知识点4 知识点5
丁一 0.73 0.88 0.95 0.98 0.99
陈二 0.50 0.73 0.88 0.95 0.98
张三 0.50 0.50 0.73 0.88 0.95
李四 0.50 0.50 0.50 0.73 0.88
王五 0.50 0.50 0.50 0.50 0.73
赵六 0.05 0.50 0.50 0.50 0.50

你会奇怪,为什么好些个没拿分的题显示的是 0.5 呢?其实,0.5 在 logistic 的语境中,就是「不确定」的意思。概率很大,接近于 1 ,就是「掌握了」;概率很小,接近于 0 ,就是「没掌握」。好吧,这是我瞎掰的。

如果丁一陈二张三李四王五赵六不是一个个学生,而是一道道题呢?如果这不是一张成绩单,而是一张「知识点涵盖矩阵」呢?

题号 知识点1 知识点2 知识点3 知识点4 知识点5

题一涵盖了全部知识点,而题六只涵盖了知识点 1 。

那不就能用这种方式做到「评估知识点的掌握情况」了?需要注意的,实力那的值就不是这道题涵盖的知识点的个数了,而是学生做对某个知识点上的个数。

假设学生甲只做对了题四、题五:

题号 知识点1 知识点2 知识点3 知识点4 知识点5 做对与否
做对该知识点的数目 0 0 0 1 2
知识点的难度 4 4 3 2 1
知识点 知识点1 知识点2 知识点3 知识点4 知识点5
掌握程度 1 / (1 + exp(-(0 - 4))) 1 / (1 + exp(-(0 - 4))) 1 / (1 + exp(-(0 - 3))) 1 / (1 + exp(-(1 - 2))) 1 / (1 + exp(-(2 - 1)))
2% 2% 5% 27% 73%

可以看到,甲对知识点 5 掌握得最好。

简单来说,思路其实相当相当简单:


但上面这套算法没有解决一个很关键的问题:知识点之间是存在依赖关系的。比如:要想掌握分数的通分,至少得先学会整数的加减、求公分母……吧。但以上算法并没有考虑这个。

解决的思路其实也很简单:挨个考察这个知识点「所有的先修知识点」的掌握情况。

首先,我们得先细致地考察一番知识点的内在结构。我们用一个矩阵来做这事。其实这完全是为了数学上处理方便,用 if-else 同样解决问题。

画反了!!!知识点内在结构:1 表示行号节点是列号节点的「直接」先修知识点;0 表示没有联系。

但我们正在想要的是,能够回答「节点 i 是不是节点 j 的先修知识点,直接或者间接都行」的矩阵。其实我们只要对上面这个矩阵加上一个单位矩阵,再反复自相乘直到收敛就行了。注意是布尔相乘哦。

画反了!!!直达矩阵

现在,你问「知识点 2 是不是知识点 5 的先修知识点?」,只要查第 2 行第 5 列是否为 1 就行了。我们先给个记号:q(5 → 2) = 1 。「q」就是 required 的意思啦。

好,搞定第一个工具。

下面要讲的,数学形式可能和上面那个「实力 - 难度」公式不同,但本质是一个意思。

下面我们构造一个矩阵,如果甲同学在题 i 中掌握了知识点 j 所需的所有知识点,记作 1;反之,为 0 :

题号 知识点1 知识点2 知识点3 知识点4 知识点5 做对与否
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 1 1
0 0 0 0 1
0 0 0 0 0

(待续……)
下面上公式?


  1. 本来是在备考政治,然后社情民情这块有几个数据,就手贱去查了下。结果发现政府其实发布了很多数据。然后就想玩玩这些数据弄出个「房价预测模型」来。然后考虑学区房的影响时,又发现有教育领域的数据,就想弄个「教育质量评估模型」来。再然后对教育测试产生了兴趣,偶然发现了这篇《认知诊断?基于一个案例的理解(改进版)》。然后……就入坑了。

上一篇 下一篇

猜你喜欢

热点阅读