常用数据分类算法原理介绍、优缺点分析与代码实现[LR/RF/DT/SVM/NavieBayes/GBDT/XGBoost/DNN/LightGBM等]

本文的主要目的是总结记录日常学习工作中常用到的一些数据分类算法,对其原理简单总结记录,同时分析对应的优缺点,以后需要的时候可以直接翻看,避免每次都要查询浪费时间,欢迎补充。

机器学习领域中常用的分类模型包括以下几种:
(1)逻辑回归 (Logistic Regression):逻辑回归是一种广泛应用于二分类问题的线性模型,通过使用逻辑函数将输入特征与概率进行建模。
(2)决策树 (Decision Trees):决策树是一种基于树结构的非参数化分类模型,通过对输入特征进行分割,以确定最佳分类决策。
(3)支持向量机 (Support Vector Machines, SVM):SVM是一种基于超平面的有监督学习算法,可用于二分类和多分类任务。它通过找到能够最大间隔地分离不同类别的超平面来进行分类。
(4)朴素贝叶斯 (Naive Bayes):朴素贝叶斯是一种基于贝叶斯定理和特征之间的独立性假设的概率分类方法。它在处理高维数据和文本分类方面具有较好的表现。
(5)k近邻算法 (k-Nearest Neighbors, k-NN):k-NN是一种基于实例的分类算法,通过测量样本点与训练集中最接近的k个样本点的距离来进行分类。
(6)随机森林 (Random Forest):随机森林是一种集成学习方法,将多个决策树组合起来进行分类。它通过对特征和样本进行随机选择,减少了过拟合的风险。
(7)深度神经网络 (Deep Neural Networks, DNN):深度神经网络是一类基于多层神经元的模型,通过前向传播和反向传播算法进行训练和分类。在图像、语音和自然语言处理等领域取得了重大突破。
(8)梯度提升树 (Gradient Boosting Trees):梯度提升树是一种集成学习算法,通过迭代地构建多个决策树,并利用梯度下降法来优化损失函数,实现高准确性的分类。
(9)XGBoost(eXtreme Gradient Boosting)是一种基于Gradient Boosting框架的集成学习算法,用于解决分类和回归问题。它在许多机器学习竞赛中都取得了优异的表现,并被广泛应用于实际问题中。
(10)LightGBM是一种基于梯度提升框架的高效梯度提升树算法,专门用于解决分类和回归问题。相比于传统的梯度提升树算法,LightGBM具有更快的训练速度和更低的内存消耗。

这里针对上述总结学习的模型对其算法原理进行介绍并针对性地分析对应模型的优点和缺点,记录学习备忘。

(1)逻辑回归 (Logistic Regression):
算法原理:
逻辑回归是一种广泛应用于二分类问题的线性模型。它通过将输入特征与概率进行建模,使用逻辑函数(如sigmoid函数)将线性函数的输出映射到[0,1]之间的概率值。根据概率值可以进行分类决策。
优点:
计算简单、易于实现和解释。
可以处理大规模数据集。
对于线性可分问题,表现较好。
缺点:
对于非线性问题效果不佳,需要通过特征工程或引入高阶项来处理。
对异常值敏感。
容易欠拟合。

代码实现如下:

from sklearn.linear_model import LogisticRegression
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score# 加载数据集
X, y = load_iris(return_X_y=True)# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 创建并训练逻辑回归模型
model = LogisticRegression()
model.fit(X_train, y_train)# 进行预测
y_pred = model.predict(X_test)# 计算准确率
accuracy = accuracy_score(y_test, y_pred)
print("Accuracy:", accuracy)


(2)决策树 (Decision Trees):
算法原理:
决策树是一种基于树结构的非参数化分类模型。通过对输入特征进行分割来确定最佳分类决策。在每个节点上,选择最佳的特征和分割点来使得信息增益或基尼系数最大化,不断迭代构建树。
优点:
直观易懂,能够生成可解释的规则。
能够处理离散和连续型特征。
对缺失值有较好的容忍性。
可以处理多分类问题。
缺点:
对于特征空间划分较为复杂的问题,决策树可能出现过拟合。
对数据中的噪声和异常值较为敏感。
不稳定,对输入数据的微小变化可能导致完全不同的决策树。

代码实现如下所示:

from sklearn.tree import DecisionTreeClassifier
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score# 加载数据集
X, y = load_iris(return_X_y=True)# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 创建并训练决策树模型
model = DecisionTreeClassifier()
model.fit(X_train, y_train)# 进行预测
y_pred = model.predict(X_test)# 计算准确率
accuracy = accuracy_score(y_test, y_pred)
print("Accuracy:", accuracy)


(3)支持向量机 (Support Vector Machines, SVM):
算法原理:
支持向量机是一种基于超平面的有监督学习算法。通过找到能够最大间隔地分离不同类别的超平面来进行分类。SVM可以通过核函数将线性可分的问题扩展到非线性问题。
优点:
在高维空间中表现良好,适用于处理维度高于样本数量的数据集。
泛化能力强,对于噪声和离群点具有较好的鲁棒性。
结果具有较好的数学解释。
缺点:
当特征维度非常高时,计算复杂度较高。
对于大规模数据集,需要占用较多的内存。
需要调节参数,如正则化参数C和核函数参数等。

代码实现如下所示:

from sklearn.svm import SVC
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score# 加载数据集
X, y = load_iris(return_X_y=True)# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 创建并训练SVM模型
model = SVC()
model.fit(X_train, y_train)# 进行预测
y_pred = model.predict(X_test)# 计算准确率
accuracy = accuracy_score(y_test, y_pred)
print("Accuracy:", accuracy)


(4)朴素贝叶斯 (Naive Bayes):
算法原理:
朴素贝叶斯是一种基于贝叶斯定理和特征之间的独立性假设的概率分类方法。它通过计算后验概率来进行分类,选择具有最高概率的类别。
优点:
计算简单快速。
对于高维数据表现良好,适用于文本分类等问题。
对于小样本数据集也能够有效推断。
缺点:
忽略了特征之间的相关性,独立性假设可能不成立。
对于新颖的样本,可能出现较大的分类误差。
对于连续型特征和缺失值处理不佳。

代码实现如下所示:

from sklearn.naive_bayes import GaussianNB
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score# 加载数据集
X, y = load_iris(return_X_y=True)# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 创建并训练朴素贝叶斯模型
model = GaussianNB()
model.fit(X_train, y_train)# 进行预测
y_pred = model.predict(X_test)# 计算准确率
accuracy = accuracy_score(y_test, y_pred)
print("Accuracy:", accuracy)


(5)k近邻算法 (k-Nearest Neighbors, k-NN):
算法原理:
k-NN是一种基于实例的分类算法。它根据样本点在特征空间中的距离来进行分类。对于一个待预测样本点,k-NN算法会计算其与训练集中最接近的k个样本点的距离,并根据这k个样本点的标签进行投票决定该样本点的类别。
优点:
简单易懂,容易实现。
对于多分类问题有效。
对于非线性问题具有较好的适应性。
缺点:
对于高维数据和大规模数据集计算复杂度较高。
对异常值敏感。
需要选择合适的k值,不同的k可能导致不同的分类结果。

代码实现如下所示:

from sklearn.neighbors import KNeighborsClassifier
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score# 加载数据集
X, y = load_iris(return_X_y=True)# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 创建并训练k-NN模型
model = KNeighborsClassifier()
model.fit(X_train, y_train)# 进行预测
y_pred = model.predict(X_test)# 计算准确率
accuracy = accuracy_score(y_test, y_pred)
print("Accuracy:", accuracy)


(6)随机森林 (Random Forest):
算法原理:
随机森林是一种集成学习方法,将多个决策树组合起来进行分类。随机森林通过对特征和样本进行随机选择,减少了过拟合的风险。每个决策树独立地进行训练,并通过投票或平均等方式进行分类决策。
优点:
能够处理高维数据和大规模数据集。
具有较好的鲁棒性,对于噪声和异常值具有一定的容忍性。
能够估计特征的重要性。
缺点:
对于某些噪声较大的数据集,可能会出现过拟合问题。
在训练时需要较多的计算资源。

代码实现如下所示:

from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score# 加载数据集
X, y = load_iris(return_X_y=True)# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 创建并训练随机森林模型
model = RandomForestClassifier()
model.fit(X_train, y_train)# 进行预测
y_pred = model.predict(X_test)# 计算准确率
accuracy = accuracy_score(y_test, y_pred)
print("Accuracy:", accuracy)


(7)深度神经网络 (Deep Neural Networks, DNN):
算法原理:深度神经网络是一类基于多层神经元的模型。通过前向传播和反向传播算法进行训练和分类。它由多个隐藏层组成,每层由多个神经元组成。每个神经元接收来自前一层神经元的输入,并通过激活函数进行非线性变换。
优点:
在处理图像、语音和自然语言处理等领域取得了重大突破。
能够学习到复杂的非线性关系。
具有较强的表达能力和泛化能力。
缺点:
训练深度神经网络需要大量的数据和计算资源。
对于参数的初始化和调优较为困难。
可能会出现过拟合问题。

代码实现如下所示:

import numpy as np
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
from keras.models import Sequential
from keras.layers import Dense# 加载数据集
X, y = load_iris(return_X_y=True)# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 创建并训练深度神经网络模型
model = Sequential()
model.add(Dense(10, input_dim=4, activation='relu'))
model.add(Dense(3, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
model.fit(X_train, np.eye(3)[y_train], epochs=100, batch_size=10, verbose=0)# 进行预测
y_pred = np.argmax(model.predict(X_test), axis=-1)# 计算准确率
accuracy = accuracy_score(y_test, y_pred)
print("Accuracy:", accuracy)


(8)梯度提升树 (Gradient Boosting Trees):
算法原理:
梯度提升树是一种集成学习算法,通过迭代地构建多个决策树,并利用梯度下降法来优化损失函数,实现高准确性的分类。
优点:
在处理非线性问题时表现良好。
能够处理高维数据和大规模数据集。
对于噪声和离群点具有较好的鲁棒性。
缺点:
计算复杂度较高,需要进行多次迭代训练。
对于某些噪声较大的数据集,可能会出现过拟合问题。
需要调节多个参数,如学习率和树的数量等。

代码实现如下所示:

from sklearn.ensemble import GradientBoostingClassifier
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score# 加载数据集
X, y = load_iris(return_X_y=True)# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 创建并训练梯度提升树模型
model = GradientBoostingClassifier()
model.fit(X_train, y_train)# 进行预测
y_pred = model.predict(X_test)# 计算准确率
accuracy = accuracy_score(y_test, y_pred)
print("Accuracy:", accuracy)

(9)XGBoost(eXtreme Gradient Boosting):
算法原理:
初始化:XGBoost首先使用一个简单的模型(如常数值)作为初始预测值。
计算梯度与损失函数:计算每个样本的真实标签与当前模型的预测值之间的差异,得到每个样本的梯度。同时,定义一个损失函数来衡量模型在训练数据上的表现。
构建决策树:通过迭代地增加决策树来改进当前模型的预测能力。每次迭代中,根据上一轮的残差(真实标签与当前模型预测值的差异)来构建一个新的决策树。利用贪婪算法选择最佳的分割点,最小化损失函数。每个叶节点包含一个预测值,用于最终的预测结果。
更新预测:将新构建的决策树与之前模型的预测结果相加,得到更新后的预测值。
迭代优化:重复步骤2-4,直到达到预定的迭代次数或损失函数收敛为止。
优点:
高准确性:XGBoost使用了梯度提升算法,能够在每次迭代中改进模型的预测能力,从而获得更高的准确性。
可处理多种类型数据:XGBoost可以处理各种数据类型,包括数值型和类别型特征。它还支持自定义损失函数,使其适用于各种问题。
有效处理缺失值:XGBoost能够自动处理缺失值,无需对缺失值进行填充或删除操作。
可解释性强:XGBoost通常生成一棵较浅的决策树,这使得模型具有更好的可解释性和可视化能力。
速度快:XGBoost采用了很多优化技术,例如近似算法和并行计算,使其训练速度更快。
缺点:
参数调优:XGBoost有很多参数需要调节,如树的数量、深度和学习率等,这需要花费一些时间和资源来选择最佳参数组合。
容易过拟合:如果不谨慎选择超参数,XGBoost容易过拟合训练数据,导致在测试数据上表现不佳。
对噪声和异常值敏感:与其他基于决策树的方法一样,XGBoost对噪声和异常值比较敏感,可能会导致模型性能下降。
需要注意的是,XGBoost有一个改进版叫做LightGBM,它在XGBoost的基础上进行了优化,更适用于大规模数据集和高维特征。

代码实现如下所示:

import xgboost as xgb
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score# 加载数据集
X, y = load_iris(return_X_y=True)# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 转换数据为DMatrix格式
dtrain = xgb.DMatrix(X_train, label=y_train)
dtest = xgb.DMatrix(X_test)# 设置参数并训练XGBoost模型
params = {'objective': 'multi:softmax','num_class': 3
}
model = xgb.train(params, dtrain)# 进行预测
y_pred = model.predict(dtest)# 计算准确率
accuracy = accuracy_score(y_test, y_pred)
print("Accuracy:", accuracy)


(10)LightGBMLightGBM(Light Gradient Boosting Machine):
算法原理:
是一种基于梯度提升框架的高效梯度提升树算法,专门用于解决分类和回归问题。相比于传统的梯度提升树算法,LightGBM具有更快的训练速度和更低的内存消耗。
数据预处理:LightGBM首先对数据进行离散化,并将连续特征划分为离散的bins。然后,使用直方图算法来计算每个bin的梯度和Hessian值。
初始化模型:LightGBM使用一个常数作为初始预测值。
创建叶子结点和分割策略:通过迭代地增加决策树来改进当前模型的预测能力。对于每个决策树的结点,LightGBM使用基于梯度的直方图算法来选择最佳的分割点,以最小化损失函数。它通过遍历所有特征和所有分裂点,计算每个分裂点的增益(Gain)来选择最优的分割策略。
生长决策树:在每个结点上,LightGBM通过贪婪算法选择增益最大的分割点,并不断分裂结点,直到达到预定的最大深度或无法继续分裂为止。
叶子结点的预测值:将叶子结点中的样本标签进行平均,作为叶子结点的预测值。
更新梯度和损失函数:根据当前模型的预测值和真实标签计算梯度和Hessian值,用于下一轮迭代的决策树构建。
优点:
高效性:LightGBM采用了基于直方图的算法,通过对特征进行离散化和基于梯度的直方图算法来选择最佳分割点,从而大幅提升了训练速度和内存消耗。
高准确性:LightGBM在处理大规模数据集和高维特征时能够保持较高的准确性,它能够学习到复杂的非线性关系。
处理缺失值:LightGBM能够自动处理缺失值,无需进行填充或删除操作。
可扩展性:LightGBM支持并行训练,在多核CPU上能够实现更快的训练速度。
缺点:
对噪声和异常值敏感:与其他基于决策树的方法一样,LightGBM对噪声和异常值比较敏感,可能会导致模型性能下降。
参数调优:LightGBM有一些参数需要调节,如学习率、树的数量和深度等,需要花费一定的时间和资源来选择最佳的参数组合。
总体而言,LightGBM是一个高效且准确的梯度提升树算法,特别适用于处理大规模数据集和高维特征。它在许多机器学习竞赛和实际应用中都取得了优异的表现。

代码实现如下所示:

import lightgbm as lgb
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score# 加载数据集
X, y = load_iris(return_X_y=True)# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 转换数据为Dataset格式
train_data = lgb.Dataset(X_train, label=y_train)# 设置参数并训练LightGBM模型
params = {'objective': 'multiclass','num_class': 3
}
model = lgb.train(params, train_data)# 进行预测
y_pred = model.predict(X_test)
y_pred = y_pred.argmax(axis=1)# 计算准确率
accuracy = accuracy_score(y_test, y_pred)
print("Accuracy:", accuracy)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/19369.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

智能物流监控系统的数据平台技术研究

完整资料进入【数字空间】查看——baidu搜索"writebug" 1.1 项目背景 物联网技术是利用传感器嵌入各种末端设备,通过无线或有线网络接入互联网以实现人与物、物与物实时互联的新兴技术[1]。 智能物流监控系统是在物流量越来越大、物流价值越来越贵重的背…

关于SpringBoot、Nginx 请求参数包含 [] 特殊符号 返回400状态

问题来源: 使用RESTful风格发送带有特殊符号(如:点、大括号等)的请求,当使用Nginx做地址映射时会返回报"HTTP Status 400-Bad Request"的错误,这个时候我们需要对Nginx的映射方式做一下调整。 Nginx调整完发现跳转后又报…

基于RWKV-Runner大语言模型系统

RWKV Runner 旨在消除大语言模型的使用门槛,全自动处理AI对话,并且提供了OpenAI API兼容的接口。使用起来简单方便,但是还是比较吃机器,显存2G到32G都可以使用,根据自己的模型选择即可。 总结起来: 使用起来方便简单,上手容易。需要有电脑基础,很多地方还不是傻瓜化。需…

Android JetPack深入分析DataBinding源码

前言 数据绑定库是一种支持库,借助该库,您可以使用声明性格式(而非程序化地)将布局中的界面组件绑定到应用中的数据源。 DataBinding支持双向绑定,数据变化的时候界面跟着变化,界面变化也同步给数据&…

【C语言】1-Visual C++ 2010 的简单使用和第一个 C 语言程序

1. Visual C++ 2010 的简单使用 1.1 面板介绍 1.2 新建C语言项目 打开 Visual C++ 2010,点击 New Project 根据下面的图示进行操作,其中需要注意 ③:这里输入的为项目名(建议和我的命名保持一致) ④:这里是项目存放的位置,可以自己选择,最好不要有中文路径(只要是使…

selenium 浏览器托管

selenium 浏览器托管,是启动一个浏览器,调试代码,可以运行当前调试代码,不用从启动浏览器开始从头执行 在谷歌浏览器chrome.exe 目录中打开cmd 输入下面目录,启动器浏览器 chrome.exe --remote-debugging-port9222 -…

使用docker部署rancher并导入k8s集群

前言:鉴于我已经部署了k8s集群,那就在部署rancher一台用于管理k8s,这是一台单独的虚拟环境,之前在k8s的master节点上进行部署并未成功,有可能端口冲突了,这个问题我并没有深究,如果非要通过修改…

数据结构05:树与二叉树[C++][并查集]

图源:文心一言 Chat GPT生成,代码的核心思想与王道咸鱼老师的视频虽然类似,但是在具体实现上毕竟还是略有差别~~因此,如果对考研方向的并查集代码感兴趣,可以查看—— 王道咸鱼老师的视频:{5.5_2_并查集_…

【Elasticsearch】文档操作

目录 3.文档操作 3.1.新增文档 3.2.查询文档 3.3.删除文档 3.4.修改文档 3.4.1.全量修改 3.4.2.增量修改 3.5.总结 3.文档操作 3.1.新增文档 语法: POST /索引库名/_doc/文档id {"字段1": "值1","字段2": "值2"…

遥感云大数据在灾害、水体与湿地领域典型案例实践及GPT模型应用

​ ​ ​ ​ 第一部分 基础实践 一 平台及基础开发平台 GEE平台及典型应用案例介绍; GEE开发环境及常用数据资源介绍; ChatGPT、文心一言等GPT模型介绍 JavaScript基础简介; GEE遥感云重要概念与典型数据分析流程; …

Hightopo 使用心得(4)- 3D 场景 Graph3dView 与 Obj 模型

在前一篇文章《Hightopo 使用心得(3)- 吸附与锚点》中,我们在结尾处提到过 HT 的 3D 场景。这里我们通过代码建立一个 3D 场景并添加一个 Obj 模型来介绍一下 HT for Web 在 3D 场景和模型加载方面的使用。 这是我们最终实现的效果&#xff…

QML Canvas 几何变换(平移/旋转/缩放)

作者: 一去、二三里 个人微信号: iwaleon 微信公众号: 高效程序员 几何变换是 Canvas 提供的一项强大的图形处理能力,主要涉及平移、旋转、缩放。通过运用这些功能,我们有了更大的创作自由度,可以很容易的在 QML 中实现一些出色的游戏效果、动态图表、交互式数据可视化等…