机器学习基础07_sklearn梯度下降岭回归拉索回归逻辑回归

embedded/2024/11/20 9:51:05/

目录

sklearn%E6%A2%AF%E5%BA%A6%E4%B8%8B%E9%99%8D-toc" style="margin-left:40px;">一、sklearn梯度下降

1、BGD

2、SGD

3、MBGD

二、欠拟合 过拟合

1、欠拟合

2、过拟合

3、正则化

三、岭回归 Ridge

四、拉索回归 Lasso

五、逻辑回归

分类补充:kmeans聚类

回归补充:SVM支持向量机


一、sklearn梯度下降

前一天学到,官方使用的梯度下降API常用有三种: 批量梯度下降BGD(Batch Gradient Descent)、小批量梯度下降MBGD(Mini-BatchGradient Descent)、随机梯度下降SGD(Stochastic Gradient Descent)。

1、BGD

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

更新规则

\theta_j := \theta_j - \alpha \frac{1}{m} \sum_{i=1}^{m} (h_\theta(x^{(i)}) - y^{(i)}) \cdot x_j^{(i)}

j = 0, 1, \ldots, n n是特征数量,\alpha是学习率

特点

  • 准确性:由于使用了所有训练样本,所以得到的梯度是最准确的,这有助于找到全局最小值。

  • 计算成本:每次更新都需要遍历整个数据集,因此计算量较大,特别是在数据集很大的情况下。

  • 收敛速度:虽然每一步的更新都是准确的,但由于计算成本较高,实际收敛到最小值的速度可能不如其他方法快。

  • 内存需求:需要在内存中存储整个数据集,对于大型数据集来说可能成为一个问题。

使用场景

  • 小数据集:当数据集较小时,批量梯度下降是一个不错的选择,因为它能保证较好的收敛性和准确性。

  • 不需要实时更新:如果模型不需要实时更新,例如在离线训练场景下,批量梯度下降是一个合理的选择。

2、SGD

随机梯度下降(SGD)是一种常用的优化算法,SGD 每一步更新参数时仅使用单个训练样本,这使得它更加灵活且计算效率更高,特别是在处理大规模数据集时。

更新规则

\theta_j := \theta_j - \alpha \cdot \frac{\partial J(\theta)}{\partial \theta_j}

注意

  • 学习率 需要适当设置,太大会导致算法不收敛,太小则收敛速度慢。

  • 随机性 每次迭代都从训练集中随机选择一个样本,这有助于避免陷入局部最小值

  • 停止条件 可以是达到预定的最大迭代次数,或者梯度的范数小于某个阈值。

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模型的标准正则化器。' l1 '和'

        elasticnet '可能会给模型(特征选择)带来' l2 '无法实现的稀疏性。当设置为None时,不添加惩罚。

属性:  

coef_ 回归后的权重系数

intercept_ 偏置

# 随机梯度下降SGD
# 加利福尼亚住房数据集 回归预测
from sklearn.datasets import fetch_california_housing
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import SGDRegressor
from sklearn.metrics import mean_squared_error
import pandas as pd# 加载数据
housing = fetch_california_housing(data_home="../src")
x = housing.data
y = housing.target
# print(housing)# 划分数据
x_train,x_test,y_train,y_test = train_test_split(x, y,test_size=0.2)
# 标准化
transfer = StandardScaler()
x_train = transfer.fit_transform(x_train)
x_test = transfer.transform(x_test)
# 线性回归预估器  'constant' 学习率为eta0设置的值,保持不变
estimator = SGDRegressor()
estimator.fit(x_train,y_train)print(f'权重系数:\n{estimator.coef_}')
print(f'偏置:\n{estimator.intercept_}')# 模型预测
y_predict = estimator.predict(x_test)
print(f'预测的数据集:\n{y_predict}')
print(f'得分:\n{estimator.score(x_test,y_test)}')
error = mean_squared_error(y_test,y_predict)
print(f'均方误差:\n{error}')

3、MBGD

小批量梯度下降(MBGD)是一种介于批量梯度下降(BGD)与随机梯度下降(SGD)之间的优化算法,它的基本思想是在每个迭代步骤中使用一小部分(即“小批量”)训练样本来计算损失函数的梯度,并据此更新模型参数。这样做的好处在于能够减少计算资源的需求,同时保持一定程度的梯度准确性。 

更新规则

\theta_j := \theta_j - \alpha \frac{1}{b} \sum_{i \in B} (h_\theta(x^{(i)}) - y^{(i)}) \cdot x_j^{(i)}

特点

  • 计算效率:相比于批量梯度下降,小批量梯度下降每次更新只需要处理一部分数据,减少了计算成本。

  • 梯度估计:相比于随机梯度下降,小批量梯度下降提供了更准确的梯度估计,这有助于更稳定地接近最小值。

  • 内存需求:相比批量梯度下降,小批量梯度下降降低了内存需求,但仍然比随机梯度下降要高。

  • 收敛速度与稳定性:小批量梯度下降能够在保持较快的收敛速度的同时,维持相对较高的稳定性。

使用场景

  • 中等规模数据集:当数据集大小适中时,小批量梯度下降是一个很好的折衷方案,既能够高效处理数据,又能够保持良好的收敛性。

  • 在线学习:在数据流式到达的场景下,小批量梯度下降可以有效地处理新到来的数据批次。

  • 分布式环境:在分布式计算环境中,小批量梯度下降可以更容易地在多台机器上并行执行。

# 小批量梯度下降MBGD
# 加利福尼亚住房数据集 回归预测
from sklearn.datasets import fetch_california_housing
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import SGDRegressor
from sklearn.metrics import mean_squared_error
import pandas as pd
import math# 加载数据
housing = fetch_california_housing(data_home="../src")
x = housing.data
y = housing.target
# print(housing)# 划分数据
x_train,x_test,y_train,y_test = train_test_split(x, y,test_size=0.2)
# 标准化
transfer = StandardScaler()
x_train = transfer.fit_transform(x_train)
x_test = transfer.transform(x_test)def train():# 配置训练参数eta0 = 0.001  # 学习lrepoch = 20  # 迭代次数batch_size = 16  # 小批量大小n_sample = len(x_train)  # 训练样本数量estimator = SGDRegressor()for i in range(epoch):n_batch = math.ceil(n_sample / batch_size)for j in range(n_batch):start = j*batch_sizeend = min((j+1)*batch_size, n_sample)x_train[start:end]estimator.partial_fit(x_train[start:end], y_train[start:end])  # 更新模型权重# 一轮训练结束y_predict = estimator.predict(x_test)mse = mean_squared_error(y_predict,y_test)print(f'第{i}轮,均方误差为:{mse}')train()

 

二、欠拟合 过拟合

 

1、欠拟合

欠拟合是指模型在训练数据上表现不佳,同时在新的未见过的数据上也表现不佳。这通常发生在模型过于简单,无法捕捉数据中的复杂模式时。

表现特征:

  • 训练误差较高。

  • 测试误差同样较高。

  • 模型可能过于简化,不能充分学习训练数据中的模式。

2、过拟合

过拟合是指模型在训练数据上表现得非常好,但在新的未见过的数据上表现较差。这通常发生在模型过于复杂,以至于它不仅学习了数据中的真实模式,还学习了噪声和异常值。

表现特征:

  • 训练误差非常低。

  • 测试误差较高。

  • 模型可能过于复杂,以至于它对训练数据进行了过度拟合。

3、正则化

正则化就是防止过拟合,增加模型的鲁棒性,就像计算机软件在面临攻击、网络过载等情况下能够不死机不崩溃,这就是软件的鲁棒性,鲁棒性调优就是让模型拥有更好的鲁棒性,也就是让模型的泛化能力和推广能力更加的强大。

正则化(鲁棒性调优)的本质就是牺牲模型在训练集上的正确率来提高推广、泛化能力,w在数值上越小越好,这样能抵抗数值的扰动。同时为了保证模型的正确率,w又不能极小。因此将原来的损失函数加上一个惩罚项使得计算出来的模型w相对小一些,就是正则化

损失函数就是原来固有的损失函数,比如回归问题中通常是MSE,然后在加上一部分惩罚项来使得计算出来的模型w相对小一些来带来泛化能力。

常用的惩罚项有L1正则项或者L2正则项:

L1=||w||_1=\textstyle\sum_{i=1}^{n}|w_i|  对应曼哈顿距离;

L2=||w||_2=\textstyle\sqrt[p]{\sum_{i=1}^{n}x^p_i,X=(x_1,x_2,...x_n)}  对应欧式距离。

三、岭回归 Ridge

回归是失损函数通过添加所有权重的平方和的乘积(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_ 偏置

说明:SGDRegressor也可以做岭回归的事情,比如SGDRegressor(penalty='l2',loss="squared_loss"),但是其中梯度下降法有些不同。所以推荐使用Ridge实现岭回归

 

# 加利福尼亚住房数据集 小批量梯度下降 岭回归预测
from sklearn.datasets import fetch_california_housing
from sklearn.model_selection import train_test_split
from sklearn.linear_model import Ridge
from sklearn.metrics import mean_squared_error
import pandas as pd
import math# 加载数据
housing = fetch_california_housing(data_home="../src")
x = housing.data
y = housing.target
# print(housing)# 划分数据
x_train,x_test,y_train,y_test = train_test_split(x, y,test_size=0.2)def train():# 配置训练参数eta0 = 0.001  # 学习lrepoch = 20  # 迭代次数batch_size = 16  # 小批量大小n_sample = len(x_train)  # 训练样本数量estimator = Ridge()estimator.fit(x_train, y_train)s = estimator.score(x_test, y_test)print(s)train()

四、拉索回归 Lasso

Lasso回归是一种线性回归模型,它通过添加所有权重的绝对值之和(L1)来惩罚模型的复杂度。

损失函数:

\text{J(w)}= \frac{1}{2n}\sum_{i=1}^n (h_w(x_i)-y_i)^2 + \lambda \sum_{j=1}^p |w_j|

特点:

  • 拉索回归可以将一些权重压缩到零,从而实现特征选择。这意味着模型最终可能只包含一部分特征。

  • 适用于特征数量远大于样本数量的情况,或者当特征间存在相关性时,可以从中选择最相关的特征。

  • 拉索回归产生的模型可能更简单,因为它会去除一些不重要的特征。

api

sklearn.linear_model.Lasso()

参数

alpha (float, default=1.0):

控制正则化强度;必须是非负浮点数。较大的 alpha 增加了正则化强度。

fit_intercept (bool, default=True):

是否计算此模型的截距。如果设置为 False,则不会使用截距(即数据应该已经被居中)。

precompute (bool or array-like, default=False):

如果为 True,则使用预计算的 Gram 矩阵来加速计算。如果为数组,则使用提供的 Gram 矩阵。

copy_X (bool, default=True):

如果为 True,则复制数据 X,否则可能对其进行修改。

max_iter (int, default=1000):

最大迭代次数。

tol (float, default=1e-4):

精度阈值。如果更新后的系数向量减去之前的系数向量的无穷范数除以 1 加上更新后的系数向量的无穷范数小于 tol,则认为收敛。

warm_start (bool, default=False):

当设置为 True 时,再次调用 fit 方法会重新使用之前调用 fit 方法的结果作为初始估计值,而不是清零它们。

positive (bool, default=False):

当设置为 True 时,强制系数为非负。

random_state (int, RandomState instance, default=None):

随机数生成器的状态。用于随机初始化坐标下降算法中的随机选择。

selection ({'cyclic', 'random'}, default='cyclic'):

如果设置为 'random',则随机选择坐标进行更新。如果设置为 'cyclic',则按照循环顺序选择坐标。

# 加利福尼亚住房数据集 拉索回归预测
from sklearn.datasets import fetch_california_housing
from sklearn.model_selection import train_test_split
from sklearn.linear_model import Lasso
from sklearn.metrics import mean_squared_error
import mathdef data_load():data = fetch_california_housing(data_home="../src")x_train,x_test,y_train,y_test = train_test_split(data.data, data.target,test_size=0.2,random_state=66)return x_train,x_test,y_train,y_testdef train(x_train,y_train):estimator = Lasso(alpha=0.01)estimator.fit(x_train,y_train)return estimatordef test(estimator,x_test,y_test):y_predict = estimator.predict(x_test)mse = mean_squared_error(y_test,y_predict)rmse = math.sqrt(mse)return rmsex_train,x_test,y_train,y_test = data_load()
estimator = train(x_train,y_train)
s = test(estimator,x_test,y_test)
print(f'误差为\n{s}')
score = estimator.score(x_test,y_test)
print(f'模型准确率为\n{score}')
print(f'系数为{estimator.coef_}')

 f(w)=\frac{1}{1+e^{-h(w)}}

五、逻辑回归

逻辑回归(Logistic Regression)是机器学习中的一种分类模型,逻辑回归是一种分类算法,虽然名字中带有回归,但是它与回归之间有一定的联系。逻辑回归一般用于二分类问题。

原理

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

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

sigmoid激活函数 :f(x)=\frac{1}{1+e^{-x}}

h(w) 线性的输出再输入到sigmoid函数当中:f(w)=\frac{1}{1+e^{-h(w)}}

损失函数:

关于损失函数的推导,可参考文章逻辑回归(Logistic Regression)

要使loss函数最小,即 y=1时,我们希望h\theta(x)越大越好, y=0时,希望h\theta(x)越小越好,

综合0和1的损失函数:

 然后使用梯度下降算法,去减少损失函数的值,这样去更新逻辑回归前面对应算法的权重参数,提升原本属于1类别的概率,降低原本是0类别的概率。

api

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

# 鸢尾花数据集 逻辑回归
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegressionx,y = load_iris(return_X_y=True)index = y!=2
x = x[index]
y = y[index]
# print(y)
# print(x.shape)
x_train,x_test,y_train,y_test = train_test_split(x,y,test_size=0.2,random_state=66)
estimator = LogisticRegression()
estimator.fit(x_train,y_train)
x_new = [[5,2.9,4,1.5]]
y_new = estimator.predict(x_new)
print(f'新值为:{y_new}')
y_predict = estimator.predict(x_test)
print(f'预测值:{y_predict}')
# 预测分类对应的概率
proba=estimator.predict_proba(x_test)
print(proba)
# 评估模型
print(f'得分:{estimator.score(x_test,y_test)}')

分类补充:kmeans聚类

# kmeans聚类
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt# 创建数据
data = np.random.randint(0,100, (100,2))# 初始化 KMeans 模型
clusters=8  # 聚类数量
kmeans = KMeans(clusters)
kmeans.fit(data)for i in range(clusters):point = data[kmeans.labels_==i]  # 获取每个类别的点plt.scatter(point[:,0], point[:,1])  # 画出每个类别plt.scatter(kmeans.cluster_centers_[:,0], kmeans.cluster_centers_[:,1])
plt.show()

 

回归补充:SVM支持向量机

# svm支持向量机
from sklearn.svm import SVC
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_splitx,y = load_iris(return_X_y=True)
x_train,x_test,y_train,y_test = train_test_split(x,y,test_size=0.2)
clf = SVC()
clf.fit(x_train,y_train)
s = clf.score(x_test,y_test)
print(s)
print(clf.predict([[5.1,3.5,1.4,0.2]]))


http://www.ppmy.cn/embedded/139043.html

相关文章

web——upload-labs——第十一关——黑名单验证,双写绕过

还是查看源码, $file_name str_ireplace($deny_ext,"", $file_name); 该语句的作用是:从 $file_name 中去除所有出现在 $deny_ext 数组中的元素,替换为空字符串(即删除这些元素)。str_ireplace() 在处理时…

在 WSL2 Ubuntu22.04环境安装 MySQL

一、安装步骤 1.1. 确保/etc/apt/sources.list源配置文件一切正常 sudo nano /etc/apt/sources.list需要包括以下内容 deb http://archive.ubuntu.com/ubuntu/ focal main restricted universe multiverse deb-src http://archive.ubuntu.com/ubuntu/ focal main restricted…

NPOI 实现Excel模板导出

记录一下使用NPOI实现定制的Excel导出模板&#xff0c;已下实现需求及主要逻辑 所需Json数据 对应参数 List<PurQuoteExportDataCrInput> listData [{"ItemName": "电缆VV3*162*10","Spec": "电缆VV3*162*10","Uom":…

视频直播5G CPE解决方案:ZX7981PG/ZX7981PMWIFI6网络覆盖

方案背景 视频直播蓬勃发展的当下&#xff0c;传统直播网络联网方式的局限性越来越明显。目前传统直播的局限性主要集中在以下几个方面&#xff1a; 传统直播间网络架构条件有限&#xff0c;可连接WIFI数量少&#xff0c;多终端同时直播难以维持&#xff1b;目前4G网络带宽有限…

《物理学进展》

投稿指南 《物理学进展》是中国物理学会主办的物理类刊物&#xff0c;双月刊&#xff0c;为国家中文核心期刊。刊稿内容包括物理学的各分支学科&#xff0c;着重反映物理学前沿领域的重大突破和新兴方向中的活跃状态&#xff0c;以及传统和交叉学科的最新进展。稿件类型包括对某…

2025考研政治徐涛背诵手册(电子版pdf)无套路免费分享

每天都在努力为大家搜集和整理优质的资源&#xff0c;内容涵盖学习、生活、娱乐等方方面面。这些资源可能不会立即改变你的生活&#xff0c;但我希望它们能够为你带来新的视角、新的知识&#xff0c;甚至一点点启发。无论你是为了提升自我、丰富日常&#xff0c;还是在忙碌之余…

【后端速成Vue】Vue 的生命周期

前言&#xff1a; 本期将会介绍 Vue 的声明周期对应的钩子&#xff0c;以及理解什么时候该用什么钩子函数。 篮球哥找工作专属IT岗位内部推荐&#xff1a; 专属内推链接&#xff1a;内推通道 1、了解 Vue 的生命周期 思考&#xff1a;什么时候可以发送初始化渲染请求&#xf…

Android集成FCM(Firebace Cloud Messaging )

集成FCM官方文档 Firebace主页面 将 Firebase 添加到您的 Android 应用 1、进入Firebace页面&#xff0c;创建自己的项目 2、点击自己创建好的项目&#xff0c;在右侧选择Cloud Messaging 3、点击Android去创建 google-services.json 4、将下载的 google-services.json 文件…