机器学习:后篇

目录

一、KNN算法-分类

样本距离

KNN算法原理

缺点

API

二、模型选择与调优

交叉验证

保留交叉验证(HoldOut)

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

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

其他交叉验证

三、朴素贝叶斯-分类

理论介绍

拉普拉斯平滑系数

API

四、决策树-分类

理论介绍

基于信息增益的决策树

基于基尼指数的决策树

API

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

理论介绍

算法原理

API

六、线性回归

线性回归介绍

损失函数

多参数回归

最小二乘法

API

梯度下降

学习率

sklearn梯度下降

批量梯度下降BGD

随机梯度下降SGD

小批量梯度下降MBGD

过拟合和欠拟合

正则化

岭回归

拉索回归

七、逻辑回归

原理

API

八、无监督学习

[K-means 算法](#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_ 存储了每个数据点的聚类标签

总结

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

相关推荐
XZSSWJS8 小时前
机器学习基础-day04-数学方法实现线性回归
人工智能·机器学习·线性回归
大千AI助手8 小时前
梯度爆炸问题:深度学习中的「链式核弹」与拆弹指南
人工智能·深度学习·梯度·反向传播·梯度爆炸·指数效应·链式法则
THMAIL8 小时前
机器学习从入门到精通 - 卷积神经网络(CNN)实战:图像识别模型搭建指南
linux·人工智能·python·算法·机器学习·cnn·逻辑回归
Kingsdesigner8 小时前
PS大神级AI建模技巧!效率翻倍工作流,悄悄收藏!
人工智能·ui·adobe·aigc·ux·设计师·photoshop
AIGC小火龙果8 小时前
AI代码管家:告别烂代码的自动化魔法
人工智能·经验分享·搜索引擎·自动化·aigc·ai编程
东风西巷8 小时前
Topaz Video AI:AI驱动的视频增强与修复工具
人工智能·音视频
凯哥19708 小时前
使用 cURL 测试 vLLM API
人工智能
邂逅星河浪漫8 小时前
【机器学习】HanLP+Weka+Java=Random Forest算法模型
java·spring boot·机器学习·weka·random forest