边画边算的决策树实战

    陈凯

    

    

    

    丫丫猫以为这个网络游戏的第一个任务是打怪,结果却发现,最先要做的,是在村庄中寻找和争夺装备,简称为夺宝任务。装备包括武器、护具和药剂三类,其中,武器有宝剑和弓箭两种,护具有盾牌和盔甲两种,药剂有增速和强力两种。在夺宝任務中,每一类装备只能在两个选项中选出一件,如选了宝剑就不能选弓箭,其他类似。丫丫猫感觉有点迷惑,她不知道怎样的装备更适合打怪。于是丫丫猫去请教资深玩家凯凯兔,迷糊的凯凯兔说他也并不知道,他只是随便拿到什么就用什么了,不过,凯凯兔提供了一份他此前十局游戏所选用装备和打怪结果的清单,如下表所示。

    看了这份清单,丫丫猫有点迷惑。对于胜利的结果来说,从护具上看,选用盾牌是两次,选用盔甲是两次;从药剂上看,选用增速是两次,选用强力是两次;从武器上看,选用弓箭是两次,选用宝剑是两次。乍看上去,这些信息并没有什么指示作用。

    灵光一闪后,丫丫猫忽然想到,还可以换个角度,看选用哪些装备,更容易导致失败,这么一查就有线索了。对于失败的结果来说,从护具上看,选用盾牌是三次,选用盔甲是三次;从药剂上看,选用强力是三次,选用增速是三次。这些信息似乎都没啥用处,但从武器上看,选用宝剑是四次,选用弓箭是两次,这似乎暗示着,选用宝剑更容易输。所以,在夺宝任务阶段,应该优先设法获取弓箭,接下来再考虑护具和药剂,应该优先寻找哪一样。

    上面这个例子,可用于阐述决策树分类算法的实现过程,本文希望通过这个例子,说明如何在人工智能的教学中化繁为简,形象直观地展示出机器学习算法的基本原理和过程。另外,本文也想借助这个例子,给出将人工智能教学与日常信息技术教学相融合的一些策略。

    ● 创设能激发思维过程显现的真切情境

    对于如何创设教学情境的问题,相关讨论很多,不再重复,这里主要讨论人工智能教学中创设教学情境的策略。笔者选用“真切情境”一词,用以规避“真实”和“虚拟”语义上可能出现的混乱。围绕人工智能,确实有许多可供教学使用的真实情境,如展馆里的智能机器向导、手机上的智能识别植物程序、小区门口的智能人脸识别系统等,但考虑到中小学生已有的知识技能水平,以及有限的人工智能教学课时,很难对这些真实情境中的人工智能应用做具体的还原拆解。举例说,就算教师找来人脸识别的程序代码并在课堂中成功实现识别,但整个程序代码本身还是一个黑箱,虽然说拆开黑箱,还是能对少部分原理进行讲解,但诸多概念理解上的缺失,再加上知识和技能相互关系脉络的不完整,仍然影响到学生对整体原理的把握和理解。

    这里的一个策略,是将目光从终端的人工智能应用,切换到人的思维活动本身,寻找能将人的思维变化过程充分显现出来的激发事件。例如,游戏就是一个很好的激发事件,游戏是学生在日常生活中能亲密接触并真切体验的活动,游戏中的场景和概念可以直接使用到教学活动中,从而大大降低应用到某些情境时,在解释和说明上需要耗费的时间成本。

    将思维过程显现出来的一个很有用的方法,就是绘画。用随手可得的画图软件即可,如箭头代表宝剑武器、星型代表弓箭武器、五边形是盾牌护具、三角形是盔甲护具、闪电是增速药剂、五角星是强力药剂。这里直接使用了现成的图标,如时间比较充裕,当然也可稍做设计使得图标更逼真。

    那么,如何将装备的图标和游戏结果关联起来呢?这是个开放性的任务,如可以在代表装备的图标里进一步做标志,圆圈代表胜利,方块代表失败(如图1)。或者可以使用两个框,上面的框代表胜利,下面的框代表失败,根据游戏情况将装备图标投入框内,如图2所示。

    这样的绘画过程,有助于将表格中的数据抽取出来,转化为人脑更容易把握的直观形态,为后续教学做好准备。

    ● 与信息技术基础概念相结合

    在边看边算之前,可以先试着边看边感觉。这里可以有效地解释出,实际上人脑的判断也正是信息处理的过程,观察图1和图2,就能直观了解到,使用哪一种武器更有可能导致失败。如果用不同的图示做比较,还可以看出“关于使用装备与胜负关系”的信息量的多少,在图3的A、B、C三种情况中,C的情况最为鲜明,可以明显看出弓箭优于宝剑,而A的情况更模糊一些。

    接下来,可以使用信息熵公式,在人的直观和数学抽象计算之间建立起关联,可以借助简单的Python代码,或在线工具帮助实施这些计算,如利用在线工具http://www.endmemo.com/bio/shannonentropy.php,简单填入胜负比例,就可以算出信息熵。具体的计算信息熵的方法,在本栏目往期文章《手工研磨咖啡的决策》中已有讨论,网络上也很容易找到,这里不再赘述。图3中,总共有十局游戏的记录,均是四胜六负,借用下页图4信息熵工具计算,仅从胜负情况看,获得的信息熵是0.970951。

    但若将使用武器的区别考虑进来,最终得到的熵值(也称条件熵)就有所不同了。情况A中,使用宝剑获得的胜负信息熵是0.918296,使用弓箭获得的胜负信息熵是1。由于十局游戏中,使用宝剑占十分之六,使用弓箭占十分之四,所以用公式6/10×0.918296+4/10×1得到条件熵为0.9509776。而若是情况C,条件熵计算结果为0。显然,数值越接近0,则表示信息指示作用越明确。从这里可以看出,这个计算其实就反映了香农所说的“信息是用于消除随机不确定性的东西”,所以,这部分内容的教学,在信息技术教学的基础模块阶段,就可以结合“信息”“信息熵”“信息处理”等概念先行实施起来。

    ● 在实践操作中体验自动化过程

    游戏中遇到的一个问题是,到底应该优先搜寻武器、装备还是药剂?将三种情况图画分别画出,直观上就很明显看出应该先确定武器的种类。若不是直观判断,而借助信息熵计算工具,也可获得同样的结果:若先以护具或药剂进行选择,那么获得胜负的条件熵仍然是0.970951,则选择结果与胜负结果之间未产生任何指示作用(因单纯计算胜负信息熵结果也是0.970951);而如果是先选择武器,则条件熵是0.9509776,小于单纯计算胜负结果的信息熵,选择结果对于胜负结果存在指示作用。

    但选择工作并非到此为止,在确定了选择弓箭后,还要进一步考虑护具和药剂的选择。从图5看,在已选择弓箭作为武器的情况下,药剂的选择和胜负之间无法看出明显指示关系,而从护具的选择可看出,盔甲要优于盾牌。借助工具的计算结果显示,若优先按护具进行选择,条件熵为0.688722,若优先按药剂进行选择,条件熵为1,这个计算结果也支持人脑的直观判断。

    如果游戏中,万一实在无法获得弓箭,那就只有选择宝剑作为武器了,那么在这种情况下,后续选择的情况又有所不同,如图6所示,直观可见应该优先选择盔甲作为护具。若借助工具计算,则先对护具进行选择得到条件熵为0.874185,而先对药剂进行选择得到的条件熵为0.918296,其结果,也倾向于先按护具进行选择。

    然后,对于做出选择后新得到的数据,可以用同样的思路继续进行分类选择,其实就是用到了递归的思想,限于篇幅,笔者就不继续将这张图画下去了。而绘图的过程,正是ID3算法生成决策树的过程。掌握了手工绘制决策图的技能后,再找一段ID3决策树算法的代码,针对特定数据运行逐个比对代码运行过程中各个条件熵的计算结果,便能更深入地理解算法的原理。如课时充裕,还能对测试数据进行调整,如减少一些样本,或增加一些可选择的属性值(如在药剂中加入“隐身”),从而发现ID3算法本身可能存在的问题,那就能赋予课程更多的探究味道了。

    ● 将实践经验用于未知事务

    将实践经验用于未知事务,如图7所示。