首页 / 资讯中心 / 文章详情

鸢尾花数据集线性回归实操:Python双框架详解

鸢尾花数据集线性回归实操:Python双框架详解 ★ FEATURED ARTICLE
简介面向机器学习初学者和数据分析爱好者这份鸢尾花线性回归资源包提供了Python实现与配套的鸢尾花数据集适用于课程实验、毕业设计或自学巩固等场景。数据集以花萼长度、花萼宽度、花瓣长度、花瓣宽度四个连续属性作为输入用于区分Setosa、Versicolour、Virginica三个鸢尾花品种是多重变量分析和分类建模的经典入门素材通过简单代码即可观察特征与标签间的关联理解线性回归在分类任务中的局限与适用条件。压缩包共2个文件分别为1个Python脚本和1个data数据文件整体大小仅2KB轻量易得脚本结构简洁包含从数据读取到模型拟合的主要步骤可直接在Jupyter或本地Python环境运行数据文件则便于反复调用与替换。已有11537人学习下载热度在同类基础资源中较为突出侧面印证了其上手友好性和教学适用性。借助该资源读者可以快速跑通线性回归处理分类问题的完整流程直观观察不同特征对预测结果的影响并基于现有代码尝试特征组合、算法替换等扩展练习从而加深对机器学习基础流程的理解为后续学习更多监督学习算法打下基础。1. 鸢尾花数据集遇上线性回归一份能直接跑通的 Python 入门资源如果你是机器学习初学者鸢尾花数据集几乎是所有人的第一个见面礼150 条样本、4 个特征、3 个类别小巧到可以在几秒内完成训练和推理。但很多人卡在第一步——不知道怎样把这份数据集和线性回归模型真正在 Python 里跑起来更不知道跑完之后怎么看结果、怎么判断模型好坏。这份资源把「鸢尾花数据集 线性回归 Python 实现」打包成一整套可复现的代码流程从数据加载到模型训练再到可视化每一步都有对应脚本。适合刚接触 scikit-learn 和 PyTorch 的开发者也适合想快速搭建一个完整机器学习 Demo 的从业者。它不是一篇泛泛的教程文档而是一份可以直接下载、改参数、看效果的真实工程代码集。2. 鸢尾花数据集的底层逻辑形态特征如何决定算法选型2.1 数据集的样本结构与特征边界鸢尾花数据集由 150 个样本组成每个样本包含 4 个数值型特征花萼长度、花萼宽度、花瓣长度、花瓣宽度单位是厘米。标签是鸢尾花的三个亚属山鸢尾、变色鸢尾、维吉尼亚鸢尾每个类别恰好 50 条样本。这个结构决定了它的两大用途回归任务可以拿其中一个连续特征作为预测目标分类任务则拿离散类别作为输出。我第一次用这份数据时踩过一个认知偏差线性回归更常用于预测连续值但鸢尾花数据集本身是分类问题常见做法是先用线性回归版本做特征关系探索再过渡到逻辑回归做分类。这并不矛盾——比如我们可以用花萼长度预测花瓣长度这是一个典型的回归任务而线性回归模型恰好能帮我们理解特征之间的线性相关性。数据规模决定了模型的复杂度上限。150 条样本训练集划分后可能只有 105 条左右这个体量容不下深层网络也不适合做大规模集成学习。线性回归和逻辑回归是这个数据集上的最优起点既能保证模型收敛又不会出现过拟合失控。如果你直接套用随机森林或 XGBoost虽然精度可能更高但模型的解释性下降了而且很难感受到参数更新的直观过程。2.2 为什么线性回归适合鸢尾花特征预测线性回归的核心假设是自变量与因变量之间存在线性关系。在鸢尾花数据集中花瓣长度和花瓣宽度之间确实存在较强的正相关相关系数大约在 0.87 左右这意味着用一个线性模型去拟合它能够获得较高的 R² 分数。具体来说线性回归模型的数学形式是 y w1·x1 w2·x2 ... wn·xn b其中 w 是特征的权重b 是偏置。在鸢尾花场景中如果我们要用花萼长度、花萼宽度、花瓣宽度预测花瓣长度那么模型就是在寻找一组 w 和 b使预测值与真实值的均方误差最小。训练过程本质上是梯度下降或最小二乘法求解这个优化问题。对于 Python 实现来说scikit-learn 中的 LinearRegression 类默认采用最小二乘法直接求解正规方程无需手动设置学习率。而 PyTorch 实现则会用到梯度下降需要设置学习率和迭代轮数。这两种方式我都在这份资源中给出了实现它们的训练时间都在秒级但代码结构差异很大正好可以用来对比框架特点。这里有一个容易混淆的点线性回归的输出是一个连续数值而鸢尾花数据集的标签是三类离散值。如果你直接用线性回归去拟合类别标签模型输出的可能就是 0.3 或 1.7 这样的数无法直接对应到某个类别需要设定阈值才能完成分类。更规范的做法是使用逻辑回归或 Softmax 回归。这份资源中两者都有覆盖但在初学者阶段先把线性回归跑通、把 R² 和 MSE 看懂比急着做分类更重要。3. 数据加载与预处理从 CSV 到张量的完整链路3.1 三种方式读取鸢尾花数据集不管用 scikit-learn 还是 PyTorch第一步都是把数据装进内存。鸢尾花数据集的读取方式常见的有三种直接在线下载、从 CSV 文件读取、通过 scikit-learn 内置接口获取。我一般推荐最后一种因为不需要手工处理列名和缺失值。# 方式一scikit-learn 内置加载推荐 from sklearn.datasets import load_iris import pandas as pd iris load_iris() df pd.DataFrame(iris.data, columnsiris.feature_names) df[target] iris.target print(df.head()) print(df.info())这段代码把鸢尾花数据转成了 Pandas DataFrame。iris.data是形状为 (150, 4) 的二维数组iris.feature_names是四个特征名iris.target是 0、1、2 三个整型标签。df.info()可以快速查看每列是否有空值——鸢尾花数据集没有缺失值四列数据都是 float64 类型这个设计是为了让初学者少处理一个环节把精力集中在建模上。# 方式二从本地 CSV 文件读取 import pandas as pd df pd.read_csv(iris.csv) # 假设 CSV 列名为 sepal_length, sepal_width, petal_length, petal_width, species print(df.columns.tolist()) print(df.isnull().sum())从本地 CSV 读取时需要确认列名和分隔符常见问题是没有表头或列名不一致导致后续特征选择报错。我习惯在读取后用df.columns.tolist()打印所有列名确认没问题再往下走。如果你下载的是这份资源自带的 iris.csv可以直接用列名已经统一成英文字段。3.2 训练集与测试集的划分策略数据划分是机器学习流程中最容易被轻视的环节。150 条样本全量训练虽然也能得到模型但无法评估泛化能力。标准做法是用 train_test_split 按比例切分同时设置随机种子保证结果可复现。from sklearn.model_selection import train_test_split X df[[sepal_length, sepal_width, petal_length, petal_width]] y df[target] X_train, X_test, y_train, y_test train_test_split( X, y, test_size0.2, random_state42 ) print(f训练集样本数: {X_train.shape[0]}) print(f测试集样本数: {X_test.shape[0]})test_size0.2意味着 30 条样本留作测试120 条用于训练。random_state42是固定随机种子保证每次运行划分结果一致这是排查模型性能差异的关键——如果没有设置随机种子每次跑出来的训练集不同模型指标会波动你就很难判断是代码问题还是数据问题。有一个容易踩坑的细节鸢尾花数据集是按类别顺序排列的前 50 条是山鸢尾中间 50 条是变色鸢尾最后 50 条是维吉尼亚鸢尾。如果不打乱直接划分训练集可能完全缺失某一类。train_test_split 默认会打乱数据但如果你手动按行切片就会掉进这个陷阱。我在实际排查中遇到过一次某同学自己写了个按前 80% 切分的函数导致测试集里只有维吉尼亚鸢尾模型在测试集上表现时好时坏看了很久才发现是数据顺序问题。4. 两种线性回归实现scikit-learn 与 PyTorch 的对比实操4.1 scikit-learn 版本最小二乘法的一行流scikit-learn 的 LinearRegression 是工业界最常用的线性模型实现核心优势是接口统一、参数少、不需要手动调学习率。它内部使用最小二乘法求解在数据量不大时非常稳定。from sklearn.linear_model import LinearRegression from sklearn.metrics import mean_squared_error, r2_score import numpy as np # 以花萼长度为特征预测花瓣长度回归任务示例 X_reg df[[sepal_length]].values y_reg df[petal_length].values model LinearRegression() model.fit(X_reg, y_reg) y_pred model.predict(X_reg) mse mean_squared_error(y_reg, y_pred) r2 r2_score(y_reg, y_pred) print(f权重: {model.coef_[0]:.4f}) print(f偏置: {model.intercept_:.4f}) print(fMSE: {mse:.4f}) print(fR²: {r2:.4f})这里有几个关键点需要展开说明。X_reg被强制转换成了形状为 (150, 1) 的二维数组因为 scikit-learn 要求特征必须是二维结构即使只有一个特征也不能用一维数组。model.coef_是特征权重数组model.intercept_是偏置对单特征回归来说权重可以直接理解为斜率。MSE 是均方误差衡量预测值与真实值的平均平方差距数值越小越好R² 是决定系数表示模型解释了目标变量多少比例的方差1.0 表示完美拟合0 表示与直接用均值预测相当。在鸢尾花数据集上用花萼长度预测花瓣长度通常能得到 0.76 左右的 R²这个结果说明两者存在一定线性关系但不够强。如果你改成用花瓣宽度预测花瓣长度R² 会升到 0.92 以上因为这两个特征本身就是高度相关的。这个对比是初学阶段理解特征选择的好素材——同样的模型输入特征不同性能差别很大。4.2 PyTorch 版本手写梯度下降的全流程PyTorch 实现的线性回归更适合理解机器学习的底层机制因为你需要自己定义模型结构、损失函数和优化器每个环节都透明可见。import torch import torch.nn as nn import torch.optim as optim # 转换为 PyTorch 张量 X_tensor torch.tensor(X_reg, dtypetorch.float32) y_tensor torch.tensor(y_reg, dtypetorch.float32).view(-1, 1) # 定义线性回归模型 class LinearRegressionModel(nn.Module): def __init__(self, input_dim1): super().__init__() self.linear nn.Linear(input_dim, 1) def forward(self, x): return self.linear(x) model_pt LinearRegressionModel() criterion nn.MSELoss() optimizer optim.SGD(model_pt.parameters(), lr0.01) # 训练循环 epochs 1000 for epoch in range(epochs): model_pt.train() outputs model_pt(X_tensor) loss criterion(outputs, y_tensor) optimizer.zero_grad() loss.backward() optimizer.step() if (epoch 1) % 200 0: print(fEpoch [{epoch1}/{epochs}], Loss: {loss.item():.4f})这段代码里nn.Linear(1, 1)定义了一个输入维度为 1、输出维度为 1 的线性层内部参数就是权重和偏置。nn.MSELoss()计算均方误差optim.SGD是随机梯度下降优化器lr0.01是学习率——这是最需要调的超参数。如果学习率太大损失值会震荡甚至发散如果太小收敛速度会很慢。在鸢尾花这个单特征回归场景下0.01 是合理的起点如果你改成多特征版本可能需要调整到 0.001 或 0.1取决于特征的量纲差异。训练循环中的optimizer.zero_grad()是很多新手会漏掉的一步。PyTorch 的梯度是累积的如果不清零下一次反向传播会把上一次的梯度加上去导致参数更新方向混乱损失值会表现出周期性抖动。loss.backward()计算梯度optimizer.step()更新参数这个顺序不能颠倒。收敛后可以用以下代码对比两种实现的结果# 对比 scikit-learn 与 PyTorch 的权重和偏置 w_sk model.coef_[0] b_sk model.intercept_ w_pt model_pt.linear.weight.item() b_pt model_pt.linear.bias.item() print(fscikit-learn: w{w_sk:.4f}, b{b_sk:.4f}) print(fPyTorch: w{w_pt:.4f}, b{b_pt:.4f})两者的权重和偏置应该在误差范围内接近差异来源是 scikit-learn 用了精确的最小二乘解而 PyTorch 用梯度下降逼近最优解只迭代了 1000 轮。如果训练次数增加到 5000 轮它们的差距会更小。4.3 多特征线性回归的扩展单特征回归只是热身实际使用中更常见的场景是用全部四个特征预测某一个连续目标。scikit-learn 切换到多特征只需要改数据维度其他代码不变。# 用全部四个特征预测花瓣长度 X_all df[[sepal_length, sepal_width, petal_length, petal_width]].values y_all df[petal_length].values model_multi LinearRegression() model_multi.fit(X_all, y_all) print(f权重: {model_multi.coef_}) print(f偏置: {model_multi.intercept_:.4f})此时model.coef_变成了一个长度为 4 的数组每项对应一个特征的权重。正权重表示该特征与目标正相关负权重表示负相关。值得注意的是用全部特征预测花瓣长度时花瓣宽度的权重会非常显著而花萼长度和花萼宽度的贡献相对较小。这个信息可以用来做特征筛选——如果某个特征权重接近 0说明它对目标几乎没有解释力可以考虑剔除。在 PyTorch 中做多特征回归只需把nn.Linear(1, 1)改成nn.Linear(4, 1)输入张量形状从 (150, 1) 变为 (150, 4)其余流程不变。这也是为什么 PyTorch 的模型定义适合做原型验证——网络结构的修改成本很低。5. 避坑指南鸢尾花线性回归最常见的六个翻车现场5.1 特征维度假报错现象调用model.fit(X_reg, y_reg)时直接抛出ValueError: Expected 2D array, got 1D array instead。原因scikit-learn 要求特征矩阵至少是二维结构单特征数据如果是一维数组会被判定为非法输入。很多新手直接把df[sepal_length]传进去这个 Series 是一维的。解决使用.values.reshape(-1, 1)或df[[sepal_length]]提取特征列。前者把一维数组变成列向量后者直接产生二维 DataFrame。这个坑在数据规模变大后不会自动消失任何单特征回归都要显式控制维度。5.2 标签张量形状不匹配现象在 PyTorch 版本中loss.backward()报错提示Mismatch in shape或者输出维度不一致。原因y_tensor的形状是 (150,)而模型输出形状是 (150, 1)两者形状不一致导致损失函数无法正确计算。MSELoss 默认要求预测值和目标值的形状严格相同。解决对目标张量调用.view(-1, 1)把一维张量reshape为二维列向量。这是 PyTorch 回归任务的标配写法分类任务中目标通常是类别索引不需要这一步。5.3 学习率设置过大导致 Loss 输出 NaN现象训练循环打印的 Loss 值从几千变成nan或者在前几轮就出现负的 MSE。原因学习率设置过大梯度下降步长超过了最优解区域参数更新来回震荡数值逐渐溢出为 NaN。我在排查一个类似案例时发现某同学把学习率设成了 10第一次迭代权重就从 0.5 变成了 -1400损失直接爆掉。解决把学习率从 0.01 下调到 0.001如果仍然发散再降到 0.0001。也可以把权重初始化范围缩小比如从均匀分布 (-0.1, 0.1) 改为 (-0.01, 0.01)。在鸢尾花数据这种量级较小的特征下学习率太敏感通常是特征没有标准化导致的。5.4 数据顺序引发测试集分布失衡现象模型在测试集上的准确率忽高忽低有时高达 95%有时只有 40%。原因鸢尾花数据集默认按类别顺序排列如果不进行 shuffle 而直接按比例切分训练集和测试集的类别分布严重失衡。虽然 train_test_split 默认会打乱但如果你在手动切片时忽略了这一点就会复现这个问题。解决始终使用train_test_split(X, y, test_size0.2, random_state42)由函数内部完成洗牌。如果你需要自己实现划分先调用np.random.seed(42)然后np.random.shuffle打乱索引最后按打乱后的索引取数据。5.5 评估回归模型误用 Accuracy现象用accuracy_score评估线性回归的输出结果报错或得到一个极低的分数。原因线性回归输出是连续值而 accuracy_score 要求预测值与标签完全匹配。连续值几乎不可能精确等于某个整数标签所以准确率趋近于 0这个指标本身就不适用于回归任务。解决回归模型用 MSE、RMSE 或 R² 评估分类模型才用准确率。如果你是把线性回归当作分类器用比如用输出阈值判断需要先将预测结果二值化或做多分类映射再用分类指标衡量。5.6 特征未标准化导致梯度下降收敛慢现象PyTorch 版本训练 1000 轮后损失值仍然下降缓慢且权重和偏置与 scikit-learn 结果偏差明显。原因鸢尾花数据的四个特征量纲不同花萼长度在 4.3 到 7.9 之间花瓣宽度在 0.1 到 2.5 之间量纲差异导致损失函数的等高线呈椭圆形梯度下降在短轴上震荡长轴方向推进缓慢。解决对特征做标准化常见的做法是 StandardScaler让每个特征均值为 0、标准差为 1。加入标准化后梯度下降的收敛速度会有明显提升loss 曲线也更平滑。scikit-learn 的 LinearRegression 因为使用正规方程不受特征量纲影响这就是你只看到 PyTorch 版本收敛慢的原因。6. 用可视化验证模型性能残差图与预测对比的实用技巧6.1 从单个点图看拟合效果模型训练完成后不能只看 R² 数字就下结论可视化能暴露很多统计指标发现不了的问题。最基础的是预测值与真实值的散点对比图。import matplotlib.pyplot as plt plt.figure(figsize(8, 6)) plt.scatter(y_reg, y_pred, alpha0.6, edgecolorsw, s60) plt.plot([y_reg.min(), y_reg.max()], [y_reg.min(), y_reg.max()], r--, lw2) plt.xlabel(True Values) plt.ylabel(Predictions) plt.title(True vs Predicted (sepal_length - petal_length)) plt.show()如果模型拟合良好散点会紧密分布在红色虚对角线附近。偏离对角线的点越多说明模型的系统误差越大。我通常在看到 R² 较高但图像中的点出现明显弯曲结构时会怀疑数据本身存在非线性关系这时可以尝试加入多项式特征。# 加入二次多项式特征 from sklearn.preprocessing import PolynomialFeatures from sklearn.pipeline import make_pipeline poly_model make_pipeline( PolynomialFeatures(degree2, include_biasFalse), LinearRegression() ) poly_model.fit(X_reg, y_reg) poly_pred poly_model.predict(X_reg) poly_r2 r2_score(y_reg, poly_pred) print(f多项式回归 R²: {poly_r2:.4f})在单特征预测花瓣长度时多项式回归的 R² 通常会略高于普通线性回归但提升幅度可能只有 0.01 到 0.02这说明数据本身的线性关系已经足够强不需要过度复杂化模型。6.2 残差分布检查发现非随机误差残差是真实值与预测值的差值一个好的回归模型残差应该围绕 0 随机分布没有明显的模式。残差图是诊断模型的利器。residuals y_reg - y_pred plt.figure(figsize(8, 6)) plt.scatter(y_pred, residuals, alpha0.6, edgecolorsw, s60) plt.axhline(y0, colorr, linestyle--, lw2) plt.xlabel(Predicted Values) plt.ylabel(Residuals) plt.title(Residual Plot) plt.show()观察残差图时重点看两点残差是否在水平线 y0 附近均匀分布以及是否存在明显的漏斗形状。如果残差随预测值增大而发散说明模型存在异方差性这在简单的线性回归任务中不常见但如果出现通常意味着数据本身有异常点或特征与目标的关系不是线性的。我遇到过一个案例数据集里混入了几个极端值R² 看起来正常但残差图上却能明显看到远离中心的三五个点排查后发现是数据录入错误。6.3 Shadow 交叉验证用 K 折检验稳定性逐步添加一个比普通 train_test_split 更稳健的验证方法K 折交叉验证。鸢尾花数据有 150 条样本设置 K5 时每折 30 条样本可以更全面地评估模型在不同数据子集上的表现。from sklearn.model_selection import cross_val_score scores cross_val_score(LinearRegression(), X_all, y_all, cv5, scoringr2) print(f5折交叉验证 R²: {scores}) print(f均值: {scores.mean():.4f}, 标准差: {scores.std():.4f})K 折交叉验证能告诉你模型的稳定性如果五折分数之间的标准差过大说明模型对特定数据子集敏感可能是特征分布不均匀或样本量不足。在鸢尾花数据集上五折 R² 的标准差通常在 0.02 左右属于正常范围。如果这个值超过 0.1就要检查数据划分和数据质量了。做交叉验证时有个小习惯值得保持先可视化数据分布再做模型训练最后用交叉验证确认性能。这个顺序能帮你把问题定位在前端还是后端。从那以后我在任何数据集上都会强制走一遍「加载 → 可视化 → 建模 → 交叉验证」的流程能少踩很多诡异的坑。希望帮到你。本文还有配套的精品资源点击获取
阅读完成 · 觉得有帮助?
咨询建站