上一篇文章讲解了数据挖掘环境的配置,那这次就从一个小的实战开始吧。这次要学习的是KMeans算法,要挑战的是sofasofa上的一个竞赛(交通事故理赔审核预测)。现在开始吧
K-means
介绍
K-Means是基于划分的聚类方法,他是数据挖掘十大算法之一。基于划分的方法是将样本集组成的矢量空间划分为多个区域,每个区域都存在一个样本中心,通过建立映射关系,可以将所有样本分类到其相应的中心。
假设有样本集合D=,KMeans算法的目标是将数据划分为K类:S=,并且使划分后的K个子集合满足类内误差平方和最小。目标函数:其中
Ci即划分后的子集合的中心。
求解步骤
求解目标函数是一个NP-hard问题,无法保证得到的就是全局最优解。在经典K-Means聚类算法中采取迭代优化策略,一般包含以下四个步骤
1.初始化聚类中心
2.分配个样本xj到相近的聚类集合,依据是(p!=j)
3.根据步骤二结果,更新聚类中心。
4.若达到最大迭代步数或两次迭代差小于设定的阈值则算法结束,否则重复步骤2。
算法改进
经典的K-means算法在初始化聚类中心时采用的是随机采样的方式,不能保证得到期望的聚类结果,可以选择重复训练多个模型,选取其中表现最好的。但有没有更好的方法呢?David Arthur提出的K-means++算法能够有效的产生初始化的聚类中心。
首先随机初始化一个聚类中心C1,然后通过迭代计算最大概率值X*,将其加入到中心点中,重复该过程,直到选择k个中心。
交通事故理赔审核预测
SofaSofa是专门为数据挖掘新人准备练手比赛的地方,这的比赛都会提供几个标杆模型的代码给你参考,新手想要快速入门可以多去这个网站上看看。
赛题
这个比赛的链接:http://sofasofa.io/competition.php?id=2
任务类型:二元分类
背景介绍:在交通摩擦(事故)发生后,理赔员会前往现场勘察、采集信息,这些信息往往影响着车主是否能够得到保险公司的理赔。训练集数据包括理赔人员在现场对该事故方采集的36条信息,信息已经被编码,以及该事故方最终是否获得理赔。我们的任务是根据这36条信息预测该事故方没有被理赔的概率。
数据介绍:
评价方法:Precision-Recall AUC
代码
在官方下载好数据集,在本地解压。打开jupyter notebook开始动手。首先导入必要的包
读入数据集
参照数据说明,CaseID这列是没有意义的编号,因此这里将他丢弃。
~drop()函数: 指沿着哪个轴,0为行,1为列; 指是否在原数据上直接操作
快速了解数据
~head():默认显示前5行数据,可指定显示多行,例如.head(50)显示前50行
显示数据简略信息,可以每列有多少非空的值,以及每列数据对应的数据类型。
以图的形式,快速了解数据
~hist():绘制直方图,参数 可指定输出图片的尺寸。
关于绘图可参考我之前的一篇文章,一文教会你使用Matplotlib绘图
想要了解特征之间的相关性,可计算相关系数矩阵。然后可对某个特征来排序。
从训练集中分离标签
使用K-Means训练模型
KMeans(): 指要预测的有几个类; 指初始化中心的方法,默认使用的是 方法,而非经典的K-means方法的随机采样初始化,当然你可以设置为 使用随机初始化; 指定使用CPU核心数,-1为使用全部CPU。
保存预测的结果
现在你可以在运行目录找到这个文件,在比赛网站上可提交查看实际分数。
标杆模型:随机森林
使用K-means可能得到的结果没那么理想。在官网上,举办方给出了两个标杆模型,效果最好的是随机森林。以下是代码,读者可以自己测试。
总结
K-means算法是数据挖掘的十大经典算法之一,但实际中如果想要得到满意的效果,还是非常难的,以后会讲到集成学习,使弱学习器进阶为强学习器。
关于数据挖掘的更多内容,我将持续更新在该项目,欢迎感兴趣的朋友赏个star:https://github.com/wmpscc/DataMiningNotesAndPractice
领取专属 10元无门槛券
私享最新 技术干货