# 人工智能实验三:分类算法实验
## 一、实验目的
巩固4种基本的分类算法的算法思想:朴素贝叶斯算法,决策树算法,人工神经网络,支持向量机;
能够使用现有的分类器算法代码进行分类操作
学习如何调节算法的参数以提高分类性能;
## 二、实验的硬件、软件平台
硬件:计算机
软件:操作系统:WINDOWS/Linux
应用软件:C, Java或者Matlab或python
## 三、实验内容及步骤
利用现有的分类器算法对文本数据集进行分类
实验步骤:
了解文本数据集的情况并阅读算法代码说明文档;
编写代码设计朴素贝叶斯算法,决策树算法,人工神经网络,支持向量机等分类算法,利用文本数据集中的训练数据对算法进行参数学习;
利用学习的分类器对测试数据集进行测试;
统计测试结果;
#### 四、思考题:
如何在参数学习或者其他方面提高算法的分类性能?
# 实验步骤
数据集读取
总共给出了三个数据集:data集,predict集,test集,从名字可以看出,data集用于训练,test集用于测试,predict集用于验证算法分类的性能。
```
data = pd.read_csv("C:/Users/a2783/Desktop/AI/Exp/Exp3/dataset.txt")
pred = pd.read_csv("C:/Users/a2783/Desktop/AI/Exp/Exp3/predict.txt")
test = pd.read_csv("C:/Users/a2783/Desktop/AI/Exp/Exp3/test.txt")
```
由于数据以文本形式存储,需要转换成对应的数值类型。这里采用的方法是,对于每一个特征,遍历其所有的类别,将每一个类别赋予一个值。每个特征值得范围从1开始,最大即特征对应的类别得种类数:
```
for i in data.columns[:-1]:
cnt = 1
feature = data[i]
feature = np.array(feature)
for j in np.unique(feature):
data.loc[data[i] == j, i] = cnt
pred.loc[pred[i] == j, i] = cnt
test.loc[test[i] == j, i] = cnt
cnt += 1
```
由于之后做分类时,要求标签从0开始,所以对于`Class_Values`的值从0开始:
```
cnt = 0
for j in np.unique(data[data.columns[-1]]):
data.loc[data[data.columns[-1]] == j, data.columns[-1]] = cnt
pred.loc[pred[data.columns[-1]] == j, pred.columns[-1]] = cnt
test.loc[test[data.columns[-1]] == j, test.columns[-1]] = cnt
cnt += 1
```
至此,数据处理完毕。
#### 朴素贝叶斯
##### 基础理论
贝叶斯公式:
![](img/1.png)
其中,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)即似然。
但是根据贝叶斯公式,若要估计后验概率,由于类条件概率为数据的所有属性上的联合概率,所有在样本集中较难直接估计得等到。所以朴素贝叶斯算法采用了属性条件独立性假设,假设所有属性相互独立,因此可得公式:
![](img/2.png)
所以,对于分类任务,可以由公式:
![](img/3.png)
来选择最大的值作为当前样本的分类。
对于朴素贝叶斯算法,可以在数据集中直接估计得到类先验概率以及条件概率
![](img/4.png)
如果属性是连续属性,那么可以根据概率密度函数来计算得到条件概率,假设其服从高斯分布,其![](img/6.png)第c类样本在第i个属性上的均值和方差。
拉普拉斯平滑
考虑到样本集中的样本并不是完全的,可能存在某个类的某个属性没有出现,所以采用拉普拉斯平滑,避免未出现的属性携带的信息被抹去。主要就是在求条件概率和先验概率时,将分子加上λ ,相应的分母加上∣ D ∣ ∗ λ 。本次实验中采用的是最简单的采用λ = 1
![](img/5.png)
##### 实验代码
###### 训练
计算先验概率:
```
for i in np.unique(np.array(y)):
self.prior[i] = (y.count(i) + self.L) / (len(y) + len(np.unique(np.array(y))))
```
计算条件概率:
```
for c in np.unique(np.array(y)):
D_c = Data.loc[Data[Data.columns[-1]] == c]
for x in feature:
for i in np.unique(np.array(Data[x])):
D_x = D_c.loc[D_c[x] == i]
before = str(x) + "," + str(i)
after = str(c)
key = before + "|" + after
self.P[key] = (len(D_x) + self.L) / (len(D_c) + len(np.unique(np.array(Data[x]))))
```
这里存储的方式都采用字典(Dict)的方式,对于条件概率,key使用字符串形式表示,将其各个特征的值转换为字符串并拼接来作为key。
整体代码:
```
def fit(self, Data: pd.DataFrame):
y = Data.iloc[:, -1]
y = list(y)
feature = Data.columns[:-1]
# priority
for i in np.unique(np.array(y)):
# 拉普拉斯平滑
self.prior[i] = (y.count(i) + self.L) / (len(y) + len(np.unique(np.array(y))))
# given
for c in np.unique(np.array(y)):
D_c = Data.loc[Data[Data.columns[-1]] == c]
for x in feature:
for i in np.unique(np.array(Data[x])):
D_x = D_c.loc[D_c[x] == i]
# 将属性转换为字符串形式 作为key
before = str(x) + "," + str(i)
after = str(c)
key = before + "|" + after
# 拉普拉斯平滑
self.P[key] = (len(D_x) + self.L) / (len(D_c) +
len(np.unique(np.array(Data[x]))))
```
传入的Data即训练集
###### 预测
具体的方式就是取出每一个待预测的样本,根据朴素贝叶斯的公式,取出每个属性的值进行连乘,最后选取概率最大的作为当前的预测标签,最终返回
```
def pred(self, Data: pd.DataFrame) -> Tuple[List[str], List[str]]:
ans = []
acc = []
for _, val in Data.iterrows():
ret = None
mle = 0
for c in self.prior.keys():
pred = self.prior[c]
for idx in range(len(Data.columns[:-1])):
feature = Data.columns[idx]
cls = val[idx]
key = str(feature) + "," + str(cls) + "|" + str(c)
pred *= self.P[key]
if pred > mle:
mle = pred
ret = c
ans.append(ret)
if ret == val[-1]:
acc.append(1)
else:
acc.append(0)
return ans, acc
```
结果
在perdict集上正确率为:0.8095238095238095
决策树
基础理论
决策树学习本质是从训练数据集中归纳出一组分类规则,在每个结点进行分裂,将原本的数据集进行划分,最终得到叶子结点,即当前数据的标签,也就是之后预测的结果。基于树结构的算法都有一个比较好的特点:不需要进行特征的归一化,而且训练速度较快。
不同的决策树算法采用不同的分裂依据。
ID3
ID3决策树使用信息增益来作为分裂依据,通过计算当前数据集中,信息增益最大的特征作为划分依据,将数据集划分为多个子数据集,作为当前节点的分支。
信息熵:用来表示当前的样本集合纯度
![](img/7.png)
*pk*为第k类样本所占的比例
信息增益:
![](img/8.png)
其中,D为当前结点的数据集,v为其特征
从而,对于每一个特征计算信息增益,选择最大的特征作为分类的依据,从而得到该节点的子结点,一直递归的执行,直到到达叶子节点:均属于同一类样本或没有特征可供选择,对于后者,选取当前数据集中,包含最多样本的类别作为当前叶子结点的值。
C4.5
C4.5算法与ID3算法相似,不过其采用信息增益率而非信息增益来选择最优化分属性。除此之外,还支持预剪枝以及后剪枝的方法。
信息增益率
![](img/9.png)
IV(a)表
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
利用现有的分类器算法对文本数据集进行分类 实验步骤: 了解文本数据集的情况并阅读算法代码说明文档; 编写代码设计朴素贝叶斯算法,决策树算法,人工神经网络,支持向量机等分类算法,利用文本数据集中的训练数据对算法进行参数学习; 利用学习的分类器对测试数据集进行测试; 统计测试结果;
资源推荐
资源详情
资源评论
收起资源包目录
100012174-基于Pthon进行分类算法实验(人工智能).zip (23个子文件)
ai_exp_03
LICENSE 1KB
dataset.txt 51KB
img
10.png 26KB
9.png 38KB
3.png 20KB
12.png 161KB
15.png 125KB
1.png 18KB
11.png 24KB
13.png 211KB
6.png 8KB
5.png 24KB
4.png 21KB
8.png 25KB
17.png 64KB
16.png 8KB
7.png 20KB
2.png 26KB
14.png 61KB
test.txt 40KB
Exp3.py 14KB
predict.txt 11KB
README.md 23KB
共 23 条
- 1
资源评论
神仙别闹
- 粉丝: 2671
- 资源: 7640
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- XILINXFPGA源码Xilinxspratan3xcs100E(VGAPS2)
- XILINXFPGA源码XilinxSPARTAN-3E入门开发板实例
- XILINXFPGA源码XilinxSdramVerilog和VHDL版本文档
- 物联网智能家居方案-基于Nucleo-STM32L073&机智云(大赛作品,文档齐全,可直接运行)(文档加Matlab源码)
- XILINXFPGA源码XilinxISE9.xFPGACPLD设计源码
- 成都市地图含高新区(高新南区,高新西区),天府新区,东部新区虚拟行政区划
- XILINXFPGA源码XilinxEDK设计试验
- XILINXFPGA源码XilinxEDKMicroBlaze内置USB固件程序
- 基于 django 的视频点播后台管理系统源代码+数据库
- 基于Java的网上医院预约挂号系统的设计与实现(部署视频)-kaic.mp4
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功