分享

机器学习算法实战:使用聚类算法统计美国国会不同议员的投票主张

 新用户0175WbuX 2022-02-03

  现在有一个数据集是美国国会投票的数据,数据集如图所示:

  机器学习算法实战:使用聚类算法统计美国国会不同议员的投票主张

  数据集第一列为name,表示国会议员的名字,第二列为议员政党R是共和党,D是民主党,I是无党派人士

  后面的00001,00004表示的是法案的标号,0表示不支持,1表示支持

  我们现在并不知道这个数据集的一些情况,但是我们可以通过聚类算法来看一下这个数据集有哪些特点

  我们先来读取这个数据,然后看以下这些数据的均值,和各党派的人数

  机器学习算法实战:使用聚类算法统计美国国会不同议员的投票主张

  输出的结果为:

  机器学习算法实战:使用聚类算法统计美国国会不同议员的投票主张

  value_counts()表示每个类别中的人数,通过输出的这个结果,可以看出R共和党为54人,D民主党为44ren,I无党派人士为2个人,这就是所有的议会中人员的组成。后面的是输出的均值,也就是每个议案的均值得多少分,0是0分,1是1分,得分高表示支持率大。

  每个议员都会对每个法案投票,0是反对,1是支持,我们如何才能判断出两个议员之间的都投法案的相似度呢?我们可以使用欧式距离来表示两个样本之间的相似程度。

  它的公式为:

  机器学习算法实战:使用聚类算法统计美国国会不同议员的投票主张

  假如以下面的两个议员数据来分析两个一下这两个议员的相似度,来看一下两个议员之间投票的相似度。

  Cardin,D,MD,1,0,0,1,0,1,0,1,0,0,1,1,0,1,1Carper,D,DE,0,0,0,1,0,1,0,1,0,0,0,1,0,1,1

  那么此时x1=1,y1=0

  x2=0,y1=0

  以此类推,通过这个公式算出来的就是欧式距离,欧式距离越小就表示样本之间的差距越小,越相似。在python中已经封装好了这个方法,我们可以通过调用这个方法来完成计算欧式距离的操作

  机器学习算法实战:使用聚类算法统计美国国会不同议员的投票主张

  这个euclidean_distances为欧式距离,可以通过这个方法来计算欧式距离

  votes.iloc[0,3:]获取第一行的第三列开始的所有数据

  votes.iloc[1,3:]获取第二行的第三列开始的所有数据

  默认是数据是列的形式,然后改变其形状改成(1,-1),也就是行的形式

  输出的结果就是两个样本之间的距离。距离值为:[[1.73205081]]

  下面通过python的库来直接使用kmeans来聚合这些数据

  机器学习算法实战:使用聚类算法统计美国国会不同议员的投票主张

  这个表示聚合成两个簇,random_state表示两个中心点不是随机的,而是在random_state=1的那个固定的位置

  kmeans_model_transform表示拟合数据,它会将传入的数据聚类,聚成两类,拟合数据的返回值为样本距离聚簇中心点的距离

  机器学习算法实战:使用聚类算法统计美国国会不同议员的投票主张

  这个就是 senator_distances的值,是有多少个样本就有多少行,聚成多少个簇就有多少列,比如第一个【3.12141628 1.3134775】就表示该瘦身样本与聚簇中心1的距离是3.12141628,与聚簇中心2的距离是1.3134775,第二行就表示第二个样本分别与聚簇中心的距离。

  labels为聚类之后的类别,我们输出labels的结果为:

  机器学习算法实战:使用聚类算法统计美国国会不同议员的投票主张

  可以看出有些样本被分到了1,有些样本被分到了0,那么这就表示分类成功了,为了更加清晰的可以看出聚类的情况,我们可以以图像的形式进行显示:

  机器学习算法实战:使用聚类算法统计美国国会不同议员的投票主张

  机器学习算法实战:使用聚类算法统计美国国会不同议员的投票主张

  通过图,我们可以看出这些样本点的聚类情况,我们还可以使用另外一种方式

  print(pd.crosstab(labels, votes["party"]))

  交叉表crosstab,可以按照指定的行和列统计分组频数,用起来非常方便,行就是labels,列就是votes["party"],我们输出它的效果为:

  机器学习算法实战:使用聚类算法统计美国国会不同议员的投票主张

  这个看着很清晰,可以看出D党派的聚类中有41个人聚到了0,还有3个人聚到了1

  而R党派中全部的54个人都聚到了类别1中,这就是非常直观的情况

  我们可以通过这个还可以发现,D党派中有3个人是偏向R党派的,所以我们下面的任务是把这些人给找出来,来看这三个人究竟是谁?

  democratic_outliers=votes[(labels==1) & (votes["party"]=="D")]

  print(democratic_outliers)

  这个代码就是选出聚类类别是1的,并且党派还是D的,我们输出这个,就可以看到这三个人究竟是谁?

  机器学习算法实战:使用聚类算法统计美国国会不同议员的投票主张

  我们已经将数据聚成了两个类,但是有一种点叫做离群点,就是说这个样本点无论它属于哪个簇,它距离所有簇的中心点都是很远的额,这就是离群点。我们通过什么样的方式才能找到这样的离群点呢?

  我们在上面已经获取了样本与聚簇中心点之间的距离 senator_distances,所以只要距离和最大的就是离群点了,但是有一种情况是他恰好在两者的中间的位置,那么它不是离群点,但是它距离聚簇中心点的距离和加起来也不小,为了防止出现这种问题,我们不能简单的相加,而是将其来个立方,这样的话,刚才的情况的值会很小。

  机器学习算法实战:使用聚类算法统计美国国会不同议员的投票主张

  这个就是将样本与聚簇中心点的距离算一个立方,然后加起来,然后创造一个新的列extremism,然后对votes根据extremism进行排序,输出结果为:

  机器学习算法实战:使用聚类算法统计美国国会不同议员的投票主张

  可以每个样本与聚簇中心的距离,越大就表示越远,可以定义为离群点。

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多