机器学习算法——分类使命

打印 上一主题 下一主题

主题 850|帖子 850|积分 2550

算法:
1、决定树
2、随机森林
3、梯度提升树
4、逻辑回归
5、支持向量机SVM
6、K近邻 KNN
7、质朴贝叶斯
8、多层感知机
9、同一分类
10、比较总结
11、完备代码
1、决定树

1.1 Decision Tree Analysis (C4.5,CART,CHAID)决定树


算法树结构特征选择一连值处理缺失值处理剪枝ID3多叉树信息增益不支持不支持不支持C4.5多叉树信息增益比支持支持支持CART二叉树基尼系数支持支持支持CHAID多叉树卡方检验支持支持支持 1.2 决定树核心思想

        决定树是一个树结构(可以是二叉树或非二叉树),其每个非叶节点表示一个特征属性上的测试,每个分支代表这个特征属性在某个值域上的输出,而每个叶节点存放一个输出类别。使用决定树举行决定的过程就是从根节点开始,测试待分类项中相应的特征属性,并按照其值选择输出分支,直到到达叶子节点,将叶子节点存放的类别作为决定结果。
        决定树学习通常包含这几个方面:特征选择、决定树生成、决定树剪枝、缺失值/异常值处理、决定树集成学习。(由于决定树算法非常轻易过拟合,因此对于生成的决定树必须要举行剪枝。)
        可把一连取值的数据值域分别为多个区间,并将每个区间视为该特征的一个取值,如此就完成了从一连性数据到离散性数据的变革。
1.3 决定算法

1.3.1 ID3
        ID3算法就是用信息增益大小来判定当前节点应该用什么特征来构建决定树,用计算出的信息增益最大的特征来创建决定树的当前节点。
缺点:
        不能处理一连特征(只能处理离散值);
        在相同条件下,取值比较多的特征比取值少的特征信息增益大。使用信息增益作为标准轻易偏向于取值较多的特征;
        对于缺失值的环境没有做考虑;
        没有考虑过拟合的题目;
1.3.2 C4.5
        对ID3算法举行改进。将一连的特征离散化、引入信息增益比(信息增益和特征熵的比值)举行特征选择、缺失值处理:一是在样本某些特征缺失的环境下选择分别的属性,二是选定了分别属性,对于在该属性上缺失特征的样本的处理。引入了正则化系数举行开端剪枝防止过拟合。
缺点:
        剪枝算法待优化;
        生成的是多叉树,效率没有二叉树优;
        只能用于分类,不能用于回归;
        使用了熵模型,有大量耗时的对数运算,如果是一连值另有大量的排序运算。
1.3.3 CART
        无论是ID3照旧C4.5,都是基于信息论的熵模型的,这里面会涉及大量的对数运算。CART使用基尼系数来取代信息增益比(可以做为熵模型的一个近似更换)。创建二叉树,而不是多叉树(每次仅仅对某个特征的值举行二分,而不是多分)。同样将一连的特征离散化。样本输出是离散值,就是一颗分类树。如果果样本输出是一连值,就是一颗回归树。采用的办法是后剪枝法,即老师成决定树,然后产生全部可能的剪枝后的CART树,然后使用交叉验证来检验各种剪枝的结果,选择泛化本领最好的剪枝策略。
缺点:
        选择最优的一个特征来做分类决定,但是大多数,分类决定不应该是由某一个特征决定的,而是应该由一组特征决定的。
        对异常值比较敏感。
        构建的树可能会比较复杂,轻易出现过拟合征象,需要举行剪枝处理。
1.3.4 CHAID
        基于卡方检验举行特征选择。通常采用预剪枝方法。预剪枝是在树的生长过程中提前停止分裂,以防止过拟合。
缺点:
        计算卡方统计量和举行假设检验相对复杂,当数据量较大时,计算资本较高。对于一连型变量要先辈行离散化才气应用卡方检验。
1.4 剪枝

        对于决定树而言,当不停向下分别,以构建一棵足够大的决定树时(直到全部叶子结点熵值均为0),理论上就能快要乎全部数据全部区分开。以是,决定树的过拟合风险非常大。为此,需要对其举行剪枝处理。
常用的剪枝策略紧张有两个:
        预剪枝:构建决定树的同时举行剪枝处理(更常用)。预剪枝策略可以通过限制树的深度、叶子结点个数、叶子结点含样本数以及最低信息增益来完成。
        后剪枝:构建决定树后再举行剪枝处理。后剪枝法,即老师成决定树,然后产生全部可能的剪枝后的树,然后使用交叉验证来检验各种剪枝的结果,选择泛化本领最好的剪枝策略。
  1. # 1 决策树分类
  2. dt = DecisionTreeClassifier(
  3.     criterion='gini',       # 分裂标准:'gini'(基尼系数)或 'entropy'(信息熵)
  4.     max_depth=5,            # 树的最大深度(防止过拟合)
  5.     random_state=42         # 随机种子(确保结果可复现)
  6. )
复制代码
2、随机森林

        解决决定树泛化本领弱的特点。随机森林是一种基于树模型的Bagging(自助聚合)的优化版本,一棵树的生成肯定照旧不如多棵树,因此就有了随机森林。
决定过程:
        1随机选择样本(放回抽样,行抽样。从样本集中通过重采样的方式产生n个样本)。
        2构建决定树(假设样本特征数目为a,对n个样本选择a中的k个特征,用创建决定树的方式获得最佳分割点)。
        3随机选择特征(列抽样,重复m次,产生m棵决定树)。
        4随机森林投票(均匀,多数投票机制来举行预测)。
优点:
        无需修剪决定树;
        过拟合不是题目;
        对训练数据中的异常值不太敏感;
        可以或许处理很高维度(feature很多)的数据,并且不消做特征选择(因为特征子集是随机选择的);
        训练速率快,轻易做成并行化方法(训练时树与树之间是相互独立的);
        对于不平衡的数据集来说,它可以平衡误差;
        如果有很大一部分的特征遗失,仍可以维持正确度。
缺点:
        回归无法预测训练数据范围外的值;
        在回归中,常常无法正确预测极端值–低估了高点,高估了低点。
  1. # 2. 随机森林分类
  2. rf = RandomForestClassifier(
  3.     n_estimators=100,       # 决策树的数量
  4.     criterion='gini',       # 分裂标准
  5.     max_depth=5,            # 单棵树的最大深度
  6.     random_state=42         # 随机种子
  7. )
复制代码
3、梯度提升树

        一种基于集成学习的算法,旨在通过组合多个弱学习器来构建一个强学习器。其核心思想是逐步优化模型,通过每一步的学习来改正前一步的错误。弱学习器是指在某一特定使命上体现稍好的模型。通常,单个弱学习器的预测本领有限,但通过集成多个弱学习器,可以明显进步团体模型的性能。终极模型是初始模型与全部弱学习器的加权和。残差反映了模型在当前阶段的预测误差。新树的目的是捕捉当前模型未能表明的部分。
随机森林 VS 梯度提升树
随机森林:
        并行构建:多棵决定树独立构建,互不影响,适归并行化处理。
        随机性:每棵树使用不同的随机子样本和随机特征子集,增加模型多样性。
        目的:通过“多数投票”(分类)或“均匀值”(回归)组合结果,低落方差,进步泛化本领。
        复杂度较低:训练过程简朴,适归并行化,训练时间通常较快,尤其是在多核处理器上。
梯度提升树:
        序贯构建:每棵树在前一棵树的基础上优化,目的是修正前一棵树的残差。
        优化目的:通过最小化损失函数逐步优化模型,低落偏差,终极得到强预测模型。
        复杂度较高:训练过程序贯,无法并行化,训练时间随树的数目增加而明显增加。
  1. # 3. 梯度提升树分类
  2. gb = GradientBoostingClassifier(
  3.     n_estimators=100,       # 树的数量
  4.     learning_rate=0.1,      # 学习率(控制每棵树的贡献)
  5.     max_depth=3,            # 单棵树的最大深度
  6.     random_state=42
  7. )
复制代码
4、逻辑回归

        逻辑回归,固然叫做回归,但它却是分类算法。逻辑回归就是解决二分类题目的利器。逻辑回归是广义的线性模型,就是在线性回归基础上加了一个非线性映射。
        假设有如下图所示的一个数据集,使用线性回归算法,可以找到大抵如黑线的一个线性模型对其举行拟合。对数据集中每一个xi,都能通过模型找到一个yi(预测值)与之对应。获得了预测值,就可以做很多事情,例如:分类。可以对yi举行分段。这就实现了以回归的思绪来实现分类。

        线性回归有一个很致命的缺陷——对异常值很敏感,如果数据集中出现异常值,拟合出来的线性模型也将出现很大变革,预测出来的结果也将不在那么正确,从而到导致分类错误。逻辑回归算法对线性回归对异常数据敏感的不敷举行了优化改进。用sigmod函数与线性函数举行复合。
        sigmoid函数也叫Logistic函数,函数表达式:


        sigmoid函数可以很好地将(-∞,+∞)内的数映射到(0,1)上,于是可以将g(z)≥0.5时将该条数据标记为1类,g(z)<0.5时标记为0类。
  1. # 4. 逻辑回归分类
  2. lr = LogisticRegression(
  3.     penalty='l2',           # 正则化类型:'l1'(Lasso)或 'l2'(Ridge)
  4.     C=1.0,                  # 正则化强度的倒数(值越小,正则化越强)
  5.     solver='lbfgs'          # 优化算法(如 'lbfgs', 'saga', 'liblinear')
  6. )
复制代码
5、支持向量机SVM

        将向量映射到一个高维空间里,在这个空间里创建一个最大间隔超平面。在分开数据的超平面的两边建有两个相互平行的超平面,分隔超平面使两个平行超平面的间隔最大化。假定平行超平面间的间隔或差距越大,分类器的总误差越小。
线性:

        最优分类平面的条件是使间隔最大化。通过任一类(星形或圆形标志)与超平面间隔最近的点,基于其与超平面间隔的最大化来判定最优超平面,这个间隔称为边距(Margin)。相比较于A、B,超平面C的边距最大,且具有鲁棒性,也就是说与任一类别的边距都最大,而不像A、B泛化性较差。
非线性:


        需要让空间从本来的线性空间酿成一个更高维的空间,在这个高维的线性空间下,再用一个超平面举行分别。
        SVM有一种称为核函数的技能。这些函数采用低维输入空间并将其转换为更高维空间,即将不可分离题目转换为可分离题目,这些函数称为内核。它紧张用于非线性分离题目。

  1. # 5. 支持向量机 (SVM)
  2. svm = SVC(
  3.     kernel='rbf',           # 核函数:'linear', 'poly', 'rbf', 'sigmoid'
  4.     C=1.0,                  # 正则化参数(值越大,对误分类容忍度越低)
  5.     gamma='scale'           # 核函数的系数('scale' 或 'auto')
  6. )
复制代码
6、KNN

        找出挨着本身最近的K个邻居,并且根据邻居的类别来确定本身的类别环境。

        比如红色点,挨着其最近的5个点(K=5时)如上图,如果该5个点中多数均为A类,那么红色点就归为A类。k近邻的三个要素:①间隔度量,②k(邻居数)的选择,③分类决定规则。
        间隔度量可以是一般的L_p间隔(或Minkowski、闵可夫斯基、闵氏间隔)。通常环境下K值为奇数,通常发起介于3~20之间。分类决定规则一般用多数表决规则。
        缺点:KNN是一种“懒惰学习”算法(Lazy Learning),在训练阶段险些不举行任何计算,而是将全部数据存储起来。在预测阶段,需要对每个测试样本计算其与全部训练样本之间的间隔,然后找到最近的K个邻居。因此,当数据量较大时,计算资本非常高。
        影响:在大规模数据集上,KNN的预测速率会非常慢,不适合实时或在线预测场景。
        噪声数据:KNN对噪声数据和异常值非常敏感,因为这些数据点可能会影响最近邻的判定。
        数据不平衡:在类别不平衡的数据集中,KNN的性能可能会受到严峻影响。少数类的样本可能被多数类的样本“淹没”,导致分类错误。
  1. # 6. K近邻分类 (KNN)
  2. knn = KNeighborsClassifier(
  3.     n_neighbors=5,          # 使用的邻居数量
  4.     weights='uniform'       # 权重计算方式:'uniform' 或 'distance'
  5. )
复制代码
7、质朴贝叶斯

        利用贝叶斯公式根据某特征的先验概率计算出厥后验概率,然后选择具有最大后验概率的类作为该特征所属的类。它的优点是简朴高效,尤其适用于特征维度较高的数据集。
        之以是称之为”质朴”,是因为贝叶斯分类只做最原始、最简朴的假设:全部的特征之间是统计独立的。
        在scikit-learn中,一共有3个质朴贝叶斯的分类算法:
        GaussianNB:先验为高斯分布(正态分布)的质朴贝叶斯,假设每个标签的数据都服从简朴的正态分布。
        MultinomialNB:先验为多项式分布的质朴贝叶斯。它假设特征是由一个简朴多项式分布生成的。多项分布可以描述各种类型样本出现次数的概率,因此多项式质朴贝叶斯非常适适用于描述出现次数大概出现次数比例的特征。
        BernoulliNB:先验为伯努利分布的质朴贝叶斯。
  1. # 7. 朴素贝叶斯分类
  2. nb = GaussianNB()           # 默认使用高斯分布
复制代码
总结:
        如果样本特征的分布大部分是一连值,使用GaussianNB会比较好。
        如果样本特征的分布大部分是多元离散值,使用MultinomialNB比较符合(常用于文天职类)。
        如果样本特征是二元离散值大概很稀疏的多元离散值,应该使用BernoulliNB。
8、多层感知机

        是一种前馈神经网络模型,它由一个输入层、一个输出层以及至少一层隐藏层组成。多层感知器模型即为多个单层感知器的叠加。

  1. # 8. 多层感知机 (MLP)
  2. mlp = MLPClassifier(
  3.     hidden_layer_sizes=(100,),  # 隐藏层结构(如 (100, 50) 表示两层)
  4.     activation='relu',      # 激活函数:'relu', 'tanh', 'logistic'
  5.     solver='adam',          # 优化算法:'adam', 'lbfgs', 'sgd'
  6.     max_iter=1000,          # 最大迭代次数
  7.     random_state=42
  8. )
复制代码
工作原理:

  • 前向传播:输入数据通过网络从输入层传递到输出层,在每一层中,数据都被转换为新的表示形式。
  • 损失计算:根据输出层产生的预测值和实际目的值之间的差异来计算损失(或误差)。
  • 反向传播:使用梯度降落法(或其变体)来更新网络中的权重和偏置,以便最小化损失函数。
9、Unified Classification同一分类

        旨在通过一个同一的模型或框架来解决多种分类题目,而不是为每个使命单独计划模型。
        百度构建了“使命架构同一、通用本领共享”的通用文天职类技能UTC,实在现了精良的零/少样本迁移性能。PaddleNLP团结文心ERNIE,基于UTC技能开源了首个面向通用文天职类的财产级技能方案。
        对于简朴使命,通过调用 paddlenlp.Taskflow API,仅用三行代码即可实现零样本(Zero-shot)通用文天职类,可支持情感分析、意图识别、语义匹配、蕴含推理等各种可转换为分类题目的NLU使命。对于复杂使命,可以标注少量数据(Few-shot)举行模型训练,以进一步提升模型分类结果。
        UTC具有低资源迁移本领,可以支持通用分类、评论情感分析、语义相似度计算、蕴含推理、多项式阅读理解等多种“泛分类”使命。这使得开发者可以更加轻松高效地实现多使命文天职类数据标注、训练、调优和上线,从而低落文天职类技能门槛。
Github:
https://github.com/PaddlePaddle/PaddleNLP/blob/develop/paddlenlp/taskflow/zero_shot_text_classification.py
参考文章:https://aistudio.csdn.net/644b39106beb9e262918b1cb.html
流程:
1、数据
        安装Label Studio为数据打标签、导出JSON文件。通过label_studio.py脚本可转为UTC的数据格式。生成训练/验证集文件。
2、模型微调与评估
        推荐使用PromptTrainer API对模型举行微调,该API封装了提示定义功能,且继续自Trainer API。只需输入模型、数据集等就可以使用Trainer API高效快速地举行预训练、微调等使命,可以一键启动多卡训练、混合精度训练、梯度累积、断点重启、日志显示等功能,Trainer API还针对训练过程的通用训练设置做了封装,比如:优化器、学习率调理等。
3、预测
        paddlenlp.Taskflow装载定制模型,通过task_path指定模型权重文件的路径,路径下需要包含训练好的模型权重文件model_state.pdparams。
  1. from pprint import pprint
  2. from paddlenlp import Taskflow
  3. schema = ["病情诊断", "治疗方案", "病因分析", "指标解读", "就医建议", "疾病表述", "后果表述", "注意事项", "功效作用", "医疗费用", "其他"]
  4. my_cls = Taskflow("zero_shot_text_classification", model="utc-base", schema=schema, task_path='/home/aistudio/checkpoint/model_best/plm')
  5. pprint(my_cls(["老年斑为什么都长在面部和手背上","老成都市哪家内痔医院比较好怎么样最好?","中性粒细胞比率偏低"]))
复制代码
10、比较总结

        在选择符合的分类算法时,需要综合考虑数据的规模、特征维度、使命复杂度以及计算资源等因素。
场景需求推荐模型线性可分、概率表明逻辑回归高维稀疏、小样本质朴贝叶斯、SVM非线性、可表明性决定树、随机森林复杂非线性、高精度梯度提升树、多层感知机局部模式、小数据集KNN多模态/序列数据、大规模使命同一大模型实时预测、轻量级摆设逻辑回归、轻量决定树 11、完备代码

  1. from sklearn.tree import DecisionTreeClassifierfrom sklearn.ensemble import RandomForestClassifier, GradientBoostingClassifierfrom sklearn.linear_model import LogisticRegressionfrom sklearn.svm import SVCfrom sklearn.neighbors import KNeighborsClassifierfrom sklearn.naive_bayes import GaussianNBfrom sklearn.neural_network import MLPClassifierfrom sklearn.model_selection import train_test_splitfrom sklearn import datasetsfrom sklearn.metrics import accuracy_score# 导入数据集iris = datasets.load_iris()# 切分数据集,将数据的内容余目的切分成训练集和测试集Xtrain, Xtest, ytrain, ytest = train_test_split(iris.data,iris.target,random_state=12)# 1. 决定树分类dt = DecisionTreeClassifier(    criterion='gini',       # 分裂标准:'gini'(基尼系数)或 'entropy'(信息熵)    max_depth=5,            # 树的最大深度(防止过拟合)    random_state=42         # 随机种子(确保结果可复现))# 2. 随机森林分类
  2. rf = RandomForestClassifier(
  3.     n_estimators=100,       # 决策树的数量
  4.     criterion='gini',       # 分裂标准
  5.     max_depth=5,            # 单棵树的最大深度
  6.     random_state=42         # 随机种子
  7. )
  8. # 3. 梯度提升树分类
  9. gb = GradientBoostingClassifier(
  10.     n_estimators=100,       # 树的数量
  11.     learning_rate=0.1,      # 学习率(控制每棵树的贡献)
  12.     max_depth=3,            # 单棵树的最大深度
  13.     random_state=42
  14. )
  15. # 4. 逻辑回归分类
  16. lr = LogisticRegression(
  17.     penalty='l2',           # 正则化类型:'l1'(Lasso)或 'l2'(Ridge)
  18.     C=1.0,                  # 正则化强度的倒数(值越小,正则化越强)
  19.     solver='lbfgs'          # 优化算法(如 'lbfgs', 'saga', 'liblinear')
  20. )
  21. # 5. 支持向量机 (SVM)
  22. svm = SVC(
  23.     kernel='rbf',           # 核函数:'linear', 'poly', 'rbf', 'sigmoid'
  24.     C=1.0,                  # 正则化参数(值越大,对误分类容忍度越低)
  25.     gamma='scale'           # 核函数的系数('scale' 或 'auto')
  26. )
  27. # 6. K近邻分类 (KNN)
  28. knn = KNeighborsClassifier(
  29.     n_neighbors=5,          # 使用的邻居数量
  30.     weights='uniform'       # 权重计算方式:'uniform' 或 'distance'
  31. )
  32. # 7. 朴素贝叶斯分类
  33. nb = GaussianNB()           # 默认使用高斯分布
  34. (无需特别参数)# 8. 多层感知机 (MLP)
  35. mlp = MLPClassifier(
  36.     hidden_layer_sizes=(100,),  # 隐藏层结构(如 (100, 50) 表示两层)
  37.     activation='relu',      # 激活函数:'relu', 'tanh', 'logistic'
  38.     solver='adam',          # 优化算法:'adam', 'lbfgs', 'sgd'
  39.     max_iter=1000,          # 最大迭代次数
  40.     random_state=42
  41. )
  42. # 训练模型(假设已有 X_train, y_train)models = [dt, rf, gb, lr, svm, knn, nb, mlp]for model in models:    model.fit(Xtrain, ytrain)    # 在测试集上执行预测,proba导出的是每个样本属于某类的概率    pre_result = model.predict(Xtest)  # 预测结果    # 测试正确率    accuracy_value = accuracy_score(ytest, pre_result)    # 打印输出结果    print(accuracy_value)  # 最后预测正确率
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

忿忿的泥巴坨

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表