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

用逻辑回归(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.dtcms.com/a/287426.html

相关文章:

  • 【专业扫盲】源极退化电阻
  • min_25筛学习笔记+牛客多校02E
  • NumPy 30分钟速成计划
  • 【运维心得】老旧系统迁移到虚拟机的另类解决
  • 力扣刷题(第九十二天)
  • nodejs值process.kill
  • 【RK3576】【Android14】固件烧录
  • 13.多种I/O函数
  • WPF为启动界面(Splash Screen)添加背景音乐
  • simulink系列之汽车应用层信号处理
  • android studio libs.versions.toml 配置
  • 计算机网络——IPv4(25王道最新版)
  • 从丢包到恢复:TCP重传机制的底层逻辑全解
  • Java-77 深入浅出 RPC Dubbo 负载均衡全解析:策略、配置与自定义实现实战
  • nginx.conf模版
  • 使用DataGrip连接安装在Linux上的Redis
  • Datawhale AI数据分析 作业
  • TinyMCE 富文本编辑器在 vue2 中的使用 @tinymce/tinymce-vue
  • Django母婴商城项目实践(八)- 数据渲染与显示之首页
  • windows wsl2-05-docker 安装笔记
  • Vue 3 中封装并使用 IndexedDB 的完整教程(含泛型、模块化、通用 CRUD)
  • 【C# in .NET】20. 探秘静态类:抽象与密封的结合体
  • Spring AI 1.0版本 + 千问大模型之 文本记忆对话
  • LeetCode中等题--167.两数之和II-输入有序数组
  • MySQL基础教程
  • XSS漏洞----基于Dom的xss
  • 力扣24:两两交换链表中的节点
  • SQLALchemy
  • 单元测试学习+AI辅助单测
  • 计算机网络:(十一)多协议标记交换 MPLS