【机器学习杂烩】投票(Voting)算法在分类问题上的应用(一口气实现Logistic 回归、SVM、KNN、C4.5 决策树、 Adaboost、GBDT 和随机森林,并集成起来)

2023-10-30

投票算法简介

投票是在分类算法中广泛运用的集成学习算法之一。投票主要有硬投票和软投票 两种。硬投票即各基分类器权重相同的投票, 其原理为多数投票原则:如果基分类器 的某一分类结果超过半数, 则集成算法选择该结果; 若无半数结果则无输出。软投票 的原理也为多数投票, 但是各基分类器投票所占的权重可自己定义。当各基分类器分类效果差异比较大时, 应当选择软投票, 赋予基础分类器更大的权重, 从而获得更好 的分类性能, 以此优化分类结果。

基分类器介绍

本文选取的 7 种基分类器分别为: Logistic 回归、SVM、KNN、C4.5 决策树、 Adaboost、GBDT 和随机森林。

Logistic 回归

Logistic 回归属于非线性回归, 适用于研究分类与影响因素之间关系的多重回归方 去, 核心公式为: f ( x ) = 1 1 + e − x , f ( x ) f(x)=\frac{1}{1+e^{-x}}, f(x) f(x)=1+ex1,f(x) 的范围为 ( 0 , 1 ) (0,1) (0,1) 。二分类变量的赋值将非糖尿 病患者定为 x = 0 x=0 x=0, 糖尿病患者定为 x = 1 x=1 x=1, 回归模型为 log ⁡ i t ( p ) = δ 0 + δ 1 × x \log i t(p)=\delta_{0}+\delta_{1} \times x logit(p)=δ0+δ1×x, 则对非 溏尿病患者有 log ⁡ i t ( p ) = δ 0 + δ 1 × 0 \log i t(p)=\delta_{0}+\delta_{1} \times 0 logit(p)=δ0+δ1×0 , 糖尿病患者有 log ⁡ i t ( p ) = δ 0 + δ 1 × 1 \log i t(p)=\delta_{0}+\delta_{1} \times 1 logit(p)=δ0+δ1×1 。偏回归系数 δ 0 , δ 1 \delta_{0}, \delta_{1} δ0,δ1 的估计采用极大似然估计。在传统分类问题中, Logistic 模型准确率一般可达到 8 % 8 \% 8% 97%。

SVM

SVM 是一种二分类模型, 是定义在特征空间上的间隔最大的线性分类器, 由于样 本数远超特征维数,因此本题选用非线性 SVM,目标函数为:
{ min ⁡ a ( 1 2 ∑ i = 1 n ∑ j = 1 n a i a j y i y j ( ∮ ( x i ) × ∮ ( x j ) ) − ∑ i = 1 n a i )  s.t.  ∑ i = 1 0 ⩽ a i ⩽ C a i y i = 0 \left\{\begin{array}{l} \min _{a}\left(\frac{1}{2} \sum_{i=1}^{n} \sum_{j=1}^{n} a_{i} a_{j} y_{i} y_{j}\left(\oint\left(x_{i}\right) \times \oint\left(x_{j}\right)\right)-\sum_{i=1}^{n} a_{i}\right) \\ \text { s.t. } \sum_{\substack{i=1 \\ 0 \leqslant a_{i} \leqslant C}} a_{i} y_{i}=0 \end{array}\right. mina(21i=1nj=1naiajyiyj((xi)×(xj))i=1nai) s.t. i=10aiCaiyi=0
将内积中 ∮ ( x i ) × ∮ ( x j ) \oint\left(x_{i}\right) \times \oint\left(x_{j}\right) (xi)×(xj) 使用核函数替换, 计算出最优的 a i a_{i} ai, 可得到超平面的 w w w b b b, 其 中, w w w 为法向量, 决定了超平面方向, b b b 是位移量, 可以决定超平面与原点之间的距离。

KNN

K N N \mathrm{KNN} KNN 是一种监督学习算法, 当预测一个新的值 x x x 的时候, 根据它距离最近的 k k k 个点 是什么类别来判断 x x x 属于哪个类别。先选取一个较小的 k k k 值, 不断增加 k k k 值, 验证集合的 方差, 找到比较合适的 k k k 值。距离选取多维的欧氏距离, 公式为: d ( x , y ) = ( x 1 − y 1 ) 2 + ( x 2 − y 2 ) 2 + ⋯ + ( x n − y n ) 2 = ∑ i = 1 n ( x i − y i ) 2 d(x, y)=\sqrt{\left(x_{1}-y_{1}\right)^{2}+\left(x_{2}-y_{2}\right)^{2}+\cdots+\left(x_{n}-y_{n}\right)^{2}}=\sqrt{\sum_{i=1}^{n}\left(x_{i}-y_{i}\right)^{2}} d(x,y)=(x1y1)2+(x2y2)2++(xnyn)2 =i=1n(xiyi)2

决策树

决策树可根据已知的分类结果对新的数据分类, 其树形结构的每个内部节点表示一 个属性上的判断, 每个分支代表一个判断结果的输出, 最后每个叶节点代表一种分类结 果。决策树可分为三类: ID3、C4.5 和 CART。本文选择了 C4.5 决策树, 以信息增益率 为准则来选择划分属性的决策树, 信息增益率:
 Gain  ratio ⁡ ( D , a ) = Gain ⁡ ( D , a ) I V ( a ) , I V ( a ) = − ∏ v = 1 v ∣ D v ∣ D log ⁡ 2 ∣ D v ∣ D \text { Gain } \operatorname{ratio}(D, a)=\frac{\operatorname{Gain}(D, a)}{I V(a)}, \quad I V(a)=-\prod_{v=1}^{v} \frac{\left|D^{v}\right|}{D} \log _{2} \frac{\left|D^{v}\right|}{D}  Gain ratio(D,a)=IV(a)Gain(D,a),IV(a)=v=1vDDvlog2DDv

Adaboost 和 GBDT

Adaboost, GBDT 和都是基于 boosting 算法的分类器, GBDT 分类首先初始化一个弱分类器, 计算损失函数的负梯度值, 再利用数据集拟合下一轮模型, 重复计算负梯 度值和拟合过程, 利用 m \mathrm{m} m 个基础模型, 构建梯度提升树。Adaboost 首先赋予 n \mathrm{n} n 个训 练样本相同的权重, 从而训练出一个基分类器, 之后进行预先设置的 T \mathrm{T} T 次迭代, 每次迭代将前一次分类器中分错的样本加大权重, 使得在下一次迭代中更加关注这些样本, 从而调整权重改善分类器, 经过 T \mathrm{T} T 次迭代得到 T \mathrm{T} T 个基分类器, 最终将这些基分类器线 性组合得到最终分类器模型。

随机森林

随机森林属于集成学习中的 Bagging (Bootstrap AGgregation 的简称) 方法, 是利用多棵决策树对样本进行训练并预测的一种分类器, 最后将分类结合为一个最终的结果, 其优于单个决策树做出的分类结果。
在这里插入图片描述

代码实现

导入所需的包

import matplotlib.pyplot as plt
import pandas as pd
from sklearn import metrics
from sklearn import preprocessing
from sklearn.ensemble import AdaBoostClassifier as ada
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.ensemble import RandomForestClassifier as RF
from sklearn.ensemble import VotingClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.svm import SVC
from sklearn.tree import DecisionTreeClassifier

读取要分类的数据

data = pd.read_csv("D:/第三题/第三轮附件2_English.CSV")
data.head()
Gender Age HDLcholesterol LDLcholesterol VLDLcholesterol TG TotalCholesterol Pulse DiastolicPressure HistoryHypertension UreaNitrogen UricAcid Creatinine Weight
0 0 38 1.25 2.99 1.07 0.64 5.31 83 83 0 4.99 243.3 50 1
1 0 31 1.15 1.99 0.84 0.50 3.98 85 63 0 4.72 391.0 47 1
2 0 27 1.29 2.21 0.69 0.60 4.19 73 61 0 5.87 325.7 51 1
3 0 33 0.93 2.01 0.66 0.84 3.60 83 60 0 2.40 203.2 40 2
4 0 36 1.17 2.83 0.83 0.73 4.83 85 67 0 4.09 236.8 43 0

构造响应变量和预测变量

X = data[['Gender', 'Age', 'HDLcholesterol', 'LDLcholesterol',
          'VLDLcholesterol', 'TG', 'TotalCholesterol', 'Pulse',
          'DiastolicPressure', 'HistoryHypertension', 'UreaNitrogen', 'UricAcid',
          'Creatinine', 'Weight']]
X.head()
y = data[['Diabetic']]
y.head()

数据标准化和训练集/测试集划分

X = preprocessing.StandardScaler().fit(X).transform(X.astype(float))
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=4)
print('Train set:', X_train.shape, y_train.shape)
print('Test set:', X_test.shape, y_test.shape)
Train set: (804, 3) (804, 1)
Test set: (202, 3) (202, 1)

构建基分类器模型

LR = LogisticRegression()
Ada = ada()
GBDT = GradientBoostingClassifier()
svc = SVC(probability=True)
rf = RF()
KNN = KNeighborsClassifier(n_neighbors=5)
Tree = DecisionTreeClassifier(criterion="entropy", max_depth=4)

硬投票

weight = []
for clf, label in zip([LR, Ada, GBDT, svc, rf, KNN, Tree],
                      ['LR',
                       'Ada',
                       'GBDT',
                       'svc',
                       'rf',
                       'KNN',
                       'Tree']):
    clf.fit(X_train, y_train)
    y_predict = clf.predict(X_test)
    print('{}在预测集模型的准确率为:\n'.format(label), metrics.accuracy_score(y_test, y_predict))
    print('{}在训练集模型的准确率为:\n'.format(label), metrics.accuracy_score(y_train, clf.predict(X_train)))
    print('{}的综合准确率为:\n'.format(label), metrics.accuracy_score(y, clf.predict(X)))
    tem = metrics.accuracy_score(y, clf.predict(X))
    weight.append(tem)
    print('{}的 ROC 面积为:'.format(label), metrics.roc_auc_score(y, clf.predict(X)))
    print()

软投票

weight = [0.132, 0.141, 0.154, 0.141, 0.159, 0.138, 0.131]
vote2 = VotingClassifier(
    estimators=[('LR', LR), ('Ada', Ada), ('GBDT', GBDT), ('SVC', svc), ('rf', rf), ('KNN', KNN), ('Tree', Tree)],
    voting='soft', weights=weight)
vote2.fit(X_train, y_train)
y_predict = vote2.predict(X_test)
print('{}在预测集模型的准确率为:\n'.format('soft Voting'), metrics.accuracy_score(y_test, y_predict))
print('{}在训练集模型的准确率为:\n'.format('soft Voting'), metrics.accuracy_score(y_train, vote2.predict(X_train)))
print('soft voting 的综合表现:\n', metrics.accuracy_score(y, vote2.predict(X)))
print()
P = vote2.predict_proba(X)[:, 1]
fpr, tpr, threshold = metrics.roc_curve(y, P)
roc_auc = metrics.auc(fpr, tpr)
plt.figure(figsize=(6, 4), dpi=250)
plt.stackplot(fpr, tpr, color='steelblue', alpha=0.5, edgecolor='black')
plt.plot(fpr, tpr, color='black', lw=1)
plt.plot([0, 1], [0, 1], color='red', linestyle='--')
plt.text(0.5, 0.3, 'ROC curve (area = %0.4f)' % roc_auc, fontsize=10)
plt.xlabel('1-Specificity')
plt.ylabel('Sensitivity')
plt.show()

最后结果

每个分类器及voting模型运行代码即可,我就贴一个最后的ROC曲线图吧。
上面的代码都是可以运行的,大家觉得好的话,您的点赞收藏就是对我最大的鼓励!谢谢大家~
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【机器学习杂烩】投票(Voting)算法在分类问题上的应用(一口气实现Logistic 回归、SVM、KNN、C4.5 决策树、 Adaboost、GBDT 和随机森林,并集成起来) 的相关文章

  • 如何在 Windows 64 上安装 NumPy?

    NumPy 安装程序在注册表中找不到 python 路径 无法安装 需要 Python 2 5 版本 但在注册表中未找到该版本 OK 我必须修改注册表吗 我已经修改了 PATH 以指向Python25安装目录 我可以检查一下您使用的是什么安
  • Python 3 os.urandom

    在哪里可以找到完整的教程或文档os urandom 我需要获得一个随机 int 来从 80 个字符的字符串中选择一个字符 如果你只需要一个随机整数 你可以使用random randint a b 来自随机模块 http docs pytho
  • 递归 lambda 表达式可能吗?

    我正在尝试编写一个调用自身的 lambda 表达式 但我似乎找不到任何语法 或者即使它是可能的 本质上我想将以下函数传输到以下 lambda 表达式中 我意识到这是一个愚蠢的应用程序 它只是添加 但我正在探索可以在 python 中使用 l
  • 如何在Python中流式传输和操作大数据文件

    我有一个相对较大 1 GB 的文本文件 我想通过跨类别求和来减小其大小 Geography AgeGroup Gender Race Count County1 1 M 1 12 County1 2 M 1 3 County1 2 M 2
  • 使用 pygame 显示 unicode 符号

    我检查了其他答案 但不明白为什么我的代码错误地显示 This is what I currently see https i stack imgur com 8tNIK png 这是关于文本渲染的相关代码 font pygame font
  • Python - 来自 .进口

    我第一次尝试图书馆 我注意到解决图书馆内导入问题的最简单方法是使用如下结构 from import x from some module import y 我觉得这件事有些 糟糕 也许只是因为我不记得经常看到它 尽管公平地说我还没有深入研究
  • 删除 Django 1.7 中的应用程序(和关联的数据库表)

    是否可以使用 Django 1 7 迁移来完全删除 卸载应用程序及其所有跟踪 主要是其所有数据库表 如果没有 在 Django 1 7 中执行此操作的适当方法是什么 python manage py migrate
  • 工作日重新订购 Pandas 系列

    使用 Pandas 我提取了一个 CSV 文件 然后创建了一系列数据来找出一周中哪几天崩溃最多 crashes by day bc DAY OF WEEK value counts 然后我将其绘制出来 但当然它按照与该系列相同的排名顺序绘制
  • Python3.0 - 标记化和取消标记化

    我正在使用类似于以下简化脚本的内容来解析较大文件中的 python 片段 import io import tokenize src foo bar src bytes src encode src io BytesIO src src l
  • 没有名为 StringIO 的模块

    我有Python 3 6 我想从另一个名为 run py 的 python 文件执行名为 operation py 的 python 文件 In operation py I do from cStringIO import StringI
  • 在 Windows 上使用 apache mod_wsgi 运行 Flask 应用程序时导入冲突

    我允许您询问我在 Windows 上使用您的 mod wsgi portage 托管 Flask 应用程序时遇到的问题 我有两个烧瓶应用程序 由于导入冲突 只有一个可以同时存在 IE 如果请求申请 1 我有回复 然后 如果我请求应用程序 2
  • .pyx 文件出现未知文件类型错误

    我正在尝试构建一个包含 pyx 文件的 Python 包 pyregion 但在构建过程中出现错误 检查以下输出 python setup py build running build running build py creating b
  • 使用 Keras np_utils.to_categorical 的问题

    我正在尝试将整数的 one hot 向量数组制作为 keras 将能够使用的 one hot 向量数组来拟合我的模型 这是代码的相关部分 Y train np hstack np asarray dataframe output vecto
  • Python:IndexError:修改代码后列表索引超出范围

    我的代码应该提供以下格式的输出 我尝试修改代码 但我破坏了它 import pandas as pd from bs4 import BeautifulSoup as bs from selenium import webdriver im
  • 返回表示每组内最大值的索引的一系列数字位置

    考虑一下这个系列 np random seed 3 1415 s pd Series np random rand 100 pd MultiIndex from product list ABDCE list abcde One Two T
  • SocketIO + Flask 检测断开连接

    我在这里有一个不同的问题 但意识到它可以简化为 如何检测客户端何时从页面断开连接 关闭其页面或单击链接 换句话说 套接字连接关闭 我想制作一个带有更新用户列表的聊天应用程序 并且我在 Python 上使用 Flask 当用户连接时 浏览器发
  • 在 Django 查询中使用 .extra(select={...}) 引入的值上使用 .aggregate() ?

    我正在尝试计算玩家每周玩游戏的次数 如下所示 player game objects extra select week WEEK games game date aggregate count Count week 但姜戈抱怨说 Fiel
  • 双击打开 ipython 笔记本

    相关文章 通过双击 osx 打开 ipython 笔记本 https stackoverflow com questions 16158893 open an ipython notebook via double click on osx
  • 多个对象以某种方式相互干扰[原始版本]

    我有一个神经网络 NN 当应用于单个数据集时 它可以完美地工作 但是 如果我想在一组数据上运行神经网络 然后创建一个新的神经网络实例以在不同的数据集 甚至再次同一组数据 上运行 那么新实例将产生完全错误的预测 例如 对 XOR 模式进行训练
  • 查找总和为给定数字的值组合的函数

    这个帖子查找提供的 Sum 值的组合 https stackoverflow com a 20194023 1561176呈现函数subsets with sum 它在数组中查找总和等于给定值的值的组合 但由于这个帖子已经有6年多了 我发这

随机推荐