【模式识别】实验二:决策树——籍贯分类器

籍贯分类器

数据预处理

由于籍贯是新的分类量,原始数据存在部分错误的”脏“数据,还有不同标准情况下填写的籍贯信息。在分类的第一步对所有的籍贯信息进行整理是十分有必要的。

地理信息提取

我们按照以下步骤进行处理:

  1. 原始数据提取并转换成numpy格式

  2. 调用接口,建立”中国地理信息库“

    ​ 数据转换后,需要提供一个标准数据库用以检索筛选。这里我们使用高德地图开发者API,考虑数据库规模以及实际填表情况,我们只调用全中国所有市级及以上行政单位信息。接口返回JSON格式信息,如下图所示。

在这里插入图片描述

​ 我们对JSON数据进行提取,并按照中文习惯重新构建地理字典。在中文里,我们习惯将籍贯信息后面的省、市、自治区、特别行政区等进行简写,如”江苏省南京市“我们一般直接写成”江苏南京“。所以我们的字典里将相关信息删去,这样构建字典不仅可以为后面正则匹配提高准确率,还可以减小数据库规模。我们将构建好的数据库以JSON格式文件保存在本地,这样下次调用就无需再请求API。

  1. 正则匹配

    ​ 数据库建立完成后,我们就可以在进行查找匹配了。我们将数据库以字典形式导入,字典键值分别为市级单位及其对应的省级单位。我们采用二次全局正则匹配的方式进行匹配:即第一次以省级单位作为模板对待匹配籍贯进行查找,若检索到则对原始值进行标准替换;否则再以市级单位进行查找,若检索到则直接对原始值以库内键值对应标准省级名称进行替换;若两次检索均失败,则抛出错误,进行人工手动标注。

    ​ 最终经过匹配,在前期处理过后的437条数据中,共有432条数据匹配成功,5条匹配失败。这5条数据分别为:

    原始序号原始籍贯信息
    9重亲
    212寿光
    215吴浪
    216贺星
    341雷皓云

    ​ 可以看到,这5条数据的匹配失败大致缘于3个原因:第9条数据将重庆误写成“重亲”;第212条数据“寿光”为山东潍坊市县级行政单位;第215、216、341条数据不存在中国的行政区划内,考虑可能将姓名误填成籍贯。

    ​ 对第9、第212数据,我们将其修改正确后重新投入数据集,而最后三条数据由于缺乏其它可以佐证的信息,无法推断修正籍贯,故在籍贯分类器设计里将其去除。最终,我们获得了拥有434条数据,以省为元素的标准籍贯数据集。其中各省份统计如下表所示:

    籍贯数量籍贯数量
    四川129甘肃10
    河南36广东9
    江西26贵州9
    重庆24江苏7
    安徽24广西6
    山东22内蒙古5
    湖北20吉林3
    湖南15新疆3
    陕西14辽宁3
    河北14黑龙江3
    福建13天津2
    山西13北京1
    浙江11海南1
    云南11
地理信息划分
1. 按省份划分

从上一步的表格信息可以看出,我们的数据集分散分布在27个省份,且各个省份之间差距较大,显然直接按省份分类是不合理的。按照基本的理解,我们首先想到的就是去掉部分数量很小的省份。

小于10的省份并合并成其它,将生成的标准数据图进行数据统计,可以统计出各个省级单位的人员分布情况,如下图表所示:

在这里插入图片描述

从图上看出,虽然数据较之前密集了,但依然存在很多的类别。这种方式训练的决策树对判断是不利的,从下文的结果也可以佐证我们的猜想。

2. 按地理分区划分

既然直接省份划分不太合理,那我们就需要寻找一种合适的分类方式来对分类输出进行归并,解决输出的稀疏性问题。这里我参照百度词条:中国地理区划,将省份信息进行划分归组。

地理分区
地区名称范围
北方地区北京、天津、河北、山西、陕西、河南、山东 、黑龙江、吉林、辽宁
南方地区江苏、安徽、浙江、上海、湖北、湖南、江西、福建、云南、贵州、四川、重庆、陕西、广西、广东、香港、澳门、海南、台湾、河南
西北地区内蒙古、新疆、宁夏、甘肃
青藏地区青海、西藏

行政分区
地区名称范围
华北北京市、天津市、河北省、山西省、内蒙古自治区
东北黑龙江省、吉林省、辽宁省
华东上海市、江苏省、浙江省、安徽省、江西省、山东省、福建省,以及台湾省
华中河南省、湖北省、湖南省
华南广东省、广西壮族自治区、海南省,以及香港特别行政区、澳门特别行政区
西南重庆市、四川省、贵州省、云南省、西藏自治区
西北陕西省、甘肃省、青海省、宁夏回族自治区、新疆维吾尔自治区、内蒙古自治区

在这里插入图片描述

经济分区
地区名称范围
东部北京、天津、河北、辽宁、上海、江苏、浙江、福建、山东、广东、广西、海南
中部山西、内蒙古、吉林、黑龙江、安徽,江西、河南、湖北、湖南
西部重庆、四川、贵州、云南、西藏、陕西、甘肃、青海、宁夏、新疆

在这里插入图片描述

生成决策树

按照不同形式进行省份划分后,我们可以根据各个形式划分的方式进行决策树的搜索生成,并对比结果。我们利用sklearn官方库的寻优迭代器进行自动调参,并以5*5交叉验证后的平均准确率作为评估指标。下面是我们实验的结果。

按省份划分

寻优调参后,最大得分划分结果如下,以省份划分之后检测平均准确率为25%:

在这里插入图片描述

按地理分区划分

寻优调参后,最大得分划分结果如下,以省份划分之后检测平均准确率为65%:

在这里插入图片描述

按行政分区划分

寻优调参后,最大得分划分结果如下,以地理分区划分之后检测平均准确率为40%:

在这里插入图片描述

按经济分区划分

寻优调参后,最大得分划分结果如下,以地理分区划分之后检测平均准确率为35%:

在这里插入图片描述

对比分析

经过前面对籍贯进行不同形式的归并,并统计结果统计后,我们发现将省份以地理分区归并对决策树的准确率提升较为明显。一开始,我们考虑到可能是由于分区较少导致对决策树准确率的提升。但在同样较少分区的经济分区划分方式里,决策树的平均准确率却只有地理分区的一半。最终我们猜测,可能是地理分区的籍贯划分方式符合我们数据集的潜藏特征分布,换句话说,也许按照地理分区的划分能够更明显的由数据集里的特征找到对应关联。

改进算法

随机森林

综上,虽然按照地理分区的划分方式我们大大提高了准确率,但还有没有方法提升我们的模型效果呢?

经过研究,我们决定再尝试Bagging里最典型的随机森林算法,用随即森林对决策树进行改进并与原始决策树进行评估,最终10次交叉验证后的准确率对比如下图:
在这里插入图片描述

可以看出,使用随机森林算法对分类效果进一步产生了提升。经过比较,平均准确率相比决策树提高了约5%,这说明我们的改进是有意义的。

参考文献

https://scikit-learn.org/stable/modules/tree.html

https://blog.csdn.net/fuqiuai/article/details/79496005

https://zhuanlan.zhihu.com/p/123003914

https://stats.stackexchange.com/questions/105760/how-we-can-draw-an-roc-curve-for-decision-trees

https://www.cnblogs.com/ycycn/p/14063840.html

https://scikit-learn.org/stable/auto_examples/tree/plot_cost_complexity_pruning.html#sphx-glr-auto-examples-tree-plot-cost-complexity-pruning-py

https://www.cnblogs.com/genyuan/p/9828457.html

https://blog.csdn.net/luteresa/article/details/104927276

https://blog.csdn.net/R18830287035/article/details/89257857

https://www.cnblogs.com/genyuan/p/9828457.html

https://blog.csdn.net/luteresa/article/details/104927276

https://blog.csdn.net/R18830287035/article/details/89257857

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mr.Idleman

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值