【数据挖掘】国科大刘莹老师数据挖掘课程作业 —— 第二次作业

Written Part

1. 给定包含属性{Height, Hair, Eye}和两个类别{C1, C2}的数据集。构建基于信息增益(info gain)的决策树。

HeightHairEyeClass
1TallBlondBrownC1
2TallDarkBlueC1
3TallDarkBrownC1
4ShortDarkBlueC1
5ShortBlondBrownC1
6TallRedBlueC2
7TallBlondBlueC2
8ShortBlondBlueC2
9MediumDarkBlueC2

表 1    数据集

决策树算法框架如下所示:
输入: 训练集  D = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . , ( x m , y m ) } ; 属性值  A = { a 1 , a 2 , . . . , a d } 过程: 函数  T r e e G e n e r a t e ( D , A ) 输出: 以  n o d e 为根结点的一棵决策树 \begin{array}{ll} \textbf{输入:}&\space训练集\space D = \{(\pmb{x}_1,y_1),(\pmb{x}_2,y_2),...,(\pmb{x}_m,y_m)\};\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\\ &\space属性值 \space A=\{a_1,a_2,...,a_d\} \\ \textbf{过程:}&\space函数\space TreeGenerate(D, A) \\ \textbf{输出:}&\space 以 \space node \space 为根结点的一棵决策树 \end{array} 输入:过程:输出: 训练集 D={(x1,y1),(x2,y2),...,(xm,ym)};                                  属性值 A={a1,a2,...,ad} 函数 TreeGenerate(D,A)  node 为根结点的一棵决策树

1 : 生成结点  n o d e ; 2 : if D 中样本全属于同一类别  C then 3 : 将  n o d e 标记为  C 类叶结点 ; return 4 : end if 5 : if A ≠ ∅ OR D 中样本在  A 上取值相同  then 6 : 将  n o d e 标记为叶结点,其类别标记为  D 中样本数最多的类 ; return 7 : end if 8 : 从  A 中选择最优划分属性  a ∗ ; 9 : for a ∗ 的每一个值  a ∗ v do 10 : 为  n o d e 生成一个分支 ; 令  D v 表示  D 中在  a ∗ 上取值为  a ∗ v 的样本子集 ; 11 : if D v 为空  then 12 : 将分支结点标记为叶结点 , 其类别标记为  D 中样本数最多的类 ; return 13 : else 14 : 以  T r e e G e n e r a t e ( D v , A \ { a ∗ } ) 为分支结点 15 : end if 16 : end for \begin{array}{rl} 1:&生成结点\space node;\\ % 2:&\textbf{if} \space\space D\space 中样本全属于同一类别 \space C\space\space \textbf{then} \\ % 3:& \space\space \space\space 将\space node \space 标记为 \space C \space 类叶结点;\textbf{return}\\ % 4:& \textbf{end}\space \textbf{if}\\ % 5:&\textbf{if}\space\space A\ne \varnothing\space\space \textbf{OR} \space\space D\space 中样本在\space A\space 上取值相同\space \textbf{then} \\ % 6:&\space\space \space\space 将\space node\space 标记为叶结点,其类别标记为 \space D\space 中样本数最多的类;\textbf{return}\\ % 7:&\textbf{end}\space \textbf{if} \\ % 8:&从 \space A \space 中选择最优划分属性 \space a_*;\\ % 9:&\textbf{for} \space\space a_*\space 的每一个值\space a_*^v\space \textbf{do}\\ % 10:&\space\space\space\space 为\space node\space 生成一个分支;\space 令\space D_v\space 表示\space D\space中在\space a_*\space上取值为\space a_*^v\space 的样本子集;\\ % 11:&\space\space\space\space\textbf{if}\space D_v \space为空\space \textbf{then}\\ % 12:&\space\space\space\space\space\space\space\space将分支结点标记为叶结点,\space其类别标记为 \space D\space中样本数最多的类;\textbf{return}\\ % 13:&\space\space\space\space \textbf{else}\\ % 14:&\space\space\space\space\space\space\space\space 以 \space TreeGenerate(D_v,A\space\verb|\|\space \{a_*\})\space为分支结点\\ % 15:&\space\space\space\space \textbf{end}\space \textbf{if}\\ % 16:&\textbf{end}\space\textbf{for} \end{array} 1:2:3:4:5:6:7:8:9:10:11:12:13:14:15:16:生成结点 node;if  D 中样本全属于同一类别 C  then     node 标记为 C 类叶结点;returnend ifif  A=  OR  D 中样本在 A 上取值相同 then     node 标记为叶结点,其类别标记为 D 中样本数最多的类;returnend if A 中选择最优划分属性 a;for  a 的每一个值 av do     node 生成一个分支;  Dv 表示 D 中在 a 上取值为 av 的样本子集;    if Dv 为空 then        将分支结点标记为叶结点, 其类别标记为 D 中样本数最多的类;return    else         TreeGenerate(Dv,A \ {a}) 为分支结点    end ifend for

对于基于信息增益的决策树算法而言,上面框架中划分属性的方法为选择信息增益最大的属性进行划分。形式化地,假设离散属性 a a a V V V 个可能的取值 { a 1 , a 2 , . . . , a V } \{a^1,a^2,...,a^V\} {a1,a2,...,aV},若使用 a a a 来对样本集 D D D 进行划分,则会产生 V V V 个分支结点,其中第 v v v 个分支结点包含了 D D D 中所有在属性 a a a 上取值为 a v a^v av 的样本,记为 D v D^v Dv 。可以根据式 ( 3 ) (3) (3) 计算出 D v D^v Dv 的信息熵,再考虑到不同分支结点所包含的样本数不同,给分支结点赋予权重 ∣ D v ∣ / ∣ D ∣ |D^v|/|D| Dv∣/∣D,即样本数越多的分支结点的影响越大,于是可以计算出用属性 a a a 对样本集 D D D 进行划分所获得的“信息增益”(information gain)
G a i n ( D , a ) = E n t ( D ) − ∑ v = 1 V D v ∣ D ∣ E n t ( D v ) \begin{align} Gain(D, a)=Ent(D)-\sum_{v=1}^V\space \frac{D^v}{|D|}Ent(D^v)\tag{1} \end{align} Gain(D,a)=Ent(D)v=1V DDvEnt(Dv)(1)
从公式上来看,信息增益表示父结点的信息熵与子结点信息熵加权和之差。一般而言,信息增益越大,则意味着使用属性 a a a 来进行划分所获得的“纯度提升”越大。

对于本题而言,规定 H e i g h t = { T a l l , M e d i u m , S h o r t } \rm Height = \{Tall, Medium, Short\} Height={Tall,Medium,Short} H a i r = { B l o n d , D a r k , R e d } \rm Hair = \{Blond, Dark, Red\} Hair={Blond,Dark,Red} { B l u e , B r o w n } \rm \{Blue, Brown\} {Blue,Brown},整个数据集记为 D D D。则 E n t ( D ) = − ( 4 9 log ⁡ 4 9 + 5 9 log ⁡ 5 9 ) Ent(D) = -(\frac{4}{9}\log \frac{4}{9} + \frac{5}{9}\log\frac{5}{9}) Ent(D)=(94log94+95log95),首先考虑属性 H e i g h t \rm Height Height
E n t ( D 1 ) = − ( 4 5 log ⁡ 4 5 + 1 5 log ⁡ 1 5 ) E n t ( D 2 ) = − ( 1 log ⁡ 1 ) E n t ( D 3 ) = − ( 2 3 log ⁡ 2 3 + 1 3 log ⁡ 1 3 ) \begin{align} Ent(D^1)&=-(\frac{4}{5}\log \frac{4}{5} + \frac{1}{5}\log \frac{1}{5})\notag \\ Ent(D^2)&=-(1\log 1) \notag\\ Ent(D^3)&=-(\frac{2}{3}\log \frac{2}{3} + \frac{1}{3}\log \frac{1}{3})\notag \end{align} Ent(D1)Ent(D2)Ent(D3)=(54log54+51log51)=(1log1)=(32log32+31log31)
所以基于 H e i g h t \rm Height Height 划分的信息增益为 G a i n ( D , H e i g h t ) = E n t ( D ) − ( 5 9 E n t ( D 1 ) + 1 9 E n t ( D 2 ) + 3 9 E n t ( D 3 ) ) ≈ 0.1456 Gain(D, {\rm Height}) = Ent(D) - (\frac{5}{9} Ent(D^1) +\frac{1}{9} Ent(D^2) + \frac{3}{9}Ent(D^3) ) ≈ 0.1456 Gain(D,Height)=Ent(D)(95Ent(D1)+91Ent(D2)+93Ent(D3))0.1456(保留四位小数)。类似地可以计算出 G a i n ( D , H a i r ) ≈ 0.1861 Gain(D, {\rm Hair}) ≈ 0.1861 Gain(D,Hair)0.1861 G a i n ( D , E y e ) ≈ 0.3789 Gain(D, {\rm Eye})≈ 0.3789 Gain(D,Eye)0.3789。因此,选择属性 Eye 进行划分,结果如图 1 1 1 所示。

图 1    按属性 Eye 划分

对 Blue 分支进一步进行划分, G a i n ( D 1 , H e i g h t ) ≈ 0.1258 Gain(D^1, {\rm Height}) ≈0.1258 Gain(D1,Height)0.1258 G a i n ( D 1 , H a i r ) ≈ 0.459 Gain(D^1, {\rm Hair})≈0.459 Gain(D1,Hair)0.459,因此,Blue 分支选择属性 Hiar 进行划分。对 Brown 分支进一步划分,由于 Brown 分支中样本标签均为 C1,所以划分结束,该节点被标记为 C1 类。结果如图 2 2 2 所示。

图 2    按属性 Hair 划分

由于 Blond 分支和 Red 分支中的样本类别均 C2,所以结束划分,标记为 C2 类。对 Dark 分支进行划分, G a i n ( D 12 , H e i g h t ) ≈ 0.9183 Gain(D^{12}, {\rm Height})≈0.9183 Gain(D12,Height)0.9183,Tall 分支、Medium 分支和 Short 分支中的样本均已纯粹,所以最终构建的决策树如图 3 3 3 所示。

图 3    按属性 Height 划分

使用到的代码如下:

from math import log"""
函数说明:创建测试数据集
"""def createDataSet():dataSet = [[0, 0, 1, 'C1'],  # 数据集[0, 1, 0, 'C1'],[0, 1, 1, 'C1'],[2, 1, 0, 'C1'],[2, 0, 1, 'C1'],[0, 2, 0, 'C2'],[0, 0, 0, 'C2'],[2, 0, 0, 'C2'],[1, 1, 0, 'C2']]labels = ['Height', 'Hiar', 'Eye']  # 分类属性return dataSet, labels  # 返回数据集和分类属性"""
函数说明:计算给定数据集的经验熵(香农熵)
Parameters:dataSet - 数据集
Returns:shannonEnt - 经验熵(香农熵)
"""def calcShannonEnt(dataSet):numEntires = len(dataSet)  # 返回数据集的行数labelCounts = {}  # 保存每个标签(Label)出现次数的字典for featVec in dataSet:  # 对每组特征向量进行统计currentLabel = featVec[-1]  # 提取标签(Label)信息if currentLabel not in labelCounts.keys():  # 如果标签(Label)没有放入统计次数的字典,添加进去labelCounts[currentLabel] = 0labelCounts[currentLabel] += 1  # Label计数shannonEnt = 0.0  # 经验熵(香农熵)for key in labelCounts:  # 计算香农熵prob = float(labelCounts[key]) / numEntires  # 选择该标签(Label)的概率shannonEnt -= prob * log(prob, 2)  # 利用公式计算return shannonEnt  # 返回经验熵(香农熵)"""
函数说明:按照给定特征划分数据集
Parameters:dataSet - 待划分的数据集axis - 划分数据集的特征value - 需要返回的特征的值
"""def splitDataSet(dataSet, axis, value):retDataSet = []  # 创建返回的数据集列表for featVec in dataSet:  # 遍历数据集if featVec[axis] == value:reducedFeatVec = featVec[:axis]  # 去掉axis特征reducedFeatVec.extend(featVec[axis + 1:])  # 将符合条件的添加到返回的数据集retDataSet.append(reducedFeatVec)return retDataSet  # 返回划分后的数据集"""
函数说明:选择最优特征
Parameters:dataSet - 数据集
Returns:bestFeature - 信息增益最大的(最优)特征的索引值
"""def chooseBestFeatureToSplit(dataSet):numFeatures = len(dataSet[0]) - 1  # 特征数量baseEntropy = calcShannonEnt(dataSet)  # 计算数据集的香农熵bestInfoGain = 0.0  # 信息增益bestFeature = -1  # 最优特征的索引值for i in range(numFeatures):  # 遍历所有特征# 获取dataSet的第i个所有特征featList = [example[i] for example in dataSet]uniqueVals = set(featList)  # 创建set集合{},元素不可重复newEntropy = 0.0  # 经验条件熵for value in uniqueVals:  # 计算信息增益subDataSet = splitDataSet(dataSet, i, value)  # subDataSet划分后的子集prob = len(subDataSet) / float(len(dataSet))  # 计算子集的概率newEntropy += prob * calcShannonEnt(subDataSet)  # 根据公式计算经验条件熵infoGain = baseEntropy - newEntropy  # 信息增益print("第%d个特征的增益为%.4f" % (i, infoGain))  # 打印每个特征的信息增益if (infoGain > bestInfoGain):  # 计算信息增益bestInfoGain = infoGain  # 更新信息增益,找到最大的信息增益bestFeature = i  # 记录信息增益最大的特征的索引值return bestFeature  # 返回信息增益最大的特征的索引值if __name__ == '__main__':dataSet, features = createDataSet()entropy = calcShannonEnt(dataSet)bestfeature = chooseBestFeatureToSplit(dataSet)print("数据集的熵为:%f" % (entropy))print("最优特征索引值:" + str(bestfeature))

2. 为表 1 1 1 数据集设计包含一个隐藏层的多层前馈神经网络,标明输入层和输出层中的节点。使用这个神经网络,在给定训练实例 “(Medium, Dark, Brown, C2)” 的情况下,计算反向传播算法一次迭代后的权重值。注意注明初始权重值和偏置,以及使用的学习率。

包含一个隐藏层的前馈神经网络如图 4 4 4 所示。隐藏层和输出层的每个神经元均对应一个偏置,图中没有画出。

图 4    单隐层前馈神经网络

形式化的反向传播链式求导过程如下。规定符号:

  • k k k 层的权重记为 W ( k ) = ( w i j ( k ) ) W^{(k)}=(w_{ij}^{(k)}) W(k)=(wij(k)),其中 w i j ( k ) w_{ij}^{(k)} wij(k) 表示第 k − 1 k-1 k1 层的第 j j j 个节点连接第 k k k 层的第 i i i 个节点的权重。
  • k k k 层的偏置项记为 b ( k ) = ( b i ( k ) ) b^{(k)} = (b^{(k)}_i) b(k)=(bi(k)),其中 b i ( k ) b_i^{(k)} bi(k) 表示第 k − 1 k-1 k1 层与第 k k k 层的第 i i i 个节点连接的偏置。
  • k k k 层的净输出(未经过激活)记为 z ( k ) = W ( k ) T a ( k − 1 ) + b ( k ) z^{(k)} = {W^{(k)}}^Ta^{(k-1)} + b^{(k)} z(k)=W(k)Ta(k1)+b(k)
  • k k k 层的输出记为 a ( k ) = f ( z ( k ) ) a^{(k)} = f(z^{(k)}) a(k)=f(z(k)),其中 f f f 为激活函数。因此,对于具有 m m m 层的网络,第 m m m 层的输出 a ( m ) a^{(m)} a(m) 表示网络的输出。
  • 特别地,假设第 0 0 0 层为输入层,则有第 0 0 0 层的输出为网络的输入,记为 z ( 0 ) = a ( 0 ) = X z^{(0)} = a^{(0)} = X z(0)=a(0)=X,其中 X X X 为网络输入。
  • 输入 X X X 对应的真实标签为 Y Y Y

对于输入层而言,输入样本为 z ( 0 ) = a ( 0 ) = X z^{(0)} = a^{(0)}=X z(0)=a(0)=X,即 ( z 1 ( 0 ) , z 2 ( 0 ) , z 3 ( 0 ) ) = ( a 1 ( 0 ) , a 2 ( 0 ) , a 3 ( 0 ) ) = ( x 1 , x 2 , x 3 ) (z^{(0)}_1, z^{(0)}_2,z^{(0)}_3) = (a_1^{(0)}, a_2^{(0)}, a_3^{(0)}) = (x_1, x_2, x_3) (z1(0),z2(0),z3(0))=(a1(0),a2(0),a3(0))=(x1,x2,x3)

对于隐藏层而言,存在
z 1 ( 1 ) = w 11 ( 0 ) a 1 ( 0 ) + w 12 ( 0 ) a 2 ( 0 ) + w 13 ( 0 ) a 3 ( 0 ) + b 1 ( 0 ) z 2 ( 1 ) = w 21 ( 0 ) a 1 ( 0 ) + w 22 ( 0 ) a 2 ( 0 ) + w 23 ( 0 ) a 3 ( 0 ) + b 2 ( 0 ) z 3 ( 1 ) = w 31 ( 0 ) a 1 ( 0 ) + w 32 ( 0 ) a 2 ( 0 ) + w 33 ( 0 ) a 3 ( 0 ) + b 3 ( 0 ) z 4 ( 1 ) = w 41 ( 0 ) a 1 ( 0 ) + w 42 ( 0 ) a 2 ( 0 ) + w 43 ( 0 ) a 3 ( 0 ) + b 4 ( 0 ) a 1 ( 1 ) = f ( z 1 ( 1 ) ) a 2 ( 1 ) = f ( z 2 ( 1 ) ) a 3 ( 1 ) = f ( z 3 ( 1 ) ) a 4 ( 1 ) = f ( z 4 ( 1 ) ) z_1^{(1)} = w_{11}^{(0)}a_1^{(0)} + w_{12}^{(0)}a_2^{(0)} + w_{13}^{(0)}a_3^{(0)} + b_1^{(0)} \\ z_2^{(1)} = w_{21}^{(0)}a_1^{(0)} + w_{22}^{(0)}a_2^{(0)} + w_{23}^{(0)}a_3^{(0)} + b_2^{(0)} \\ z_3^{(1)} = w_{31}^{(0)}a_1^{(0)} + w_{32}^{(0)}a_2^{(0)} + w_{33}^{(0)}a_3^{(0)} + b_3^{(0)} \\ z_4^{(1)} = w_{41}^{(0)}a_1^{(0)} + w_{42}^{(0)}a_2^{(0)} + w_{43}^{(0)}a_3^{(0)} + b_4^{(0)} \\ a_1^{(1)} = f(z_1^{(1)}) \\ a_2^{(1)} = f(z_2^{(1)}) \\ a_3^{(1)} = f(z_3^{(1)}) \\ a_4^{(1)} = f(z_4^{(1)}) \\ z1(1)=w11(0)a1(0)+w12(0)a2(0)+w13(0)a3(0)+b1(0)z2(1)=w21(0)a1(0)+w22(0)a2(0)+w23(0)a3(0)+b2(0)z3(1)=w31(0)a1(0)+w32(0)a2(0)+w33(0)a3(0)+b3(0)z4(1)=w41(0)a1(0)+w42(0)a2(0)+w43(0)a3(0)+b4(0)a1(1)=f(z1(1))a2(1)=f(z2(1))a3(1)=f(z3(1))a4(1)=f(z4(1))
对于输出层而言,存在
z 1 ( 2 ) = w 11 ( 1 ) a 1 ( 1 ) + w 12 ( 1 ) a 2 ( 1 ) + w 13 ( 1 ) a 3 ( 1 ) + w 14 ( 1 ) a 4 ( 1 ) + b 1 ( 1 ) z 2 ( 2 ) = w 21 ( 1 ) a 1 ( 1 ) + w 22 ( 1 ) a 2 ( 1 ) + w 23 ( 1 ) a 3 ( 1 ) + w 14 ( 1 ) a 4 ( 1 ) + b 2 ( 1 ) a 1 ( 2 ) = f ( z 1 ( 2 ) ) a 2 ( 2 ) = f ( z 2 ( 2 ) ) z_1^{(2)} = w_{11}^{(1)}a_1^{(1)} + w_{12}^{(1)}a_2^{(1)} + w_{13}^{(1)}a_3^{(1)} + w_{14}^{(1)}a_4^{(1)} + b_1^{(1)} \\ z_2^{(2)} = w_{21}^{(1)}a_1^{(1)} + w_{22}^{(1)}a_2^{(1)} + w_{23}^{(1)}a_3^{(1)} + w_{14}^{(1)}a_4^{(1)} + b_2^{(1)} \\ a_1^{(2)} = f(z_1^{(2)}) \\ a_2^{(2)} = f(z_2^{(2)}) \\ z1(2)=w11(1)a1(1)+w12(1)a2(1)+w13(1)a3(1)+w14(1)a4(1)+b1(1)z2(2)=w21(1)a1(1)+w22(1)a2(1)+w23(1)a3(1)+w14(1)a4(1)+b2(1)a1(2)=f(z1(2))a2(2)=f(z2(2))
其中激活函数 f f f 采用 Sigmoid。

假设采用均方误差(MSE)作为损失函数,所以有 L ( W , b ) = 1 2 [ ( y 1 − a 1 ( 2 ) ) 2 + ( y 2 − a 2 ( 2 ) ) 2 ] \mathcal L(W, b) = \frac{1}{2}[(y_1-a^{(2)}_1)^2 + (y_2 - a_2^{(2)})^2] L(W,b)=21[(y1a1(2))2+(y2a2(2))2]。反向传播首先要计算损失函数 L \mathcal L L 关于模型参数的导数(梯度),以计算 ∂ L / ∂ w 11 ( 1 ) \partial \mathcal L/\partial w^{(1)}_{11} L/w11(1) 为例,同层其它参数(包括 w i j ( 1 ) w^{(1)}_{ij} wij(1) b i ( 1 ) b^{(1)}_i bi(1))类似。推导过程如下:

∂ L ∂ w 11 ( 1 ) = ∂ 1 2 [ ( y 1 − a 1 ( 2 ) ) 2 + ( y 2 − a 2 ( 2 ) ) 2 ] ∂ w 11 ( 2 ) = 1 2 ∂ [ ( y 1 − a 1 ( 2 ) ) 2 ] ∂ w 11 ( 1 ) + 1 2 ∂ [ ( y 2 − a 2 ( 2 ) ) 2 ] ∂ w 11 ( 1 ) = 1 2 ∂ [ ( y 1 − a 1 ( 2 ) ) 2 ] ∂ w 11 ( 1 ) = 1 2 ∂ [ ( y 1 − a 1 ( 2 ) ) 2 ] ∂ z 1 ( 2 ) ∂ z 1 ( 2 ) ∂ w 11 ( 1 ) = − ( y 1 − f ( z 1 ( 2 ) ) ) ∂ f ( z 1 ( 2 ) ) ∂ z 1 ( 2 ) ∂ z 1 ( 2 ) ∂ w 11 ( 1 ) = − ( y 1 − f ( z 1 ( 2 ) ) ) f ′ ( z 1 ( 2 ) ) ∂ z 1 ( 2 ) ∂ w 11 ( 1 ) = − ( y 1 − f ( z 1 ( 2 ) ) ) f ′ ( z 1 ( 2 ) ) ∂ ( w 11 ( 1 ) a 1 ( 1 ) + w 12 ( 1 ) a 2 ( 1 ) + w 13 ( 1 ) a 3 ( 1 ) + w 14 ( 1 ) a 4 ( 1 ) + b 1 ( 1 ) ) ∂ w 11 ( 1 ) = − ( y 1 − f ( z 1 ( 2 ) ) ) f ′ ( z 1 ( 2 ) ) a 1 ( 1 ) \begin{align} \frac{\partial \mathcal L}{\partial w_{11}^{(1)}} &= \frac{\partial \frac{1}{2}[(y_1-a^{(2)}_1)^2 + (y_2 - a_2^{(2)})^2]}{\partial w_{11}^{(2)}} \notag\\ &= \frac{1}{2} \frac{\partial [(y_1-a^{(2)}_1)^2]}{\partial w_{11}^{(1)}} + \frac{1}{2} \frac{\partial [(y_2-a^{(2)}_2)^2]}{\partial w_{11}^{(1)}} \notag\\ &= \frac{1}{2} \frac{\partial [(y_1-a^{(2)}_1)^2]}{\partial w_{11}^{(1)}} \notag\\ &= \frac{1}{2} \frac{\partial [(y_1-a^{(2)}_1)^2]}{\partial z_1^{(2)}}\frac{\partial z_1^{(2)}}{\partial w_{11}^{(1)}} \notag\\ &= -(y_1-f(z_1^{(2)}))\frac{\partial f(z_1^{(2)})}{\partial z_1^{(2)}}\frac{\partial z_1^{(2)}}{\partial w_{11}^{(1)}} \notag\\ &= -(y_1 - f(z_1^{(2)}))f'(z_1^{(2)})\frac{\partial z_1^{(2)}}{\partial w_{11}^{(1)}} \notag\\ &= -(y_1 - f(z_1^{(2)}))f'(z_1^{(2)})\frac{\partial (w_{11}^{(1)}a_1^{(1)} + w_{12}^{(1)}a_2^{(1)} + w_{13}^{(1)}a_3^{(1)} + w_{14}^{(1)}a_4^{(1)} + b_1^{(1)})}{\partial w_{11}^{(1)}} \notag\\ &= -(y_1 - f(z_1^{(2)}))f'(z_1^{(2)})a_1^{(1)} \notag \end{align} w11(1)L=w11(2)21[(y1a1(2))2+(y2a2(2))2]=21w11(1)[(y1a1(2))2]+21w11(1)[(y2a2(2))2]=21w11(1)[(y1a1(2))2]=21z1(2)[(y1a1(2))2]w11(1)z1(2)=(y1f(z1(2)))z1(2)f(z1(2))w11(1)z1(2)=(y1f(z1(2)))f(z1(2))w11(1)z1(2)=(y1f(z1(2)))f(z1(2))w11(1)(w11(1)a1(1)+w12(1)a2(1)+w13(1)a3(1)+w14(1)a4(1)+b1(1))=(y1f(z1(2)))f(z1(2))a1(1)

为了展示方便,记 δ 1 ( 2 ) = − ( y 1 − f ( z 1 ( 2 ) ) ) f ′ ( z 1 ( 2 ) ) \delta_1^{(2)} = -(y_1 - f(z_1^{(2)}))f'(z_1^{(2)}) δ1(2)=(y1f(z1(2)))f(z1(2)),因此

∂ L ∂ w 11 ( 1 ) = δ 1 ( 2 ) a 1 ( 1 ) \frac{\partial \mathcal L}{\partial w_{11}^{(1)}} = \delta_1^{(2)}a_1^{(1)} w11(1)L=δ1(2)a1(1)
再向前推一层,以计算 ∂ L / ∂ w 11 ( 0 ) \partial \mathcal L/\partial w^{(0)}_{11} L/w11(0) 为例,同层其它参数(包括 w ( 0 ) w^{(0)} w(0) b ( 0 ) b^{(0)} b(0))类似。推导过程如下:
∂ L ∂ w 11 ( 0 ) = ∂ 1 2 [ ( y 1 − a 1 ( 2 ) ) 2 + ( y 2 − a 2 ( 2 ) ) 2 ] ∂ w 11 ( 0 ) = 1 2 ∂ [ ( y 1 − a 1 ( 2 ) ) 2 ] ∂ w 11 ( 0 ) + 1 2 ∂ [ ( y 2 − a 2 ( 2 ) ) 2 ] ∂ w 11 ( 0 ) = 1 2 ∂ [ ( y 1 − f ( z 1 ( 2 ) ) ) 2 ] ∂ w 11 ( 0 ) + 1 2 ∂ [ ( y 2 − f ( z 2 ( 2 ) ) ) 2 ] ∂ w 11 ( 0 ) = 1 2 ∂ [ ( y 1 − f ( z 1 ( 2 ) ) ) 2 ] ∂ z 1 ( 2 ) ∂ z 1 ( 2 ) ∂ w 11 ( 0 ) + 1 2 ∂ [ ( y 2 − f ( z 2 ( 2 ) ) ) 2 ] ∂ z 2 ( 2 ) ∂ z 2 ( 2 ) ∂ w 11 ( 0 ) = δ 1 ( 2 ) ∂ z 1 ( 2 ) ∂ w 11 ( 0 ) + δ 2 ( 2 ) ∂ z 2 ( 2 ) ∂ w 11 ( 0 ) \begin{align} \frac{\partial \mathcal L}{\partial w_{11}^{(0)}} &= \frac{\partial \frac{1}{2}[(y_1-a^{(2)}_1)^2 + (y_2 - a_2^{(2)})^2]}{\partial w_{11}^{(0)}} \notag\\ &= \frac{1}{2} \frac{\partial [(y_1-a^{(2)}_1)^2]}{\partial w_{11}^{(0)}} + \frac{1}{2} \frac{\partial [(y_2-a^{(2)}_2)^2]}{\partial w_{11}^{(0)}} \notag\\ &= \frac{1}{2} \frac{\partial [(y_1-f(z^{(2)}_1))^2]}{\partial w_{11}^{(0)}} + \frac{1}{2} \frac{\partial [(y_2-f(z^{(2)}_2))^2]}{\partial w_{11}^{(0)}} \notag\\ &= \frac{1}{2} \frac{\partial [(y_1-f(z^{(2)}_1))^2]}{\partial z_1^{(2)}}\frac{\partial z_1^{(2)}}{\partial w_{11}^{(0)}} + \frac{1}{2} \frac{\partial [(y_2-f(z^{(2)}_2))^2]}{\partial z_2^{(2)}}\frac{\partial z_2^{(2)}}{\partial w_{11}^{(0)}} \notag\\ &= \delta_1^{(2)}\frac{\partial z_1^{(2)}}{\partial w_{11}^{(0)}} + \delta_2^{(2)}\frac{\partial z_2^{(2)}}{\partial w_{11}^{(0)}} \notag\\ \end{align} w11(0)L=w11(0)21[(y1a1(2))2+(y2a2(2))2]=21w11(0)[(y1a1(2))2]+21w11(0)[(y2a2(2))2]=21w11(0)[(y1f(z1(2)))2]+21w11(0)[(y2f(z2(2)))2]=21z1(2)[(y1f(z1(2)))2]w11(0)z1(2)+21z2(2)[(y2f(z2(2)))2]w11(0)z2(2)=δ1(2)w11(0)z1(2)+δ2(2)w11(0)z2(2)

计算 ∂ z 1 ( 2 ) ∂ w 11 ( 0 ) \frac{\partial z_1^{(2)}}{\partial w_{11}^{(0)}} w11(0)z1(2) 有:

∂ z 1 ( 2 ) ∂ w 11 ( 0 ) = ∂ ( w 11 ( 1 ) a 1 ( 1 ) + w 12 ( 1 ) a 2 ( 1 ) + w 13 ( 1 ) a 3 ( 1 ) + w 14 ( 1 ) a 4 ( 1 ) + b 1 ( 1 ) ) ∂ w 11 ( 0 ) = ∂ ( w 11 ( 1 ) a 1 ( 1 ) ) ∂ w 11 ( 0 ) + ∂ ( w 12 ( 1 ) a 2 ( 1 ) ) ∂ w 11 ( 0 ) + ∂ ( w 13 ( 1 ) a 3 ( 1 ) ) ∂ w 11 ( 0 ) + ∂ ( w 14 ( 1 ) a 4 ( 1 ) ) ∂ w 11 ( 0 ) + ∂ ( b 1 ( 1 ) ) ∂ w 11 ( 0 ) = ∂ ( w 11 ( 1 ) a 1 ( 1 ) ) ∂ w 11 ( 0 ) = ∂ ( w 11 ( 1 ) f ( z 1 ( 1 ) ) ) ∂ w 11 ( 0 ) = ∂ ( w 11 ( 1 ) f ( z 1 ( 1 ) ) ) z 1 ( 1 ) ∂ z 1 ( 1 ) ∂ w 11 ( 0 ) = w 11 ( 1 ) f ′ ( z 1 ( 1 ) ) ∂ ( w 11 ( 0 ) a 1 ( 0 ) + w 12 ( 0 ) a 2 ( 0 ) + w 13 ( 0 ) a 3 ( 0 ) + b 1 ( 0 ) ) ∂ w 11 ( 0 ) = w 11 ( 1 ) f ′ ( z 1 ( 1 ) ) a 1 ( 0 ) \begin{align} \frac{\partial z_1^{(2)}}{\partial w_{11}^{(0)}} &= \frac{\partial (w_{11}^{(1)}a_1^{(1)} + w_{12}^{(1)}a_2^{(1)} + w_{13}^{(1)}a_3^{(1)} + w_{14}^{(1)}a_4^{(1)} + b_1^{(1)})}{\partial w_{11}^{(0)}} \notag\\ &= \frac{\partial (w_{11}^{(1)}a_1^{(1)})}{\partial w_{11}^{(0)}} + \frac{\partial (w_{12}^{(1)}a_2^{(1)})}{\partial w_{11}^{(0)}} + \frac{\partial (w_{13}^{(1)}a_3^{(1)})}{\partial w_{11}^{(0)}} + \frac{\partial (w_{14}^{(1)}a_4^{(1)})}{\partial w_{11}^{(0)}} + \frac{\partial (b_1^{(1)})}{\partial w_{11}^{(0)}} \notag\\ &= \frac{\partial (w_{11}^{(1)}a_1^{(1)})}{\partial w_{11}^{(0)}} \notag\\ &= \frac{\partial (w_{11}^{(1)}f(z_1^{(1)}))}{\partial w_{11}^{(0)}} \notag\\ &= \frac{\partial (w_{11}^{(1)}f(z_1^{(1)}))}{z_1^{(1)}}\frac{\partial z_1^{(1)}}{\partial w_{11}^{(0)}} \notag\\ &= w_{11}^{(1)} f'(z_1^{(1)}) \frac{\partial (w_{11}^{(0)}a_1^{(0)} + w_{12}^{(0)}a_2^{(0)} + w_{13}^{(0)}a_3^{(0)} + b_1^{(0)})}{\partial w_{11}^{(0)}} \notag\\ &= w_{11}^{(1)} f'(z_1^{(1)})a_{1}^{(0)}\notag \end{align} w11(0)z1(2)=w11(0)(w11(1)a1(1)+w12(1)a2(1)+w13(1)a3(1)+w14(1)a4(1)+b1(1))=w11(0)(w11(1)a1(1))+w11(0)(w12(1)a2(1))+w11(0)(w13(1)a3(1))+w11(0)(w14(1)a4(1))+w11(0)(b1(1))=w11(0)(w11(1)a1(1))=w11(0)(w11(1)f(z1(1)))=z1(1)(w11(1)f(z1(1)))w11(0)z1(1)=w11(1)f(z1(1))w11(0)(w11(0)a1(0)+w12(0)a2(0)+w13(0)a3(0)+b1(0))=w11(1)f(z1(1))a1(0)
同理可以计算得到
∂ z 2 ( 2 ) ∂ w 11 ( 0 ) = w 21 ( 1 ) f ′ ( z 1 ( 1 ) ) a 1 ( 0 ) \frac{\partial z_2^{(2)}}{\partial w_{11}^{(0)}} =w_{21}^{(1)} f'(z_1^{(1)})a_{1}^{(0)} w11(0)z2(2)=w21(1)f(z1(1))a1(0)
因此
∂ L ∂ w 11 ( 0 ) = δ 1 ( 2 ) ∂ z 1 ( 2 ) ∂ w 11 ( 0 ) + δ 2 ( 2 ) ∂ z 1 ( 2 ) ∂ w 11 ( 0 ) = δ 1 ( 2 ) w 11 ( 1 ) f ′ ( z 1 ( 1 ) ) a 1 ( 0 ) + δ 2 ( 2 ) w 21 ( 1 ) f ′ ( z 1 ( 1 ) ) a 1 ( 0 ) = a 1 ( 0 ) f ′ ( z 1 ( 1 ) ) ( δ 1 ( 2 ) w 11 ( 1 ) + δ 2 ( 2 ) w 21 ( 1 ) ) \begin{align} \frac{\partial \mathcal L}{\partial w_{11}^{(0)}} &= \delta_1^{(2)}\frac{\partial z_1^{(2)}}{\partial w_{11}^{(0)}} + \delta_2^{(2)}\frac{\partial z_1^{(2)}}{\partial w_{11}^{(0)}} \notag\\ & = \delta_1^{(2)}w_{11}^{(1)} f'(z_1^{(1)})a_1^{(0)} + \delta_2^{(2)}w_{21}^{(1)} f'(z_1^{(1)})a_1^{(0)} \notag\\ &= a_1^{(0)}f'(z_1^{(1)})(\delta_1^{(2)} w_{11}^{(1)} + \delta_2^{(2)}w_{21}^{(1)}) \notag \end{align} w11(0)L=δ1(2)w11(0)z1(2)+δ2(2)w11(0)z1(2)=δ1(2)w11(1)f(z1(1))a1(0)+δ2(2)w21(1)f(z1(1))a1(0)=a1(0)f(z1(1))(δ1(2)w11(1)+δ2(2)w21(1))
至此,损失函数 L \mathcal L L 关于全部模型参数 W W W b b b 的导数(梯度)均可以采用类似的方法计算得到。

得到了梯度,反向传播的第一阶段完成。在第二阶段,需要用梯度来更新模型参数:
w t + 1 = w t − η ∂ L ∂ w t w^{t+1} = w^{t} - \eta \frac{\partial \mathcal L}{\partial w^{t}} wt+1=wtηwtL
其中 w t w^t wt 表示模型参数 w w w t t t 时刻的取值, η \eta η 表示学习率。通过不断迭代上述两个阶段,直至满足条件(比如收敛或一定迭代次数)。

使用到的代码如下:

import torch
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optimseed = 99
torch.manual_seed(seed) # 为CPU设置随机种子class FFN(nn.Module):def __init__(self):super(FFN, self).__init__()self.hideen = nn.Linear(in_features=3, out_features=4, bias=True)self.sigmoid = nn.Sigmoid()self.output = nn.Linear(in_features=4, out_features=2, bias=True)self.init_weight()def forward(self, x):hid = self.sigmoid(self.hideen(x))out = self.output(hid)return outdef init_weight(self):# nn.init.zeros_(self.hideen.weight)# nn.init.zeros_(self.hideen.bias)# nn.init.zeros_(self.output.weight)# nn.init.zeros_(self.output.bias)initrange = 0.1nn.init.uniform_(self.hideen.weight, -initrange, initrange)nn.init.uniform_(self.hideen.bias, -initrange, initrange)nn.init.uniform_(self.output.weight, -initrange, initrange)nn.init.uniform_(self.output.bias, -initrange, initrange)data = torch.tensor([[1, 1, 1]], dtype=torch.float)
label = torch.tensor([1], dtype=torch.long)
learning_rate = 0.01
net = FFN()
optimizer = optim.SGD(params=net.parameters(), lr=learning_rate)print(net.hideen.weight)
print(net.hideen.bias)
print(net.output.weight)
print(net.output.bias)# optimizer.zero_grad()
loss = F.cross_entropy(net(data), label)
loss.backward()
optimizer.step()print(net.hideen.weight)
print(net.hideen.bias)
print(net.output.weight)
print(net.output.bias)

设置随机种子,固定初始化权重,隐藏层权重为 [[ 0.0003, -0.0573, 0.0622],[ 0.0557, -0.0528, -0.0420],[-0.0334, 0.0818, -0.0500],[ 0.0245, 0.0930, 0.0060]],偏置为 [-0.0586, 0.0375, -0.0616, 0.0627],输出层权重为 [[ 0.0825, 0.0879, 0.0642, -0.0193],[ 0.0865, -0.0596, 0.0958, -0.0133]],偏置为 [0.0448, 0.0795]

迭代一次后的隐藏层权重为 [[ 0.0003, -0.0573, 0.0622],[ 0.0556, -0.0528, -0.0421],[-0.0334, 0.0818, -0.0500],[ 0.0245, 0.0930, 0.0060]],偏置为 [-0.0586, 0.0374, -0.0616, 0.0627],输出层权重为 [[ 0.0819, 0.0873, 0.0635, -0.0200],[ 0.0871, -0.0590, 0.0963, -0.0127]],偏置为 [0.0434, 0.0806]

3. 使用朴素贝叶斯分类器,基于表 1 1 1 数据集对未知样本 Z = (Height = Short, Hair = blond, Eye = brown) 进行分类。

朴素贝叶斯分类器(naive Bayes classifier)采用了“属性条件独立性假设”(attribute conditional independence assumption):对已知类别,假设所有属性相互独立。换言之,假设每个属性独立地对分类结果发生影响。

基于属性条件独立性假设,有:
P ( c ∣ x ) = P ( c ) P ( x ∣ c ) P ( x ) = P ( c ) P ( x ) ∏ i = 1 d P ( x i ∣ c ) (2) P(c\space |\space \pmb x) = \frac{P(c)P(\pmb x\space|\space c)}{P(\pmb x)}=\frac{P(c)}{P(\pmb x)}\prod_{i=1}^dP(x_i\space|\space c)\tag{2} P(c  x)=P(x)P(c)P(x  c)=P(x)P(c)i=1dP(xi  c)(2)
其中 d d d 为属性数目, x i x_i xi x \pmb x x 在第 i i i 个属性上的取值。

由于对所有类别来说 P ( x ) P(\pmb x) P(x) 相同,因此贝叶斯判定准则表示为:
h n b ( x ) = a r g m a x c ∈ Y P ( c ) ∏ i = 1 d P ( x i ∣ c ) (3) h_{nb}(\pmb x)=\mathop{arg \space max} \limits_{c∈\mathcal{Y}}\space P(c) \prod_{i=1}^dP(x_i\space|\space c)\tag{3} hnb(x)=cYarg max P(c)i=1dP(xi  c)(3)
这就是朴素贝叶斯分类器的表达式。

显然,朴素贝叶斯分类器的训练过程就是基于训练集 D D D 来估计类先验概率 P ( c ) P(c) P(c),并为每个属性估计条件概率 P ( x i ∣ c ) P(x_i \space|\space c) P(xi  c)

D c D_c Dc 表示训练集 D D D 中第 c c c 类样本组成的集合,若有充足的独立同分布样本,则可容易地估计出类先验概率
P ( c ) = ∣ D c ∣ ∣ D ∣ (4) P(c)=\frac{|D_c|}{|D|}\tag{4} P(c)=DDc(4)
对离散属性而言,令 D c , x i D_{c,x_i} Dc,xi 表示 D c D_c Dc 中在第 i i i 个属性上取值为 x i x_i xi 的样本组成的集合,则条件概率 P ( x i ∣ c ) P(x_i\space |\space c) P(xi  c) 可估计为
P ( x i ∣ c ) = ∣ D c , x i ∣ ∣ D c ∣ (5) P(x_i\space | \space c) = \frac{|D_{c,x_i}|}{|D_c|}\tag{5} P(xi  c)=DcDc,xi(5)
对连续属性可考虑概率密度函数,假定 p ( x i ∣ c ) ∼ N ( μ c , i , σ c , i 2 ) p(x_i\space |\space c)\sim \mathcal{N}(\mu_{c,i},\sigma_{c,i}^2) p(xi  c)N(μc,i,σc,i2),其中 μ c , i \mu_{c,i} μc,i σ c , i 2 \sigma_{c,i}^2 σc,i2 分别是第 c c c 类样本在第 i i i 个属性上取值的均值和方差,则有
p ( x i ∣ c ) = 1 2 π σ c , i e x p ( − ( x i − μ c , i 2 ) 2 σ c , i 2 ) (6) p(x_i\space|\space c)=\frac{1}{\sqrt{2\pi}\sigma_{c,i}}exp\left(-\frac{(x_i-\mu_{c,i}^2)}{2\sigma_{c,i}^2}\right)\tag{6} p(xi  c)=2π σc,i1exp(2σc,i2(xiμc,i2))(6)
对于样本 Z = (Height = Short, Hair = blond, Eye = brown) 而言,先计算先验概率 P ( C 1 ) P(\rm C1) P(C1) P ( C 2 ) P(\rm C2) P(C2) P ( C 1 ) = 5 9 P({\rm C1}) = \frac{5}{9} P(C1)=95 P ( C 2 ) = 4 9 P({\rm C2}) = \frac{4}{9} P(C2)=94。针对属性 Height, P ( H e i g h t = S h o r t ∣ C 1 ) = 2 5 P({\rm Height = Short} \mid {\rm C1}) = \frac{2}{5} P(Height=ShortC1)=52 P ( H e i g h t = S h o r t ∣ C 2 ) = 1 4 P({\rm Height = Short} \mid {\rm C2}) = \frac{1}{4} P(Height=ShortC2)=41;针对属性 Hair, P ( H a i r = b l o n d ∣ C 1 ) = 2 5 P({\rm Hair = blond}\mid {\rm C1}) = \frac{2}{5} P(Hair=blondC1)=52 P ( H a i r = b l o n d ∣ C 2 ) = 1 2 P({\rm Hair = blond}\mid {\rm C2}) = \frac{1}{2} P(Hair=blondC2)=21;针对属性 Eye, P ( E y e = b r o w n ∣ C 1 ) = 3 5 P({\rm Eye = brown}\mid {\rm C1}) = \frac{3}{5} P(Eye=brownC1)=53 P ( E y e = b r o w n ∣ C 2 ) = 0 P({\rm Eye= brown}\mid {\rm C2}) = 0 P(Eye=brownC2)=0

因此,

P ( C 1 ∣ Z ) = P ( C 1 ) P ( H e i g h t = S h o r t ∣ C 1 ) P ( H a i r = b l o n d ∣ C 1 ) P ( E y e = B r o w n ∣ C 1 ) = 0.0533 P({\rm C1}\mid {\rm Z}) = P({\rm C1})P({\rm Height = Short} \mid {\rm C1})P({\rm Hair = blond} \mid {\rm C1})P({\rm Eye = Brown} \mid {\rm C1}) = 0.0533 P(C1Z)=P(C1)P(Height=ShortC1)P(Hair=blondC1)P(Eye=BrownC1)=0.0533​; P ( C 2 ∣ Z ) = P ( C 2 ) P ( H e i g h t = S h o r t ∣ C 2 ) P ( H a i r = b l o n d ∣ C 2 ) P ( E y e = B r o w n ∣ C 2 ) = 0 P({\rm C2}\mid {\rm Z}) = P({\rm C2})P({\rm Height = Short} \mid {\rm C2})P({\rm Hair = blond} \mid {\rm C2})P({\rm Eye = Brown} \mid {\rm C2}) = 0 P(C2Z)=P(C2)P(Height=ShortC2)P(Hair=blondC2)P(Eye=BrownC2)=0

在不考虑平滑的前提下, P ( E y e = b r o w n ∣ C 2 ) = 0 P({\rm Eye= brown}\mid {\rm C2}) = 0 P(Eye=brownC2)=0 导致 P ( C 2 ∣ Z ) P(\rm C2\mid Z) P(C2Z) 0 0 0。所以样本 Z 被分类为 C1。

Lab Part

假设一家超市想推销意大利面。使用“Transactions.txt”中的数据作为训练数据来构建基于 C5.0 算法的决策树模型,以预测客户是否会购买意大利面。

1. 使用数据集 “Transactions.txt” 构建决策树,利用其它字段来预测 “pasta” 字段。使用 Field Ops 中的 Type 模块,将除了 COD 字段外的每个字段的 “type” 设置为 “Flag”,将 COD 字段的 “type“ 设置为 “Typeless”,将 “pasta” 字段的 “direction” 属性设置为 “out”。使用 Modeling 中的 C5.0 模块,选择 “Expert” 并将 “Pruning severity” 设置为 65 65 65,将 “Minimum records per child branch” 设置为 95 95 95

5 5 5 为 Clementine 的使用截图。使用数据集 “Transaction.txt” 构建的决策树如图 6 6 6 所示。

图 5    Clementine 使用截图

图 6    决策树

虽然横向显示决策树会比较美观,但是缩放严重出现失真,故还是选择了纵向显示。

2. 使用上面创建好的模型对 “rollout.txt” 数据中的 20 20 20 位客户中的每一位进行预测,以确定客户是否会购买意大利面。

7 7 7 和图 8 8 8 分别展示了数据类型配置和对 “rollout.txt” 的预测结果。

图 7    rollout 数据类型配置

图 8    决策树预测结果

前五层的预测规则如下:

tomato souce = 1 [ Mode: 1 ] tunny = 1 [ Mode: 1 ] => 1 tunny = 0 [ Mode: 1 ] rice = 1 [ Mode: 1 ] => 1 rice = 0 [ Mode: 0 ] brioches = 1 [ Mode: 1 ] => 1 brioches = 0 [ Mode: 0 ] frozen vegetables = 1 [ Mode: 1 ] => 1 frozen vegetables = 0 [ Mode: 0 ] coffee = 1 [ Mode: 1 ] => 1 coffee = 0 [ Mode: 0 ] => 0 
tomato souce = 0 [ Mode: 0 ] rice = 1 [ Mode: 0 ] coffee = 1 [ Mode: 1 ] => 1 coffee = 0 [ Mode: 0 ] biscuits = 1 [ Mode: 1 ] => 1 biscuits = 0 [ Mode: 0 ] coke = 1 [ Mode: 1 ] => 1 coke = 0 [ Mode: 0 ] => 0 rice = 0 [ Mode: 0 ] tunny = 1 [ Mode: 0 ] => 0 tunny = 0 [ Mode: 0 ] oil = 1 [ Mode: 0 ] => 0 oil = 0 [ Mode: 0 ] water = 1 [ Mode: 0 ] => 0 water = 0 [ Mode: 0 ] milk = 1 [ Mode: 0 ] => 0 milk = 0 [ Mode: 0 ] yoghurt = 1 [ Mode: 0 ] => 0 yoghurt = 0 [ Mode: 0 ] coke = 1 [ Mode: 0 ] => 0 coke = 0 [ Mode: 0 ] biscuits = 1 [ Mode: 0 ] => 0 biscuits = 0 [ Mode: 0 ] brioches = 1 [ Mode: 0 ] => 0 brioches = 0 [ Mode: 1 ] coffee = 1 [ Mode: 0 ] => 0 coffee = 0 [ Mode: 1 ] frozen vegetables = 1 [ Mode: 0 ] => 0 frozen vegetables = 0 [ Mode: 1 ] beer = 1 [ Mode: 0 ] => 0 beer = 0 [ Mode: 1 ] juices = 1 [ Mode: 0 ] => 0 juices = 0 [ Mode: 1 ] mozzarella = 1 [ Mode: 0 ] => 0 mozzarella = 0 [ Mode: 1 ] crackers = 1 [ Mode: 0 ] => 0 crackers = 0 [ Mode: 1 ] frozen fish = 1 [ Mode: 0 ] => 0 frozen fish = 0 [ Mode: 1 ] => 1 

通过对某在线培训系统的标注数据集进行建模,预测其它会员期末考试的结果。数据集来自在线培训系统的日志,数据包括每个会员的在线学习行为。请尝试多种不同的模型、不同的参数,建立高质量的预测模型。

训练集有 873 873 873 条记录,测试集有 461 461 461 条记录。训练集和测试集包含如下变量:

人员 ID在线总时长(分钟)在线阅读时长(分钟)在线测试时长(分钟)全文阅读次数智能阅读次数知识点阅读次数试题阅读次数
回溯原文次数题库测试次数仿真考试次数仿真考试优秀次数仿真考试良好次数仿真考试合格次数仿真考试不合格次数Class

1. 对训练数据集进行决策树分类。将除 “人员 ID” 之外的字段设置为输入。将 “Class” 的 “direction” 设置为 “out”,“type” 设置为 ”Flag“。自定义 “pruning severity” 和 “minimum records per child branch”,然后勾选“use global pruning”。

尝试了多组参数如图 9 9 9 所示。其中,PS 为 pruning severity,MRPCB 为 minimum records per child branch。可见,“最佳”参数组合为 PS=5,MRPCB=5。

图 9    决策树混淆矩阵

2. 使用默认设置的神经网络处理训练数据集。设置同上。

默认设置的神经网络对应的混淆矩阵如图 10 10 10 所示。

图 10    神经网络混淆矩阵

3. 使用默认设置的逻辑回归模型处理训练数据集。设置同上。

默认设置的逻辑回归模型对应的混淆矩阵如图 11 11 11 所示。

图 11    逻辑回归模型混淆矩阵

4. 分析上面三个模型生成的混淆矩阵,评估模型质量。

对比 PS=5, MRPCB=5 的决策树、默认设置的神经网络和逻辑回归模型,决策树在准确率(accuracy)、召回率(recall)还是精度(precision)指标上的效果均优于其它两个模型,但这并不意味着决策树模型更适合这个数据集。

REF

Clementine教程 - 知乎

使用clementine得到混淆矩阵 - CSDN

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/184034.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java实现简单的王者荣耀游戏

一、创建新项目 首先创建一个新的项目,并命名为wangzherongyao。 其次在飞翔的鸟项目下创建一个名为img的文件夹用来存放游戏相关图片。详细如下图: 二、游戏代码 1、创建怪物类 1.bear: package beast;import wangzherogyao.GameFrame;…

a-table:表格组件常用功能记录——基础积累2

antdvue是我目前项目的主流,在工作过程中,经常用到table组件。下面就记录一下工作中经常用到的部分知识点。 a-table:表格组件常用功能记录——基础积累2 效果图1.table 点击行触发点击事件1.1 实现单选 点击事件1.2 实现多选 点击事件1.3 实…

知识社区问答平台源码系统 开源的知识问答平台 附带完整的搭建教程

互联网的快速发展,人们对于知识的需求越来越高。知识社区问答平台源码系统是一款基于开源框架搭建的知识问答平台,旨在帮助人们快速、准确地获取所需知识,提高学习效率。 以下是部分代码示例: 系统特色功能一览: 1.知…

什么是消息队列

什么是消息队列 MQ(message queue),从字面意思上看,本质是个队列,FIFO 先入先出队列,只不过队列中存放的内容是 message 而已,还是一种跨进程的通信机制,用于上下游传递消息。在互联网架构中,M…

二叉树leetcode(求二叉树深度问题)

today我们来练习三道leetcode上的有关于二叉树的题目,都是一些基础的二叉树题目,那让我们一起来学习一下吧。 https://leetcode.cn/problems/maximum-depth-of-binary-tree/submissions/ 看题目描述是让我们来求出二叉树的深度,我们以第一个父…

HT for Web (Hightopo) 使用心得(5)- 动画的实现

其实,在 HT for Web 中,有多种手段可以用来实现动画。我们这里仍然用直升机为例,只是更换了场景。增加了巡游过程。 使用 HT 开发的一个简单网页直升机巡逻动画(Hightopo 使用心得(5)) 这里主…

UWB高精度定位系统项目源码

在现代社会中,精准定位技术对于各行各业都至关重要。为了满足对高精度定位的需求,超宽带(Ultra-Wideband, UWB)技术应运而生。UWB高精度定位系统以其出色的定位精度和多样化的应用领域而备受关注。本文将深入探讨UWB高精度定位系统…

算法基础之字符串哈希

字符串哈希 核心思想&#xff1a;用p(131或者13331)进制数储存字符串每一位数的hash值 L—R的哈希值 h[R]-h[L-1]*PR-L1 哈希值很大—>modQ(264)变小 用unsigned long long 存 (出界) #include<iostream>using namespace std;typedef unsigned long long ULL;co…

C++输出100以内的素数

以下是一个简单的C程序&#xff0c;用于输出100以内的所有素数&#xff1a; #include <iostream>using namespace std;int main() { int num, i, flag 0; for(num 2; num < 100; num) { flag 0; for(i 2; i < num/2; i) { if(…

力扣日记11.30-【二叉树篇】平衡二叉树

力扣日记&#xff1a;【二叉树篇】平衡二叉树 日期&#xff1a;2023.11.30 参考&#xff1a;代码随想录、力扣 110. 平衡二叉树 题目描述 难度&#xff1a;简单 给定一个二叉树&#xff0c;判断它是否是高度平衡的二叉树。 本题中&#xff0c;一棵高度平衡二叉树定义为&#…

量子模拟技术突破!科学家将化学过程减慢 1000 亿倍

悉尼纳米科学中心的 Pablo Fernandez Peas 教授&#xff08;左&#xff09;、Ivan Kassal 副教授和 Tingrei Tan 博士。 &#xff08;图片来源&#xff1a;网络&#xff09; 在澳大利亚悉尼纳米科学中心&#xff0c;由悉尼医学院、物理和化学系组成的跨学科团队正在利用量子技…

【开发实践】使用jstree实现文件结构目录树

一、需求分析 因开发系统的需要&#xff0c;维护服务端导出文件的目录结构。因此&#xff0c;需要利用jstree&#xff0c;实现前端对文件结构目录的展示。 【预期效果】&#xff1a; 二、需求实现 【项目准备】&#xff1a; jstree在线文档&#xff1a;jstree在线文档地址 …

Java核心知识点整理大全23-笔记

目录 21. JAVA 算法 21.1.1. 二分查找 21.1.2.冒泡排序算法 21.1.3. 插入排序算法 21.1.4. 快速排序算法 21.1.1. 希尔排序算法 21.1.2. 归并排序算法 21.1.3. 桶排序算法 21.1.4. 基数排序算法 21.1.5. 剪枝算法 21.1.6. 回溯算法 21.1.7. 最短路径算法 21.1.8. 最…

正则表达式【C#】

1作用&#xff1a; 1文本匹配&#xff08;验证字符串&#xff09; 2查找字符串 2符号&#xff1a; . ^ $ * - ? ( ) [ ] { } \ | [0-9] 匹配出数字 3语法格式&#xff1a; / 表示模式 / 修饰符 /[0-9]/g 表示模式&#xff1a;是指匹配条件&#xff0c;要写在2个斜…

【C++高阶(六)】哈希的应用--位图布隆过滤器

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:C从入门到精通⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习C   &#x1f51d;&#x1f51d; 哈希的应用 1. 前言2. 位图的概念以及定义3. 位…

使用 Docker 安装和配置 MySQL 数据库简介

目录 一、使用镜像安装 1、查询镜像 2、拉取镜像 3、查看本地镜像 4、启动docker镜像 二、使用Docker Compose安装 1、安装Docker和Docker Compose 2、创建Docker Compose文件&#xff1a; 3、启动MySQL容器 4、验证MySQL容器是否正常运行 5、连接到MySQL容器 6、停止…

java Stream流操作

什么是Stream&#xff1f; java8新增Stream&#xff0c;配合同版出现的Lambda&#xff0c;为集合&#xff08;Collection&#xff09;操作提供了极大的便利。 Stream将要处理的元素集合看作一种流&#xff0c;在流的过程中&#xff0c;借助Stream API对流中的元素进行操作&am…

004:Direct 2D离屏渲染(Qt中实现)

简介&#xff1a; 用QT开发图像显示的小程序&#xff0c;需要一些标注工具&#xff0c;由于用的是opengl渲染&#xff0c;所以就在内存中进行绘制&#xff0c;然后纹理贴图贴出去&#xff0c;发现Qt绘制的效果太差&#xff0c;且速度一般&#xff0c;于是就想着用direct2d来绘制…

python——第十五天

面向对象和面向对象编程 面向对象编程&#xff1a; C语言是一门面向过程的编程语言&#xff01;&#xff01;&#xff01; 面向对象的编程思想 就是分门别类的一种能力 面向对象的概念 类&#xff1a; 对一类事物的统称 对象&#xff1a; 一类事物中的具体案例 面向对象的…