# 数据挖掘期末大作业
## 研究内容
根据数据进行分类模型的构建
#### 要求:
- 用python实现学习算法
- 至少实现2-3种不同类型的学习算法(贝叶斯、神经网络、决策树等)
- 要求比较和分析通过不同学习算法建立的模型的准确率
- 数据自行查找合适的数据源,但不得少于1000条
#### 研究环境
系统环境: Windows 10 学生版
语言环境: Python 3.7
IDE: PyCharm
## 研究过程
#### 数据选择
数据选取: Kaggle的San Francisco Crime Classification
数据链接: [https://www.kaggle.com/c/sf](https://www.kaggle.com/c/sf-crime/data)[-](https://www.kaggle.com/c/sf-crime/data)[crime/data](https://www.kaggle.com/c/sf-crime/data)[ ](https://www.kaggle.com/c/sf-crime/data)
#### 数据预处理
1.查看数据
![](https://www.writebug.com/myres/static/uploads/2022/4/24/ecf66167e299f4924f9a38da6678290c.writebug)
总共有87w+的数据,9列属性,Category是我们的标签属性。
‘Dates’:犯罪日期时间
‘Category’:犯罪类型
‘Descript’:犯罪描述
‘DayOfWeek’:犯罪时间星期几 ‘PdDistrict’:犯罪地区
‘Resolution’:犯罪后的处理
‘Address’:犯罪地址
‘X’ ‘Y’ :犯罪地址坐标
2.数据分析
随机抽取1200条数据作为训练集,在训练集里抽取200条作为测试集。
![](https://www.writebug.com/myres/static/uploads/2022/4/24/77c82f70400ed9599069fdeb16abd95c.writebug)
标签集有23种
根据观察,最终决定取‘Dates’,‘PdDistrict’,‘DayOfWeek’作为条件属性
Dates的格式是 2014-11-27 22:14:00,但是我们取hour作为研究属性
可知分布也在0-23点之间
![](https://www.writebug.com/myres/static/uploads/2022/4/24/4acf7c7d26fd9918efda6d2860bb2016.writebug)
PdDistrict不同地区也达到了10个
![](https://www.writebug.com/myres/static/uploads/2022/4/24/1ea5f99367efd446d1950ee18ac0ca80.writebug)
DayOfWeek星期也达到了7个
![](https://www.writebug.com/myres/static/uploads/2022/4/24/2dbb13b24c4fcee5241a040ec6bc883f.writebug)
说明这些属性作为条件数据可靠。
3.特征处理
考虑到作为属性都不是数字,为了方便处理,把条件根据属性值的不同转化为数字。
![](https://www.writebug.com/myres/static/uploads/2022/4/24/6f3a9028f944781d673c9c6944e8c99f.writebug)
对于神经网络分类算法,需要对标签进行二进制矩阵化
![](https://www.writebug.com/myres/static/uploads/2022/4/24/b733a1df61ed9cb9b9a5338d2aec5d83.writebug)
#### 算法实现
##### 朴素贝叶斯实现
![](https://www.writebug.com/myres/static/uploads/2022/4/24/ae20678d42fcf3a102b408bee0c587e5.writebug)
根据朴素贝叶斯公式,
要求P(Category=?| Dates,DayOfWeek,PdDistrict)则可以求 P( Dates,DayOfWeek,PdDistrict | Category=?) * P( Category = ? ) / P(Dates,DayOfWeek,PdDistrict)
由于我们要通过此算法模拟分类,所以我们进行比较只需要计算分子部分即可。
对此,实现算法我们只需要通过已知的的训练集,计算出所有P( Dates,DayOfWeek,PdDistrict | Category=?)与P(Category = ?),在测试时,计算每一类的最终概率值,就能比较得出哪一类概率最大。
```c++
Class Bayes:
calc_p_y(self,column_y_val):
calc_p_x_y(self,column_x_val,column_y_val):
set_test_x(self,Dates,DayOfWeek,PdDistrict):
predict_one(self,column_x_val):
predict_all(self,test_set):
```
方法实现:
```c++
calc_p_y
```
传入Category类别值,通过遍历训练集统计count值,最终计算返回占比率
```c++
calc_p_x_y
```
传入数据集条件与类别值,遍历数据集该类别下各条件的比例,并进行相乘,最终计算返回占比率
```c++
set_test_x
```
传入预测条件,返回列表形式
```c++
predict_one
```
传入列表形式的条件,计算每一类的最终概率,最终得出概率最大的类别。
predict_all 传入测试集,循环进行predict_one方法,最终返回正确率。
##### 决策树分类实现
根据决策树分类原理的信息增益熵来按次序分类,通过Gain(S,A)作为信息增益熵。
![](https://www.writebug.com/myres/static/uploads/2022/4/24/3490ceb402f2be907f17357bfd1c9291.writebug)
![](https://www.writebug.com/myres/static/uploads/2022/4/24/c5cc34ca97e6c6fc3a469088948d6a3e.writebug)
决策树分类是通过sklearn库的方法调用实现。模拟完成后,输出准确率,生成决策树文件,需要通过GvEdit软件打开。
![](https://www.writebug.com/myres/static/uploads/2022/4/24/3b32d7678b3e61571b754125186c73b9.writebug)
##### 神经网络实现
```c++
Class NeuralNetwork:
__init__(self,neuron_list):
fit(self, X, y, learning_rate=0.2, epochs=10000):
predict_one(self, x):
predict_all(self,test_x,test_y):
```
**方法实现**:
```c++
__init__
```
初始化模型,neuron_list作为神经元列表传入模型,将权值全部随机赋值。
```c++
fit
```
训练函数,将学习速率,更新最大次数,训练集和标签集作为输入,随机选取训练集某一行,对网
络进行更新,进行正向更新,之后计算权重后,通过随机梯度函数进行反向更新权值。
```c++
predict_one
```
根据传入训练集的一项,预测标签类别。
```c++
predict_all
```
一次性预测整个训练集,并输出混淆矩阵和分类情况。
#### 结果对比
| |朴素贝叶斯 |决策树 |神经网络 |
|----|----|----|----|
| 准确率 |0.3 |0.07 |0.08-0.20 |
#### 结果分析
- 朴素贝叶斯由于数据较多,表现较好;
- 而决策树条件太多24*7*10=1680个分类节点,使得决策树过于肿胀,导致准确率很低。
- 神经网络稳定性不高,很可能是它是局部最优搜索方法,很可能会陷入局部极值,使训练失败,条件太多,可能会出现“过拟合”的现象。
#### 结论
各分类算法各有各的优点,对于贝叶斯实现简单,数据越多,可能表现越好,越准确,但是仅仅在各条件之间相互独立,这个情况在实际应用中往往不成立,随着属性的增多,分类效果会下降。
对于决策树分类算法,前期的数据预处理很重要,如果标签类太多,条件太多,决策树可能会变得很庞大,加入旧的数据效果可能不错,但当加入一个全新的数据,决策树分类效果可能会下降。
对于神经网络分类算法,其能够自适应学习,是现在比较火的学习方法,但是在实际应用中学习成本较高,并且容易被无关数据干扰。
## 研究总结
这次作业主要研究了三种分类算法,其中朴素贝叶斯分类算法是最容易实现的算法,而神经网络和决策树分类算法花了较长时间实现,可能是对算法理解还不是吃的很透。
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
结论 各分类算法各有各的优点,对于贝叶斯实现简单,数据越多,可能表现越好,越准确,但是仅仅在各条件之间相互独立,这个情况在实际应用中往往不成立,随着属性的增多,分类效果会下降。 对于决策树分类算法,前期的数据预处理很重要,如果标签类太多,条件太多,决策树可能会变得很庞大,加入旧的数据效果可能不错,但当加入一个全新的数据,决策树分类效果可能会下降。 对于神经网络分类算法,其能够自适应学习,是现在比较火的学习方法,但是在实际应用中学习成本较高,并且容易被无关数据干扰。 研究总结 这次作业主要研究了三种分类算法,其中朴素贝叶斯分类算法是最容易实现的算法,而神经网络和决策树分类算法花了较长时间实现,可能是对算法理解还不是吃的很透。
资源推荐
资源详情
资源评论
收起资源包目录
机器学习数据挖掘作业.rar (21个子文件)
机器学习数据挖掘作业
data_mining_code
neural_network.py 5KB
reports
20162180046陈钦海 研究报告.pdf 599KB
main.py 3KB
example.pdf 146KB
example.gv 293KB
LICENSE 1KB
dataset
train_sample.csv 178KB
test_sample.csv 30KB
.idea
workspace.xml 31KB
misc.xml 302B
data_mining.iml 398B
modules.xml 274B
Bayes.py 4KB
DTrees.py 3KB
__pycache__
data_process.cpython-36.pyc 2KB
Bayes.cpython-36.pyc 4KB
neural_network.cpython-36.pyc 5KB
DTrees.cpython-36.pyc 1KB
sklearn_demo.cpython-36.pyc 6KB
README.md 7KB
data_process.py 2KB
共 21 条
- 1
资源评论
计算机毕设论文
- 粉丝: 9988
- 资源: 398
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功