python机器学习库sklearn——SGD梯度下降法

分享一个朋友的人工智能教程。零基础!通俗易懂!风趣幽默!还带黄段子!大家可以看看是否对自己有帮助:点击打开

docker/kubernetes入门视频教程


全栈工程师开发手册 (作者:栾鹏)
python数据挖掘系列教程

梯度下降法算法详情参考:https://www.cnblogs.com/pinard/p/5970503.html

随机梯度下降(SGD) 是一种简单但又非常高效的方法,主要用于凸损失函数下线性分类器的判别式学习,例如(线性) 支持向量机 和 Logistic 回归 。

Stochastic Gradient Descent (随机梯度下降法)的优势:

  • 高效。
  • 易于实现 (有大量优化代码的机会)。

Stochastic Gradient Descent (随机梯度下降法)的劣势:

  • SGD 需要一些超参数,例如 regularization (正则化)参数和 number of iterations (迭代次数)。
  • SGD 对 feature scaling (特征缩放)敏感。

随机梯度下降分类

loss function(损失函数) 可以通过 loss 参数来设置。 SGDClassifier 支持以下的 loss functions(损失函数):

  • loss=“hinge”: (soft-margin) linear Support Vector Machine ((软-间隔)线性支持向量机),
  • loss=“modified_huber”: smoothed hinge loss (平滑的 hinge 损失),
  • loss=“log”: logistic regression (logistic 回归),
  • and all regression losses below(以及所有的回归损失)。

惩罚方法可以通过 penalty 参数来设定。 SGD 支持以下 penalties(惩罚):

  • penalty=“l2”: L2 norm penalty on coef_.
  • penalty=“l1”: L1 norm penalty on coef_.
  • penalty=“elasticnet”: Convex combination of L2 and L1(L2 型和 L1 型的凸组合); (1 - l1_ratio) * L2 + l1_ratio * L1.

默认设置为 penalty=“l2” 。 L1 penalty (惩罚)导致稀疏解,使得大多数系数为零。 Elastic Net(弹性网)解决了在特征高相关时 L1 penalty(惩罚)的一些不足。参数 l1_ratio 控制了 L1 和 L2 penalty(惩罚)的 convex combination (凸组合)。

#===============随机梯度下降法分类===============

from sklearn.linear_model import SGDClassifier
from sklearn.datasets.samples_generator import make_blobs
import numpy as np
import matplotlib.pyplot as plt

X, y = make_blobs(n_samples=50, centers=2, random_state=0, cluster_std=0.60)
# loss:损失项。hinge:(软-间隔)线性支持向量机,modified_huber:平滑的 hinge 损失,log:logistic 回归,其他所有的回归损失
# penalty:惩罚项。l2:L2正则,l1:L1正则,elasticnet:(1 - l1_ratio) * L2 + l1_ratio * L1
clf = SGDClassifier(loss="hinge", alpha=0.01, max_iter=200, fit_intercept=True)  #
clf.fit(X, y)  # 训练模型

print('回归系数:',clf.coef_)
print('偏差:',clf.intercept_ )

# 绘制线,点
xx1 = np.linspace(-1, 5, 10)
xx2 = np.linspace(-1, 5, 10)

X1, X2 = np.meshgrid(xx1, xx2)  # X1、X2都是10*10的矩阵
Z = np.empty(X1.shape)
for (i, j), val in np.ndenumerate(X1):  # 迭代第i行第j列的坐标xx1取值为val
    x1 = val
    x2 = X2[i, j]  #
    p = clf.decision_function([[x1, x2]])  # 计算输出值,也就是到超平面的符号距离。(支持向量到最佳超平面的符号距离为-1和+1)
    Z[i, j] = p[0]
levels = [-1.0, 0.0, 1.0]  # 将输出值分为-1,0,1几个区间
linestyles = ['dashed', 'solid', 'dashed']
plt.contour(X1, X2, Z, levels, colors='k', linestyles=linestyles)  # 绘制等高线图,高度为-1,0,1,也就是支持向量形成的线和最佳分割超平面
plt.scatter(X[:, 0], X[:, 1], c=y, s=20)  # 绘制样本点
plt.show()

这里写图片描述

随机梯度下降法进行多分类

SGDClassifier 通过利用 “one versus all” (OVA)方法来组合多个二分类器,从而实现多分类。对于每一个 K 类, 可以训练一个二分类器来区分自身和其他 K-1 个类。

在 multi-class classification (多类分类)的情况下, coef_ 是 shape=[n_classes, n_features] 的一个二维数组, intercept_ 是 shape=[n_classes] 的一个一维数组。 coef_ 的第 i 行保存了第 i 类的 OVA 分类器的权重向量;类以升序索引 (参照属性 classes_ )。 注意,原则上,由于它们允许创建一个概率模型,所以 loss=“log” 和 loss=“modified_huber” 更适合于 one-vs-all 分类。

SGDClassifier 通过拟合参数 class_weight 和 sample_weight 来支持 weighted classes (加权类)和 weighted instances(加权实例)。

# ==============随机梯度下降法进行多分类=============
from sklearn.linear_model import SGDClassifier
from sklearn.metrics import accuracy_score
from sklearn import datasets
iris = datasets.load_iris()
X,y=iris.data,iris.target
clf = SGDClassifier(alpha=0.001, max_iter=100).fit(X, y)
y_pred = clf.predict(X)
print('三分类花卉数据准确率:',accuracy_score(y,y_pred))
print('包含的二分类器索引:',clf.classes_)    # one versus all 方法来组合多个二分类器
print('回归系数:',clf.coef_)  # 每一个二分类器的回归系数
print('偏差:',clf.intercept_ ) # 每一个二分类器的偏差

随机梯度下降法回归

SGDRegressor 类实现了一个简单的随机梯度下降学习例程,它支持用不同的损失函数和惩罚来拟合线性回归模型。 SGDRegressor 非常适用于有大量训练样本(>10.000)的回归问题,对于其他问题,我们推荐使用 Ridge ,Lasso ,或 ElasticNet 。

具体的损失函数可以通过 loss 参数设置。 SGDRegressor 支持以下的损失函数:

  • loss=“squared_loss”: Ordinary least squares(普通最小二乘法),
  • loss=“huber”: Huber loss for robust regression(Huber回归),
  • loss=“epsilon_insensitive”: linear Support Vector Regression(线性支持向量回归).

Huber 和 epsilon-insensitive 损失函数可用于 robust regression(鲁棒回归)。不敏感区域的宽度必须通过参数 epsilon 来设定。这个参数取决于目标变量的规模。

SGDRegressor 支持 ASGD(平均随机梯度下降) 作为 SGDClassifier。 均值化可以通过设置 average=True 来启用。

对于利用了 squared loss(平方损失)和 l2 penalty(l2惩罚)的回归,在 Ridge 中提供了另一个采取 averaging strategy(平均策略)的 SGD 变体,其使用了随机平均梯度 (SAG) 算法。

# #===============随机梯度下降法回归===============
from sklearn import linear_model
from sklearn.datasets import load_boston
X,y = load_boston().data,load_boston().target
clf = linear_model.SGDRegressor(loss='squared_loss',penalty='l2',alpha=0.01,max_iter=1000)
clf.fit(X, y)
print('得分:',clf.score(X,y))
print('回归系数:',clf.coef_)
print('偏差:',clf.intercept_ )
  • 7
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
波士顿房价预测是一个经典的回归问题。梯度下降法是一种常用的优化算法,可以用于训练机器学习模型。下面是使用梯度下降法预测波士顿房价的基本步骤: 1. 数据预处理:对数据进行清洗、归一化等处理,使得数据更易于被模型学习。 2. 定义模型:选择一个适当的模型结构,并定义模型的参数。 3. 定义损失函数:选择一个适当的损失函数来衡量模型的预测结果与真实值之间的差距。 4. 训练模型:使用训练数据集来训练模型,通过梯度下降法不断调整模型参数,使得模型的预测结果更加接近真实值。 5. 模型评估:使用测试数据集来评估模型的预测能力,进一步优化模型参数。 以下是一份使用梯度下降法预测波士顿房价的 Python 代码示例: ```python import numpy as np import pandas as pd from sklearn.datasets import load_boston from sklearn.model_selection import train_test_split # 加载波士顿房价数据集 boston = load_boston() X, y = boston.data, boston.target # 训练集和测试集的划分 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) # 数据归一化 mean = X_train.mean(axis=0) std = X_train.std(axis=0) X_train = (X_train - mean) / std X_test = (X_test - mean) / std # 定义模型 def predict(X, w, b): return np.dot(X, w) + b # 定义损失函数 def mse_loss(y_true, y_pred): return np.mean(np.square(y_true - y_pred)) # 定义梯度计算函数 def compute_gradient(X, y_true, y_pred): n = len(X) dw = -2/n * np.dot(X.T, y_true - y_pred) db = -2/n * np.sum(y_true - y_pred) return dw, db # 模型训练 lr = 0.01 # 学习率 n_epochs = 1000 # 迭代次数 w = np.random.randn(X_train.shape[1]) # 初始化权重 b = 0 # 初始化偏差 for epoch in range(n_epochs): y_pred = predict(X_train, w, b) loss = mse_loss(y_train, y_pred) dw, db = compute_gradient(X_train, y_train, y_pred) w -= lr * dw b -= lr * db if epoch % 100 == 0: print(f"Epoch {epoch}, Train loss: {loss:.4f}") # 模型评估 y_pred = predict(X_test, w, b) test_loss = mse_loss(y_test, y_pred) print(f"Test loss: {test_loss:.4f}") ``` 这份代码使用了随机梯度下降法SGD)来更新模型参数,每次迭代都随机选择一个样本来计算梯度。在每个 epoch 结束时,打印出训练集的损失,并使用测试集来评估模型的泛化能力。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

腾讯AI架构师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值