机器学习:后篇

目录

一、KNN算法-分类

样本距离

KNN算法原理

缺点

API

二、模型选择与调优

交叉验证

保留交叉验证(HoldOut)

k-折交叉验证(K-fold)

分层k-折交叉验证(Stratified k-fold)

其他交叉验证

三、朴素贝叶斯-分类

理论介绍

拉普拉斯平滑系数

API

四、决策树-分类

理论介绍

基于信息增益的决策树

基于基尼指数的决策树

API

五、集成学习方法:随机森林-分类

理论介绍

算法原理

API

六、线性回归

线性回归介绍

损失函数

多参数回归

最小二乘法

API

梯度下降

学习率

sklearn梯度下降

批量梯度下降BGD

随机梯度下降SGD

小批量梯度下降MBGD

过拟合和欠拟合

正则化

岭回归

拉索回归

七、逻辑回归

原理

API

八、无监督学习

K-means 算法

API

总结


一、KNN算法-分类

KNN算法是对数据进行分类任务

样本距离

欧氏距离:平方和再根(相当于L2)

曼哈顿距离:绝对值之和(相当于L1)

KNN算法原理

K-邻近算法(简称KNN)根据K个邻居样本的类别判断当前样本的类别。

一个样本在特征空间中的k个最相似(最邻近)样本中的大多数属于某个类别,则该类本也属于这个类别(近朱者赤近墨者黑)

缺点

对于大规模数据集,计算量大,因为需要计算测试样本与所有训练样本的距离。

对于高维数据,距离度量可能变得不那么有意义,这就是所谓的“维度灾难”

需要选择合适的k值和距离度量,这可能需要一些实验和调整

API

sklearn.neighbors.KNeighborsClassifier(n_neighbors=5, algorithm='auto')
参数:                                             
(1)n_neighbors: 
        int, default=5, 默认情况下用于kneighbors查询的近邻数,就是K
(2)algorithm:
    {‘auto’, ‘ball_tree’, ‘kd_tree’, ‘brute’}, default=’auto’。找到近邻的方式,注意不是计算距离的方式,与机器学习算法没有什么关系,开发中请使用默认值'auto'
方法:
 (1) fit(x, y) 
        使用X作为训练数据和y作为目标数据  
 (2) predict(X)    预测提供的数据,得到预测数据    

二、模型选择与调优

交叉验证

保留交叉验证(HoldOut)

整个数据集被随机地划分为训练集和验证集。根据经验法则,整个数据集的近70%被用作训练集,其余30%被用作验证集。

优点:执行简单容易

缺点:不适合不均衡的数据集(类别间的样本数差距过大);

           一大块数据被划分为测试集,不参与训练。

k-折交叉验证(K-fold)

将数据集划分为K个相同大小的部分,其中一个作为验证集,其余K-1个作为训练集,重复K次,直到每个部分都被用作训练集。

分层k-折交叉验证(Stratified k-fold)

基于K-折交叉验证的变种,每一折都按照原始数据的各个类别比例关系划分,能保证验证结果的可信度。

其他交叉验证

去除p交叉验证

留一交叉验证

蒙特卡罗交叉验证

时间序列交叉验证

三、朴素贝叶斯-分类

理论介绍

贝叶斯理论:P1表示a类的概率,P2表示b类的概率,若P1>P2,则为a类,反之,则为b类。

条件概率的计算公式:

对条件概率公式进行变形,可以得到如下形式:

我们把P(A)称为"先验概率"(Prior probability),即在B事件发生之前,我们对A事件概率的一个判断。

P(A|B)称为"后验概率"(Posterior probability),即在B事件发生之后,我们对A事件概率的重新评估。

P(B|A)/P(B)称为"可能性函数"(Likelyhood),这是一个调整因子,使得预估概率更接近真实概率。

所以,条件概率可以理解成下面的式子:

后验概率 = 先验概率x调整因子

朴素贝叶斯对条件概率分布做了条件独立性的假设

将联合概率 P(X|a) 分解为各个特征的概率乘积:

P(X|a) = P(x_1, x_2, ..., x_n|a) = P(x_1|a)P(x_2|a)...P(x_n|a)

拉普拉斯平滑系数

如果某个新的特征在数据集中没有出现过,那按照原来的算法概率为0,也就是无法预测数据集中没有的数据类型,引入拉普拉斯平滑系数

公式为:

一般α取值1,m的值为总特征数量

这样预测没有出现的样本概率就不会出现0的情况,而是赋予很小的数。

API

sklearn.naive_bayes.MultinomialNB()
estimator.fit(x_train, y_train)
y_predict = estimator.predict(x_test)

四、决策树-分类

理论介绍

1、决策节点:通过条件判断而进行分支选择的节点。

2、叶子节点 没有子节点的节点,表示最终的决策结果。

3、决策树的深度 所有节点的最大层次数。

决策树具有一定的层次结构,根节点的层次数定为0,从下面开始每一层子节点层次数增加

4、决策树优点:

可视化 - 可解释能力-对算力要求低

5、 决策树缺点:

容易产生过拟合,所以不要把深度调整太大了。

基于信息增益的决策树

信息熵描述的是不确定性。信息熵越大,不确定性越大。

假设样本集合D共有N类,第k类样本所占比例为Pk,则D的信息熵为

信息增益是一个统计量,用来描述一个属性区分数据样本的能力。信息增益越大,那么决策树就会越简洁。信息增益公式:

基于基尼指数的决策树

基尼指数衡量的是数据集的不纯度,或者说分类的不确定性。

对于一个二分类问题,如果一个节点包含的样本属于正类的概率是 (p),则属于负类的概率是 (1-p)。那么,这个节点的基尼指数 (Gini(p)):

对于多分类问题,如果一个节点包含的样本属于第 k 类的概率是 p_k,则节点的基尼指数定义为:

  • 当一个节点的所有样本都属于同一类别时,基尼指数为 0,表示纯度最高。

  • 当一个节点的样本均匀分布在所有类别时,基尼指数最大,表示纯度最低。

API

class sklearn.tree.DecisionTreeClassifier(....)
参数:

criterion "gini" "entropy” 默认为="gini" 
    当criterion取值为"gini"时采用 基尼不纯度算法构造决策树,
    当criterion取值为"entropy”时采用信息增益算法构造决策树.
max_depth    int, 默认为=None  树的最大深度

# 可视化决策树
function sklearn.tree.export_graphviz(estimator, out_file="iris_tree.dot", feature_names=iris.feature_names)
参数:
    estimator决策树预估器
    out_file生成的文档
    feature_names节点特征属性名
功能:
    把生成的文档打开,复制出内容粘贴到"http://webgraphviz.com/"中,点击"generate Graph"会生成一个树型的决策树图

五、集成学习方法:随机森林-分类

理论介绍

集成学习的基本思想就是将多个分类器组合,从而实现一个预测效果更好的集成分类器。

随机森林就属于集成学习,是通过构建一个包含多个决策树的森林,每棵树都在不同的数据子集和特征子集上进行训练,最终通过投票或平均预测结果来产生更准确和稳健的预测。

这种方法不仅提高了预测精度,也降低了过拟合风险,并且能够处理高维度和大规模数据集

算法原理

  • 随机: 特征随机,训练集随机

    • 样本:对于一个总体训练集T,T中共有N个样本,每次有放回地随机选择n个样本。用这n个样本来训练一个决策树。

    • 特征:假设训练集的特征个数为d,每次仅选择k(k<d)个来构建决策树。

  • 森林: 多个决策树分类器构成的分类器, 因为随机,所以可以生成多个决策树

  • 处理具有高维特征的输入样本,而且不需要降维

  • 使用平均或者投票来提高预测精度和控制过拟合

API

class sklearn.ensemble.RandomForestClassifier

参数:
n_estimators    int, default=100
森林中树木的数量。(决策树个数)

criterion    {“gini”, “entropy”}, default=”gini” 决策树属性划分算法选择
max_depth    int, default=None 树的最大深度。 

六、线性回归

线性回归介绍

回归是对连续的数据进行预测

线性回归是研究因变量和自变量之间的关系

如y=kx+b

y为因变量,x为自变量,训练过程中y和x是已知的,训练的是k和b,然后拿k和b去预测不同x对应的y

在模型中k一般写为w,叫做权重系数,一般为多个

损失函数

真实值和预测值的差值之和,但是存在正负问题,所以用差值的平方和

样本点太多会导致损失值过大,所以对其求平均

就得到了损失函数

多参数回归

影响结果的不止有一个因素,所以会有多个自变量,也就会有多个w(多个自变量也就是前面所说的特征)

高斯给出的答案:最小二乘法

最小二乘法

不再推导,直接说结论

API

sklearn.linear_model.LinearRegression()
功能: 普通最小二乘法线性回归, 权重和偏置是直接算出来的,对于数量大的不适用,因为计算量太大,计算量太大的适合使用递度下降法

参数:
fit_intercept    bool, default=True
    是否计算此模型的截距(偏置)。如果设置为False,则在计算中将不使用截距(即,数据应中心化)。
属性:     
coef_ 回归后的权重系数
intercept_ 偏置

梯度下降

最小二乘法是直接计算权重和偏置,损失函数不都是凸函数,偏导为0会出现多个极值,无法确定最优解,同时计算量过大,所以采用梯度下降

梯度表示损失函数对于模型参数的偏导数 ,会得到沿着每个参数方向变化时,损失函数的变化率。

梯度下降就是靠猜,通过梯度不断调整,缩小范围,进而达到最优解,但多数情况只能无限接近最优解

损失函数和w的图解

斜率小于0则在在最优点的左侧,斜率大于0则在最优解的右侧

梯度下降公式:w=w-0.01*w

学习率

上述公式中0.01就是学习率,是调整权重的因子,学习率过大则会出现震荡,始终无法收敛,学习率过小则会收敛过慢

sklearn梯度下降

批量梯度下降BGD

批量梯度下降的基本思想是在每个迭代步骤中使用所有训练样本来计算损失函数的梯度,并据此更新模型参数。

特点:计算更精准,梯度更准确,但计算量过大,所以计算成本高,训练时间长

随机梯度下降SGD

SGD 每一步更新参数时仅使用单个训练样本,这使得它更加灵活且计算效率更高,特别是在处理大规模数据集时

API

sklearn.linear_model.SGDRegressor()
参数:
    loss: 损失函数,默认为 ’squared_error’
    fit_intercept: 是否计算偏置, default=True
    eta0: float, default=0.01学习率初始值
     learning_rate:  str, default=’invscaling’   
         The learning rate schedule:
            ‘constant’: eta = eta0 学习率为eta0设置的值,保持不变
            ‘optimal’: eta = 1.0 / (alpha * (t + t0)) 
            ‘invscaling’: eta = eta0 / pow(t, power_t)
            ‘adaptive’: eta = eta0, 学习率由eta0开始,逐步变小
    max_iter: int,  default=1000 经过训练数据的最大次数(又名epoch)
    shuffle=True 每批次是否洗牌
     penalty: {‘l2’, ‘l1’, ‘elasticnet’, None}, default=’l2’
         要使用的惩罚(又称正则化项)。默认为' l2 ',这是线性SVM模型的标准正则化器。
属性:     
coef_ 回归后的权重系数
intercept_ 偏置

小批量梯度下降MBGD

每个迭代步骤中使用一小部分训练样本来计算损失函数的梯度,并据此更新模型参数。这样做的好处在于能够减少计算资源的需求,同时保持一定程度的梯度准确性。

过拟合和欠拟合

过拟合:训练误差大,预测误差大。

原因:模型过于简答,训练次数少,样本过少且对比度不大

欠拟合:训练误差小,预测误差大。

原因:模型过于复杂,还学习了噪声点和异常值,使模型不具有预测能力

正则化

解决过拟合问题

两个模型描述相同,上面的模型更好,因为出现偏差时时,下面的误差是上面的10倍

因此将原来的损失函数加上一个惩罚项使得计算出来的模型W相对小一些,就是正则化

岭回归

采用L2正则项

API

sklearn.linear_model.Ridge()
1 参数:
(1)alpha, default=1.0,正则项力度
(2)fit_intercept, 是否计算偏置, default=True
(3)solver, {‘auto’, ‘svd’, ‘cholesky’, ‘lsqr’, ‘sparse_cg’, ‘sag’, ‘saga’, ‘lbfgs’}, default=’auto’
当值为auto,并且数据量、特征都比较大时,内部会随机梯度下降法。
(4)normalize:,default=True, 数据进行标准化,如果特征工程中已经做过标准化,这里就该设置为False
(5)max_iterint, default=None,梯度解算器的最大迭代次数,默认为15000

2 属性
coef_ 回归后的权重系数
intercept_ 偏置

拉索回归

采用L1正则项

sklearn.linear_model.Lasso()

属性:

  1. coef_:系数向量或者矩阵,代表了每个特征的权重。

  2. intercept_:截距项(如果 fit_intercept=True)。

  3. n_iter_:实际使用的迭代次数。

  4. n_features_in_ (int):训练样本中特征的数量。

七、逻辑回归

逻辑回归是一种分类算法,而非回归

一般用于二分类

原理

逻辑回归的输入是线性回归的输出

线性回归: h(w)=w_1x_1+w_2x_2+....+b

sigmoid激活函数 :

sigmoid函数的值是在[0,1]区间中的一个概率值,默认为0.5为阈值可以自己设定,大于0.5认为是正例,小于则认为是负例

把上面的h(w) 线性的输出再输入到sigmoid函数当中

损失函数:

API

sklearn.linear_model.LogisticRegression()
参数:
    fit_intercept bool, default=True 指定是否计算截距
    max_iter int, default=100  最大迭代次数。迭代达到此数目后,即使未收敛也会停止。
模型对象:
  .coef_ 权重
  .intercept_ 偏置
  predict()预测分类
  predict_proba()预测分类(对应的概率)
  score()准确率

八、无监督学习

  • 无监督学习模型算法中,模型只需要使用特征矩阵X即可,不需要真实的标签y,聚类算法是无监督学习中的代表之一

  • 聚类算法:

    • 数据集中,拥有数据特征,但是没有具体的标签

    • 将数据划分成有意义或有用的簇

    • 聚类算法追求“簇内差异小,簇外差异大”。而这个 “差异”便是通过样本点到其簇质心的距离来衡量

聚类和分类的区别

K-means 算法

​​​​​

K-means 是一种流行的聚类算法,主要用于无监督学习中对未标记的数据进行分类。该算法的目标是将数据集中的样本划分为K个簇,使得簇内的样本彼此之间的差异最小化。这种差异通常通过簇内所有点到该簇中心点的距离平方和来衡量

API

  • K-means 算法输入的是 k 值和样本数据结合,输出的是 k 个簇的集合

  • sklearn.cluster.KMeans

    参数如下:

    • n_clusters: int,默认为8。要创建的簇的数量

    • init: {'k-means++', 'random'}, callable 或传入的数组,默认为'k-means++'。指定如何初始化质心。'k-means++'使用一种启发式方法来选择初始质心,以加快收敛速度;'random'则随机选择初始质心

    • n_init: int,默认为10。运行算法的次数,每次使用不同的质心初始化。

    • max_iter: int,默认为300。单次运行的最大迭代次数

    结果:

  • cluster_centers_属性:cluster_centers_ 属性存储了每个聚类的中心点坐标

  • labels_属性:labels_ 存储了每个数据点的聚类标签

总结

本章介绍了机器学习中的各种算法和调优方式,其中最为重要的是线性回归,其梯度下降的思想是模型经常用到的,多数模型训练就是通过梯度下降得到权重和偏执,然后用其预测未知的标签,后续提高正确率就是通过调整各种参数来修正权重系数,进而达到更高的准确率。

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

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

相关文章

C++17无锁编程实战

在多线程编程里&#xff0c;“锁” 这东西就像把双刃剑 —— 用好了能保数据安全&#xff0c;用不好就麻烦了&#xff1a;大粒度的锁把并发度压得死死的&#xff0c;稍不注意加错锁还可能搞出死锁&#xff0c;程序直接 “僵住”。 但如果能摆脱锁&#xff0c;搞出支持安全并发…

SVT-AV1 svt_aom_motion_estimation_kernel 函数分析

void *svt_aom_motion_estimation_kernel(void *input_ptr) // 运动估计内核主函数&#xff0c;接收线程输入参数{// 从输入参数中获取线程上下文指针EbThreadContext * thread_ctx (EbThreadContext *)input_ptr;// 从线程上下文中获取运动估计上下文指针MotionEstimationCon…

关于NET Core jwt Bearer Token 验证的大坑,浪费3个小时,给各位兄弟搭个桥。

net core 使用jwt Bearer Token 认证获取接口访问权限&#xff0c;前期一阵操作没任何问题&#xff0c;等认证接口写的好了&#xff0c;通过PostMan测试的时候&#xff0c;总是报一个 IDX14102: Unable to decode the header eyJhbGciOiJIUzI1NiIsInR5cCI6 &#xff0c;错误&a…

系统架构设计师备考第14天——业务处理系统(TPS)

一、TPS的核心概念与定位 1. 定义与演进 定义&#xff1a;TPS&#xff08;Transaction Processing System&#xff09;又称电子数据处理系统&#xff08;EDPS&#xff09;&#xff0c;是处理企业日常事务的信息系统&#xff0c;如财务、库存、销售等局部业务管理。历史地位&…

目标检测系列-Yolov5下载及运行

由于项目需要&#xff0c;最近一直在看目标检测相关的资料&#xff0c;不过纸上得来终觉浅&#xff0c;绝知此事要躬行啊。从今日起&#xff0c;将学习的过程记录一下&#xff0c;作为以后用来复习的材料吧。 我想最快的学习便是直接动手做项目&#xff0c;因此今天就将yolov5模…

Linux内核进程管理子系统有什么第四十二回 —— 进程主结构详解(38)

接前一篇文章&#xff1a;Linux内核进程管理子系统有什么第四十一回 —— 进程主结构详解&#xff08;37&#xff09; 本文内容参考&#xff1a; Linux内核进程管理专题报告_linux rseq-CSDN博客 《趣谈Linux操作系统 核心原理篇&#xff1a;第三部分 进程管理》—— 刘超 《…

基于飞算JavaAI的学生成绩综合统计分析系统

第一章&#xff1a;项目概述与背景 1.1 项目背景与意义 在教育信息化飞速发展的今天&#xff0c;学生成绩管理已成为学校教学管理的核心环节。传统的学生成绩管理多依赖于手工操作或基础的信息管理系统&#xff0c;存在数据处理效率低、统计分析功能薄弱、数据可视化缺失等问题…

C++程序员必懂:std::bad_function_call异常的真相与预防秘诀

std::bad_function_call 是 C++ 标准库在 <functional> 头文件中定义的一个异常类型。当程序试图调用一个未持有任何可调用目标(即处于“空状态”)的 std::function 对象时,此异常会被抛出。本文将深入探讨该异常的根本原因、详细的触发场景,并提供一套完整的预防与处…

Html重绘和重排

在网页渲染过程中&#xff0c;重绘&#xff08;repaint&#xff09;和重排&#xff08;reflow&#xff09;是两个重要的概念。理解它们的区别和优化方法对于提升网页性能至关重要。重排&#xff08;Reflow&#xff09;重排是指当页面元素的位置、尺寸等几何属性发生变化时&…

Redis 客户端与服务器:银行的 “客户服务系统” 全流程

目录 一、Redis 客户端&#xff1a;银行的 “客户档案” 二、客户端关闭&#xff1a;银行的 “终止服务规则” 三、命令处理流程&#xff1a;柜员办理业务的 “标准步骤” 1. 接收申请单&#xff08;读取命令请求&#xff09; 2. 确认业务类型&#xff08;查找命令&#x…

HTML图片标签及路径详解

图片是网页内容的重要组成部分&#xff0c;能够使页面更加生动直观。在HTML中&#xff0c;使用<img>标签插入图片&#xff0c;而正确设置图片路径则是确保图片能够正常显示的关键。一、图片标签&#xff08;<img>&#xff09;1. 图片标签的基本语法<img>标签…

【数据库通过日志恢复数据解读】

在数据库恢复机制中&#xff0c;日志文件是实现事务原子性、持久性和崩溃恢复的核心组件。以下通过具体示例和解读方法&#xff0c;结合主流数据库系统的实现细节&#xff0c;详细说明日志文件的内容与分析逻辑。 一、日志文件的核心作用与结构 日志文件通过**预写式日志&#…

【面试题】搜索准确性不高你怎么排查?

系统性排查框架&#xff1a;数据层检查 索引覆盖率&#xff1a;检查文档是否全部正确索引数据新鲜度&#xff1a;确认索引更新频率和延迟文档质量&#xff1a;分析被索引内容的质量和完整性查询理解层 分词分析&#xff1a;检查查询分词是否正确意图识别&#xff1a;验证意图分…

当AI开始“偷吃”用户数据并拼装功能模块:初级开发者的脑洞保卫战与老码农的灵魂蘸料

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录当AI开…

Flowable——流程定义与部署(RepositoryService)

文章目录 前言 参考资料 流程图的部署、查询与删除 流程图的准备 流程的部署 指定已部署流程信息查询 删除指定已部署流程 结语 前言 前篇博客具体说了怎么使用flowable去自动建表,以及搭建配置前端UI绘图的界面。本篇博客主要说明对于已绘制好的流程图如何去进行部署。 Flow…

采用基于模型的方法实现车辆SOA威胁分析自动化

摘要尽管采用面向服务架构&#xff08;SOA&#xff09;有助于实现自动驾驶、空中下载更新等功能&#xff0c;但同时也增加了车辆遭受攻击的风险&#xff0c;可能对道路使用者造成伤害。为解决这一问题&#xff0c;相关标准&#xff08;ISO 21434 / 联合国欧洲经济委员会&#x…

C++语言编程规范-常量

01 C还有搞头吗 02 常量 不变的值更易于理解、跟踪和分析&#xff0c;所以应该尽可能地使用常量代替变量&#xff0c;定义值的时候&#xff0c;应该把 const 作为默认的选项。使用 const 常量取代宏说明&#xff1a;宏是简单的文本替换&#xff0c;在预处理阶段时完成&#x…

【CS32L015C8T6】配置单片机PWM输出(内附完整代码及注释)

目录 前言&#xff1a; 一、CS32L015中定时器及PWM硬件资源介绍&#xff1a; 二、以CS32L015为例配置PWM步骤&#xff1a; 三、完整代码及注释 四、如果这篇文章能帮助到你&#xff0c;请点个赞鼓励一下吧ξ( ✿&#xff1e;◡❛)~ 前言&#xff1a; CS32L015 是一款内嵌 …

hive表不显示列注释column comment的问题解决

安装datasophon平台hive后&#xff0c;发现hive表的字段注释丢失了&#xff0c;表的注释没问题&#xff0c;csv格式的表没问题&#xff0c;只有parquet和orc的表有这个问题。查网上似乎没有这方面的问题。查看mysql表里面的中文注释也一切正常&#xff0c;后来经过多次研究才发…

【笔记】AI Agent发展趋势

前言 本章主要探讨了现在AI技术的发展趋势、大模型的一些局限性和小模型存在的必要性,然后引出了AI Agent的优势与发展趋势。 目标 学完本课程后,您将能够: 了解大模型的局限性; 了解小模型存在的必要性; 了解AI Agent的优势; 了解模型协同的技术。 目录 1.AI发…