当前位置: 首页 > java >正文

用逻辑回归(Logistic Regression)处理鸢尾花(iris)数据集

# 导入必要的库
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import (accuracy_score, confusion_matrix,classification_report, ConfusionMatrixDisplay)
from sklearn.preprocessing import StandardScaler# 1. 加载鸢尾花数据集
iris = load_iris()
# 转换为DataFrame方便查看(特征+标签)
iris_df = pd.DataFrame(data=iris.data, columns=iris.feature_names)
iris_df['species'] = [iris.target_names[i] for i in iris.target]  # 添加花名标签# 2. 数据基本信息查看
print("数据集形状:", iris.data.shape)  # 150个样本,4个特征
print("\n特征名称:", iris.feature_names)  # 花萼长度、宽度,花瓣长度、宽度
print("\n类别名称:", iris.target_names)  # 山鸢尾、变色鸢尾、维吉尼亚鸢尾# 3. 数据划分(特征X和标签y)
X = iris.data  # 特征:4个植物学测量值
y = iris.target  # 标签:0,1,2分别对应三种鸢尾花# 划分训练集(80%)和测试集(20%),随机种子确保结果可复现
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42, stratify=y  # stratify=y保持类别比例
)# 4. 特征标准化(逻辑回归对特征尺度敏感,标准化可提升性能)
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)  # 训练集拟合并标准化
X_test_scaled = scaler.transform(X_test)  # 测试集使用相同的标准化参数# 5. 训练逻辑回归模型(多分类任务)
model = LogisticRegression(max_iter=200, random_state=42)  # 增加迭代次数确保收敛
model.fit(X_train_scaled, y_train)# 6. 模型预测
y_pred = model.predict(X_test_scaled)  # 测试集预测标签
y_pred_proba = model.predict_proba(X_test_scaled)  # 预测每个类别的概率# 7. 模型评估
print("\n===== 模型评估结果 =====")
print(f"训练集准确率:{model.score(X_train_scaled, y_train):.4f}")
print(f"测试集准确率:{accuracy_score(y_test, y_pred):.4f}")print("\n混淆矩阵:")
cm = confusion_matrix(y_test, y_pred)
disp = ConfusionMatrixDisplay(confusion_matrix=cm, display_labels=iris.target_names)
disp.plot(cmap=plt.cm.Blues)
plt.title("混淆矩阵(测试集)")
plt.show()print("\n分类报告:")
print(classification_report(y_test, y_pred, target_names=iris.target_names))# 8. 特征重要性分析(逻辑回归系数)
feature_importance = pd.DataFrame({'特征': iris.feature_names,'系数绝对值': np.abs(model.coef_).mean(axis=0)  # 多分类取各系数的绝对值均值
}).sort_values(by='系数绝对值', ascending=False)print("\n特征重要性(系数绝对值):")
print(feature_importance)# 可视化特征重要性
plt.figure(figsize=(8, 4))
sns.barplot(x='系数绝对值', y='特征', data=feature_importance, palette='coolwarm')
plt.title("特征对分类的重要性")
plt.show()# 9. 新样本预测示例
# 假设一个新的鸢尾花测量数据(花萼长、花萼宽、花瓣长、花瓣宽)
new_sample = np.array([[5.8, 3.0, 4.9, 1.6]])  # 接近变色鸢尾的特征
new_sample_scaled = scaler.transform(new_sample)  # 标准化# 预测结果
predicted_class = model.predict(new_sample_scaled)
predicted_prob = model.predict_proba(new_sample_scaled)print("\n===== 新样本预测 =====")
print(f"预测类别:{iris.target_names[predicted_class[0]]}")
print("各类别概率:")
for i, prob in enumerate(predicted_prob[0]):print(f"{iris.target_names[i]}: {prob:.4f}")

这段代码使用逻辑回归算法对经典的鸢尾花数据集进行分类,是一个完整的机器学习项目流程。

1. 导入必要的库

import numpy as np

import pandas as pd

import matplotlib.pyplot as plt

import seaborn as sns

from sklearn.datasets import load_iris

from sklearn.model_selection import train_test_split

from sklearn.linear_model import LogisticRegression

from sklearn.metrics import (accuracy_score, confusion_matrix,

                             classification_report, ConfusionMatrixDisplay)

from sklearn.preprocessing import StandardScaler

  1. numpy/pandas:用于数据处理(如矩阵运算、表格操作)。
  2. matplotlib/seaborn:用于绘制图表(如混淆矩阵、特征重要性)。
  3. sklearn:机器学习库,提供数据集、模型、评估工具。

2. 加载和查看数据

iris = load_iris()  # 加载内置鸢尾花数据集

iris_df = pd.DataFrame(iris.data, columns=iris.feature_names)

iris_df['species'] = [iris.target_names[i] for i in iris.target]

print("数据集形状:", iris.data.shape)  # (150, 4) → 150个样本,4个特征

print("特征名称:", iris.feature_names)  # 花瓣/花萼的长度、宽度

print("类别名称:", iris.target_names)  # ['setosa' 'versicolor' 'virginica']

  1. 鸢尾花数据集:包含 150 朵花的数据,分为 3 个品种(每个品种 50 朵)。
  2. 4 个特征:花瓣长度、花瓣宽度、花萼长度、花萼宽度(都是厘米)。
  3. 目标:根据这 4 个特征预测花的品种。

3. 数据划分(训练集和测试集)

X = iris.data  # 特征(花瓣/花萼的测量值)

y = iris.target  # 标签(0/1/2对应3个品种)

X_train, X_test, y_train, y_test = train_test_split(

    X, y, test_size=0.2, random_state=42, stratify=y

)

  1. train_test_split:将数据分为 80% 训练集和 20% 测试集。
    1. stratify=y:确保训练集和测试集中 3 个品种的比例相同(避免数据偏斜)。
    2. random_state=42:固定随机种子,确保结果可复现(每次运行划分结果相同)。

4. 特征标准化

scaler = StandardScaler()

X_train_scaled = scaler.fit_transform(X_train)  # 训练集标准化

X_test_scaled = scaler.transform(X_test)  # 测试集用相同参数标准化

  1. 为什么标准化?:逻辑回归对特征尺度敏感(例如,如果某个特征的数值范围很大,会影响模型收敛)。
  2. StandardScaler:将特征转换为均值为 0、标准差为 1 的标准正态分布。
    1. fit_transform:计算训练集的均值 / 标准差,并应用转换。
    2. transform:用训练集的统计参数(均值 / 标准差)转换测试集(不能重新计算)。

5. 训练逻辑回归模型

model = LogisticRegression(max_iter=200, random_state=42)

model.fit(X_train_scaled, y_train)

  1. LogisticRegression:逻辑回归是分类算法(尽管名字带 “回归”)。
    1. max_iter=200:增加最大迭代次数,确保模型收敛(默认 100 可能不够)。
  2. fit:用训练数据学习模型参数(找到最佳分类边界)。

6. 模型预测

y_pred = model.predict(X_test_scaled)  # 预测类别(0/1/2

y_pred_proba = model.predict_proba(X_test_scaled)  # 预测每个类别的概率

  1. predict:直接输出预测的类别(例如 1 代表 versicolor)。
  2. predict_proba:输出样本属于每个类别的概率(例如 [0.01, 0.95, 0.04] 表示 95% 概率是第二类)。

7. 模型评估

print(f"训练集准确率:{model.score(X_train_scaled, y_train):.4f}")

print(f"测试集准确率:{accuracy_score(y_test, y_pred):.4f}")

  1. 准确率(Accuracy:预测正确的样本比例。
    1. 训练集准确率:约 0.99(模型对训练数据的拟合程度)。
    2. 测试集准确率:约 0.97(模型对新数据的泛化能力)。
混淆矩阵(Confusion Matrix)

cm = confusion_matrix(y_test, y_pred)

disp = ConfusionMatrixDisplay(confusion_matrix=cm, display_labels=iris.target_names)

disp.plot()

  1. 混淆矩阵:可视化分类结果,对角线表示预测正确的样本数。
    1. 例如:预测 setosa(0)的样本全部分类正确;有 1 个 versicolor(1)被误分类为 virginica(2)。
分类报告(Classification Report)

print(classification_report(y_test, y_pred, target_names=iris.target_names))

  1. 精确率(Precision:预测为某类的样本中,实际属于该类的比例。
  2. 召回率(Recall:实际属于某类的样本中,被正确预测的比例。
  3. F1 分数(F1-score:精确率和召回率的调和平均。

8. 特征重要性分析

feature_importance = pd.DataFrame({

    '特征': iris.feature_names,

    '系数绝对值': np.abs(model.coef_).mean(axis=0)

}).sort_values('系数绝对值', ascending=False)

  1. 逻辑回归系数:系数绝对值越大,说明该特征对分类的影响越大。
    1. 通常petal width(花瓣宽度)和petal length(花瓣长度)对分类最重要。

9. 新样本预测示例

new_sample = np.array([[5.8, 3.0, 4.9, 1.6]])  # 手动构造一个样本

new_sample_scaled = scaler.transform(new_sample)  # 标准化

predicted_class = model.predict(new_sample_scaled)  # 预测类别

predicted_prob = model.predict_proba(new_sample_scaled)  # 预测概率

  1. 预测结果:输出新样本的预测类别和概率(例如 95% 概率是 versicolor)。

总结

这个代码展示了一个完整的机器学习流程:

  1. 数据准备:加载数据、划分训练集 / 测试集。
  2. 特征工程:标准化特征,避免量纲影响。
  3. 模型训练:用逻辑回归学习分类规则。
  4. 模型评估:用准确率、混淆矩阵等指标衡量性能。
  5. 预测应用:对新样本进行分类。

鸢尾花数据集是机器学习的 “Hello World”,适合入门。逻辑回归是简单但强大的分类算法,尤其适合特征与类别之间存在线性关系的场景。

http://www.xdnf.cn/news/15716.html

相关文章:

  • 移除debian升级后没用的垃圾
  • 电商商品综合排序:从需求分析到实时计算的全方位指南
  • 鸿蒙与web混合开发双向通信
  • The Missing Semester of Your CS Education 学习笔记以及一些拓展知识(三)
  • HTTP性能优化实战
  • Matplotlib和Plotly知识点(Dash+Plotly分页展示)
  • Android 开发实战:从零到一集成 espeak-ng 实现中文离线 TTS(无需账号开箱即用)
  • Qt笔记整理(1)
  • CCF编程能力等级认证GESP—C++5级—20250628
  • 使用nvm安装node、npm、pnpm以及编译项目教程
  • SpringBoot 3.0 挥别 spring.factories,拥抱云原生新纪元
  • 基于大模型打造故障预警服务器巡检机器人
  • Jetpack Compose中的Modifier:UI元素的装饰与行为扩展
  • 3-大语言模型—理论基础:生成式预训练语言模型GPT(代码“活起来”)
  • [论文阅读] 软件工程 | 用模糊逻辑“解锁”项目成功:告别非黑即白的评估时代
  • 网络基础DAY13-NAT技术
  • 【NLP舆情分析】基于python微博舆情分析可视化系统(flask+pandas+echarts) 视频教程 - 基于wordcloud库实现词云图
  • OSPF高级特性之Overflow
  • 浅谈Rust语言特性
  • 1 渗透基础
  • 【NLP舆情分析】基于python微博舆情分析可视化系统(flask+pandas+echarts) 视频教程 - snowNLP库实现中文情感分析
  • 【unitrix】 6.7 基本结构体(types.rs)
  • Python 使用期物处理并发(使用concurrent.futures模块下载)
  • Leetcode刷题营第三十三题:对称二叉树
  • 五大开源OCR开源框架评估01-Tesseract:OCR 领域的远古巨神
  • Docker安装教程
  • GaussDB join 连接的用法
  • 7.18 Java基础 |
  • 正则表达式,Collection集合,迭代器
  • 差分数组算法