用逻辑回归(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”,适合入门。逻辑回归是简单但强大的分类算法,尤其适合特征与类别之间存在线性关系的场景。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值