使用随机梯度下降方法对sklearn里的紫鸢花数据集进行分析

小白学习机器学习

from sklearn.linear_model import SGDRegressor
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import mean_squared_error, r2_score

//加载数据
iris = load_iris()
X = iris['data']//获得特征值
y = iris['target']//获得标签

//由于随机梯度下降方法对数据集里的数据特征放缩极其敏感,所以在建立模型前需要对数据进行标准化处理,为了消除量纲的影响(比如特征1单位为米,特征2单位为厘米,那么这两个特征的数值大小就会差异很大。)
scaler = StandardScaler()//使用StandardScaler类来进行标准化处理,标准化处理的过程是将每个特征的值减去其均值,然后除以其标准差,以确保所有特征具有零均值和单位方差。这有助于优化算法更快地收敛,并且可以提高模型的性能。
X_scaled = scaler.fit_transform(X)//生成标准化数据

//数据集划分
X_train, X_test, y_train, y_test = train_test_split(X_scaled, y, test_size=0.2)//测试集占比20%

// 创建SGD回归模型
sgd_reg = SGDRegressor(max_iter=10000, tol=1e-3, random_state=42)//设置迭代次数,容忍度,随机种子,具体解释在最底下
sgd_reg.fit(X_train, y_train)//开始训练

// 模型评估
y_pred = sgd_reg.predict(X_test)//对测试集进行预测
mse = mean_squared_error(y_test, y_pred)//计算均方误差,MSE 的值越小,表示模型的预测性能越好,因为模型的预测值与真实值之间的差异越小
r2 = r2_score(y_test, y_pred)//R² 分数是一种常用的评估回归模型性能的指标,它衡量了模型对因变量方差的解释程度,即模型拟合数据的程度。

//输出模型系数、截距、均方误差和决定系数。

print(f"Coefficients: {sgd_reg.coef_}")
print(f"Intercept: {sgd_reg.intercept_}")
print(f"Mean Squared Error (MSE): {mse}")
print(f"R^2 Score: {r2}")
---------------------------------------------------------------------------------------------------------------------------------

结果:
Coefficients: [ 0.0779373  -0.07982388  0.30055575  0.37830519]
Intercept: [0.99146711]
Mean Squared Error (MSE): 0.051195018801016776
R^2 Score: 0.9006993169807864
根据给出的系数、截距、MSE 和 R² 分数,可以初步判断该回归模型在这组数据上表现良好,能够较好地拟合数据并进行准确的预测

tip:

1、容忍度:

容忍度(tolerance)在机器学习中通常用于指定一个阈值,用于确定算法的收敛条件。在训练迭代过程中,当算法在每次迭代中更新的模型参数的变化量小于容忍度时,算法可以认为已经收敛,即达到了一个满意的模型状态,不再需要继续迭代。

在梯度下降等优化算法中,容忍度通常被用来判断优化过程是否已经足够接近最优解。如果连续两次迭代之间的参数变化量小于容忍度,算法就可以停止迭代,因为此时参数的变化已经足够小,可以认为已经找到了一个接近最优解的解。

2、随机种子

随机种子是一个用来初始化随机数生成器的参数。在计算机程序中,随机数生成器通常不是真正的随机,而是由一个确定的算法生成的伪随机数。随机种子决定了随机数生成器的初始状态,从而影响了生成的随机数序列。

设置了随机种子之后,无论何时运行程序,都会得到相同的随机数序列。这种确定性的行为对于调试和验证模型非常有用,因为它可以确保在相同的条件下获得相同的结果。

在机器学习中,设置随机种子可以确保在拆分数据集、初始化模型参数或其他涉及随机性的情况下,实验的可重复性和可验证性。

在代码示例中,random_state=42 指定了随机种子为42,这意味着每次运行该代码时,都会使用相同的随机种子,从而保证了随机梯度下降算法的可重复性。

通过变化“sgd_reg = SGDRegressor(max_iter=10000, tol=1e-3, random_state=42)”里的参数值可以获得不一样的结果,例如我自己后面改成了这样:

sgd_reg = SGDRegressor(max_iter=100000, tol=1e-99, random_state=20)

对应的结果为:

Coefficients: [-0.0776145  -0.02882377  0.34601813  0.49499509]
Intercept: [0.99572764]
Mean Squared Error (MSE): 0.035306836937342885
R^2 Score: 0.9466843066382407

可以看出来相较于之前,R^2值变大了,MSE(均方误差)变小了,代表通过改变参数大小,结果的精确度有进一步的提升。

严格来说,SGD只是一种优化技术,而不是特定的机器学习模型系列。它只是训练模型的一种方式

Stochastic Gradient Descent 的优点是:

  • 效率。

  • 易于实现(代码调整有很多机会)。

随机梯度下降的缺点包括:

  • SGD 需要许多超参数,例如正则化 参数和迭代次数。

  • SGD 对特征缩放很敏感。

<think>我们使用逻辑回归对数据集进行分类。由于数据集有三个类别,而逻辑回归通常是二分类,因此我们可以采用两种策略: 1. 一对多(One-vs-Rest, OvR):训练三个二分类器,每个分类器分别将某一类与其他类区分开。 2. 使用多项逻辑回归(Multinomial Logistic Regression),也称为softmax回归,直接处理多分类问题。 这我们将使用scikit-learn库,它自带了数据集。我们将采用多项逻辑回归(通过设置LogisticRegression的multi_class='multinomial')来进行多分类。 步骤: 1. 导入必要的库。 2. 加载数据集。 3. 数据预处理(如标准化,因为逻辑回归对特征的缩放敏感)。 4. 划分训练集和测试集。 5. 创建逻辑回归模型,设置参数(注意:对于多项逻辑回归,需要使用solver支持' multinomial'的优化器,如'lbfgs'、'newton-cg'等)。 6. 训练模型。 7. 在测试集上评估模型(计算准确率)。 8. 可以打印分类报告和混淆矩阵以获取更多细节。 下面我们用代码实现。 </think>下面我将详细解释如何使用逻辑回归对Sklearn中的数据集进行分类。数据集包含3类(Setosa, Versicolor, Virginica),每类50个样本,每个样本有4个特征(萼长宽、瓣长宽)。 ### 解决方案 ```python # 导入所需库 from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split from sklearn.linear_model import LogisticRegression from sklearn.preprocessing import StandardScaler from sklearn.metrics import classification_report, confusion_matrix import matplotlib.pyplot as plt import seaborn as sns import numpy as np # 1. 加载数据集 iris = load_iris() X = iris.data # 特征矩阵 (150x4) y = iris.target # 目标向量 (150,) # 2. 数据预处理 # 标准化特征值(逻辑回归对特征缩放敏感) scaler = StandardScaler() X_scaled = scaler.fit_transform(X) # 3. 划分训练集和测试集 (70%训练, 30%测试) X_train, X_test, y_train, y_test = train_test_split( X_scaled, y, test_size=0.3, random_state=42, stratify=y ) # 4. 创建并训练逻辑回归模型 # multi_class='multinomial' 使用Softmax回归处理多分类 # solver='lbfgs' 适用于小数据集的多分类问题 # max_iter=200 增加迭代次数确保收敛 model = LogisticRegression( multi_class='multinomial', solver='lbfgs', max_iter=200, random_state=42 ) model.fit(X_train, y_train) # 5. 模型评估 y_pred = model.predict(X_test) # 打印分类报告 print("分类报告:") print(classification_report(y_test, y_pred, target_names=iris.target_names)) # 可视化混淆矩阵 plt.figure(figsize=(8, 6)) cm = confusion_matrix(y_test, y_pred) sns.heatmap(cm, annot=True, fmt='d', cmap='Blues', xticklabels=iris.target_names, yticklabels=iris.target_names) plt.title('混淆矩阵') plt.ylabel('实际类别') plt.xlabel('预测类别') plt.show() # 6. 可视化决策边界(使用前两个特征) plt.figure(figsize=(10, 6)) # 只使用前两个特征(萼长宽)进行可视化 X_train_2d = X_train[:, :2] model_2d = LogisticRegression( multi_class='multinomial', solver='lbfgs', max_iter=1000 ).fit(X_train_2d, y_train) # 创建网格点 x_min, x_max = X_train_2d[:, 0].min() - 1, X_train_2d[:, 0].max() + 1 y_min, y_max = X_train_2d[:, 1].min() - 1, X_train_2d[:, 1].max() + 1 xx, yy = np.meshgrid(np.arange(x_min, x_max, 0.02), np.arange(y_min, y_max, 0.02)) Z = model_2d.predict(np.c_[xx.ravel(), yy.ravel()]) Z = Z.reshape(xx.shape) # 绘制决策区域 plt.contourf(xx, yy, Z, alpha=0.8, cmap=plt.cm.Paired) # 绘制训练点 for i, color, name in zip([0,1,2], ['r','g','b'], iris.target_names): idx = np.where(y_train == i) plt.scatter(X_train_2d[idx, 0], X_train_2d[idx, 1], c=color, label=name, edgecolor='black', s=50) plt.xlabel('标准化萼长度') plt.ylabel('标准化萼宽度') plt.title('逻辑回归决策边界 (基于前两个特征)') plt.legend() plt.show() ``` ### 代码解释 1. **数据加载与预处理**: - 加载数据集(150个样本,4个特征) - 使用`StandardScaler`标准化特征值(均值0,方差1),逻辑回归对特征尺度敏感 - 按7:3比例分层抽样划分训练/测试集(`stratify=y`保持类别比例) 2. **模型构建**: - `multi_class='multinomial'`:使用Softmax回归处理多分类问题 - `solver='lbfgs'`:适用于小规模数据集的优化算法 - `max_iter=200`:增加迭代次数确保收敛(默认100次可能不足) 3. **评估指标**: - 分类报告:展示精确度(precision)、召回率(recall)、F1分数等 - 混淆矩阵:直观显示各类别的分类情况 4. **可视化**: - 混淆矩阵热力图:使用Seaborn直观展示分类结果 - 决策边界图:基于前两个特征展示分类平面(实际模型使用全部4个特征) ### 关键参数说明 - **multi_class**:`'multinomial'`表示使用Softmax回归,适合多分类;`'ovr'`表示一对其余 - **solver选择**: - `'lbfgs'`:拟牛顿法,适合小数据集 - `'sag'`:随机平均梯度下降,适合大数据集 - `'liblinear'`:只支持二分类和OvR - **正则化**:默认使用L2正则化(可通过`penalty`参数修改) ### 典型输出结果 ``` 分类报告: precision recall f1-score support setosa 1.00 1.00 1.00 15 versicolor 1.00 0.93 0.97 15 virginica 0.94 1.00 0.97 15 accuracy 0.98 45 macro avg 0.98 0.98 0.98 45 weighted avg 0.98 0.98 0.98 45 ``` ### 注意事项 1. 特征标准化对逻辑回归至关重要 2. 当特征间存在高度相关性时,考虑添加正则化 3. 多分类问题中,如果各类样本不均衡需添加`class_weight='balanced'` 4. 可视化时选择最重要的两个特征(实际模型使用全部特征)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值