text: 湖南大学人工智能实验三：分类算法实验
  巩固4种基本的分类算法的算法思想：朴素贝叶斯算法，决策树算法，人工神经网络，支持向量机；能够使用现有的分类器算法代码进行分类操作学习如何调节算法的参数以提高分类性能；硬件：计算机软件：操作系统：WINDOWS／Linux应用软件：C, Java或者Matlab或python利用现有的分类器算法对文本数据集进行分类实验步骤：了解文本数据集的情况并阅读算法代码说明文档；编写代码设计朴素贝叶斯算法，决策树算法，人工神经网络,支持向量机等分类算法，利用文本数据集中的训练数据对算法进行参数学习；利用学习的分类器对测试数据集进行测试；统计测试结果；如何在参数学习或者其他方面提高算法的分类性能？数据集读取 总共给出了三个数据集：data集，predict集，test集，从名字可以看出，data集用于训练，test集用于测试，predict集用于验证算法分类的性能。由于数据以文本形式存储，需要转换成对应的数值类型。这里采用的方法是，对于每一个特征，遍历其所有的类别，将每一个类别赋予一个值。每个特征值得范围从1开始，最大即特征对应的类别得种类数：由于之后做分类时，要求标签从0开始，所以对于Class_Values的值从0开始：至此，数据处理完毕。贝叶斯公式：其中，P ( B ) P(B)P(B)为归一化因子，可以忽略，P ( A ) P(A)P(A)是先验概率，P ( A ∣ B ) P(A|B)P(A∣B)是后验概率，P ( B ∣ A ) P(B|A)P(B∣A)即似然。但是根据贝叶斯公式，若要估计后验概率，由于类条件概率为数据的所有属性上的联合概率，所有在样本集中较难直接估计得等到。所以朴素贝叶斯算法采用了属性条件独立性假设，假设所有属性相互独立，因此可得公式：所以，对于分类任务，可以由公式：来选择最大的值作为当前样本的分类。对于朴素贝叶斯算法，可以在数据集中直接估计得到类先验概率以及条件概率如果属性是连续属性，那么可以根据概率密度函数来计算得到条件概率，假设其服从高斯分布，其第c类样本在第i个属性上的均值和方差。拉普拉斯平滑 考虑到样本集中的样本并不是完全的，可能存在某个类的某个属性没有出现，所以采用拉普拉斯平滑，避免未出现的属性携带的信息被抹去。主要就是在求条件概率和先验概率时，将分子加上λ ，相应的分母加上∣ D ∣ ∗ λ 。本次实验中采用的是最简单的采用λ = 1计算先验概率：计算条件概率：这里存储的方式都采用字典(Dict)的方式，对于条件概率，key使用字符串形式表示，将其各个特征的值转换为字符串并拼接来作为key。整体代码：传入的Data即训练集具体的方式就是取出每一个待预测的样本，根据朴素贝叶斯的公式，取出每个属性的值进行连乘，最后选取概率最大的作为当前的预测标签，最终返回结果 在perdict集上正确率为：0.8095238095238095决策树 基础理论 决策树学习本质是从训练数据集中归纳出一组分类规则，在每个结点进行分裂，将原本的数据集进行划分，最终得到叶子结点，即当前数据的标签，也就是之后预测的结果。基于树结构的算法都有一个比较好的特点：不需要进行特征的归一化，而且训练速度较快。不同的决策树算法采用不同的分裂依据。ID3 ID3决策树使用信息增益来作为分裂依据，通过计算当前数据集中，信息增益最大的特征作为划分依据，将数据集划分为多个子数据集，作为当前节点的分支。信息熵：用来表示当前的样本集合纯度pk为第k类样本所占的比例信息增益：其中，D为当前结点的数据集，v为其特征从而，对于每一个特征计算信息增益，选择最大的特征作为分类的依据，从而得到该节点的子结点，一直递归的执行，直到到达叶子节点：均属于同一类样本或没有特征可供选择，对于后者，选取当前数据集中，包含最多样本的类别作为当前叶子结点的值。C4.5 C4.5算法与ID3算法相似，不过其采用信息增益率而非信息增益来选择最优化分属性。除此之外，还支持预剪枝以及后剪枝的方法。信息增益率IV(a)表示属性a的固有值。信息增益率对可取值数目较少的属性有所偏好，所以对C4.5算法进行改进，采用一个启发式来进行选择：从候选划属性中找到信息增益高于平均水平的属性，再从中选择增益率最高的。CART则采用基尼指数来进行划分属性的选择基尼值：基尼指数：与前两者不同，其选取的是基尼指数最小的属性作为最优化分属性，而且CART不仅可以用于分类，而且还可以用于回归。除了上述所说的，决策树多用于集成学习算法，如随机森林，GBDT等算法，都有比较好的效果。本次决策树的实验代码支持了上述三种构造的方法C4.5CART以上，ID3和C4.5都返回的是计算得到的该特征的信息增益或增益率，而CART则是返回基尼指数以及最小的属性值在此之后，就可以实现决策树的构造：由于CART为二叉树，并且划分依据与其他的不同，所以在这为了适配三种方法，采用了特殊的判断。最终，这个函数返回的是最优划分属性以及划分后的数据集，使用List[pd.DataFrame]表示预测预测部分与朴素贝叶斯相似，都是返回预测的预测集结果。在预测的过程中，同样的遍历每一个样例，取出当前树的划分依据，根据样例的属性来选择分支，一直继续直到到达叶子节点，此时，得到的就是该样例的预测结果。结果 在predict集上能够得到完全的预测。支持向量机 这一部分由于课本上并没有深入的介绍，所以我也没有具体去手动实现，因为SMO算法的实现确实有难度。理论基础 对于样本的分类，最基本的想法就是基于数据集D，在样本空间找到一个划分超平面，把不同类别的进行分开。而支持向量机，则是在该基础上，找到两个分类到达超平面的最大间隔最大，那么这一个超平面则是要学习到的超平面这里采用的是sklearn库的SVC方法采用了默认的参数，即使用高斯核，软间隔超参数C=1.0结果 能够做到 0.9206349206349206 的正确率神经网络 理论基础 简单来说，每个神经网络必有一层输入层，一层输出层，中间的隐层可以自行设置。输入层得大小即样本的特征数量，输出层的大小为分类的类别数目。对于每一个样本的输入，首先经过前向传播：简单的线性函数累加，再经过激活函数之后继续传递到下一层，到达输出层后计算误差，将误差进行反向传播，并对参数ω \omegaω进行优化。经过多次训练，直到损失函数收敛，训练结束。预测部分则将数据输入，得到每个输出神经元的值，从中选取最大的值最为当前样本的预测结果。采用了四层的神经网络，包含两个隐层，激活函数选择ReLU激活函数：在训练时，选择的优化器为随机梯度下降优化器，学习率默认为0.1，使用交叉熵作为损失函数，训练轮数默认5000轮：训练：预测则是输入数据，选择最大的类别作为当前的分类：每500次训练进行loss的输出以及准确率的查看最终预测结果为0.9682539682539683的准确率。若将轮数增大，准确率能够逼近1.0均为在perdict数据集上做预测的结果。显而易见的是，神经网络的分类方法能够适用于任何数据集，在模型搭建好之后，只需要进行训练，就可以得到不错的结果，训练的轮数越多，网络的层数越深，就能够得到约准确的分类，但是带来的时间开销也是巨大的。对于其他三种算法，支持向量机的性能是很不错的，泛化性能较强，而且是用于解决高维的问题；朴素贝叶斯较简单，由于是有坚实的数学基础所以其分类效率较稳定，但是需要直到其先验概率才可以进行学习；决策树的优点正如上述所讲，不需要进行特征归一化，但是其容易忽略样本特征之间的相关性，而且容易过拟合。对于参数的调整，支持向量机可以尝试不同的核，或者减少其软间隔系数，以使得分类效果更好，但是会降低其泛化性能；决策树则可以尝试不同的剪枝策略来提高其泛化能力；朴素贝叶斯则可以尝试进行不同的平滑策略，除了拉普拉斯平滑还可以选择lidstone平滑；而神经网络，则可以尝试增加训练轮数或者增大网络的深度来得到更好的分类结果，但是带来的代价则是时间开销的增大，此外还可以调整学习率来得到更好的训练结果。