目标
本文旨在通过实现一个基础的逻辑回归分类模型,了解并应用逻辑回归模型,完成从数据加载、预处理到训练与评估的整个流程。通过使用Scikit-learn的逻辑回归模型,掌握如何进行模型训练与预测。学会评估模型性能,理解准确率、混淆矩阵及分类报告的含义。掌握混淆矩阵的可视化技术,通过图形化呈现分类结果,帮助分析模型性能。
环境
Python编程语言
Scikit-learn库
Matplotlib(用于数据可视化)
NumPy和Pandas库(用于数据处理)
Jupyter Notebook或类似IDE(用于代码编写和结果展示)
数据集
本实验使用的是鸢尾花数据集(Iris dataset),它是一个经典的多分类数据集,包含150个样本,4个特征(花萼长度、花萼宽度、花瓣长度、花瓣宽度),以及3个目标类别(Setosa、Versicolor、Virginica)。为了简化实验并将问题转化为二分类问题,我们将类别2(Virginica)标记为0,而类别0(Setosa)和类别1(Versicolor)标记为1。
步骤
1. 数据加载与初步探索
2. 数据集划分与标准化
3. 模型训练与预测
4. 模型性能评估
5. 可视化混淆矩阵
代码示例
引入实验用的包
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.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, confusion_matrix, classification_report
加载鸢尾花数据集。
iris = load_iris()
X = iris.data
y = iris.target
将目标类别从三分类问题转换为二分类问题。
# 原始类别
# 0: Setosa
# 1: Versicolor
# 2: Virginica
# 将三分类问题转化为二分类问题:
# 定义规则:类别 2(Virginica) 转化为 0,其余类别 0 和 1 转化为 1
y_binary = np.where(y == 2, 0, 1)
# 查看二分类后的类别分布
print("原始类别分布:", np.bincount(y))
print("二分类后的类别分布:", np.bincount(y_binary))
图1
划分训练集测试集
使用 train_test_split 方法将数据划分为训练集(80%)和测试集(20%)。
# 数据集划分
X_train, X_test, y_train, y_test = train_test_split(X, y_binary, test_size=0.2, random_state=42, stratify=y_binary)
数据标准化
使用 StandardScaler 对数值型特征使用进行标准化,以确保每个特征具有相同的尺度,避免不同尺度的特征对模型训练产生影响。
# 数据标准化
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)
初始化逻辑回归模型
初始化LogisticRegression,使用模型进行训练,基于训练集数据进行拟合。
model = LogisticRegression(random_state=42)
model.fit(X_train, y_train)
预测
使用训练好的模型对测试集进行预测,得到预测结果。
# 测试集预测
y_pred = model.predict(X_test)
y_pred
图2
计算模型准确率
使用 accuracy_score 方法评估模型在测试集上的准确率。
# 评估准确率
accuracy = accuracy_score(y_test, y_pred)
print(f"模型准确率: {accuracy:.2f}")
图3
计算混淆矩阵
通过 confusion_matrix 查看模型的混淆矩阵,以了解分类情况。
# 混淆矩阵
conf_matrix = confusion_matrix(y_test, y_pred)
print("混淆矩阵:\n", conf_matrix)
图4
输出分类报告
使用 classification_report 获得模型的精确率、召回率和 F1 分数等详细指标。
# 分类报告
class_report = classification_report(y_test, y_pred)
print("分类报告:\n", class_report)
图5
可视化混淆矩阵
使用Matplotlib可视化混淆矩阵,帮助直观分析模型的分类效果。
plt.figure(figsize=(8, 6)) # 调整图形尺寸
sns.set(font_scale=1.2) # 调整字体大小
sns.heatmap(
conf_matrix,
annot=True,
cmap="BuGn", # 使用蓝绿色配色方案
fmt="d",
cbar=True, # 显示颜色条
annot_kws={"size": 14, "weight": "bold"}, # 注释字体大小和加粗
xticklabels=["Class 0", "Class 1"],
yticklabels=["Class 0", "Class 1"],
linewidths=1.5, # 增加单元格边框
linecolor="gray" # 边框颜色为灰色
)
# 图表标题和轴标签
plt.title("Confusion Matrix", fontsize=18, weight="bold", pad=20, color="teal") # 标题加粗并增加间距,颜色为青绿色
plt.xlabel("Predicted Labels", fontsize=14, labelpad=10, color="darkblue") # 调整标签颜色
plt.ylabel("True Labels", fontsize=14, labelpad=10, color="darkblue")
# 旋转 x 轴标签
plt.xticks(rotation=45, ha="right", fontsize=12, color="darkgreen")
plt.yticks(fontsize=12, color="darkgreen")
# 显示图形
plt.tight_layout() # 调整布局避免溢出
plt.show()
图6
完整代码
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.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, confusion_matrix, classification_report
# 加载鸢尾花数据集
iris = load_iris()
X = iris.data
y = iris.target
# 原始类别
# 0: Setosa
# 1: Versicolor
# 2: Virginica
# 将三分类问题转化为二分类问题:
# 定义规则:类别 2(Virginica) 转化为 0,其余类别 0 和 1 转化为 1
y_binary = np.where(y == 2, 0, 1)
# 查看二分类后的类别分布
print("数据集形状:", X.shape)
print("原始类别分布:", np.bincount(y))
print("二分类后的类别分布:", np.bincount(y_binary))
# 数据集划分
X_train, X_test, y_train, y_test = train_test_split(X, y_binary, test_size=0.2, random_state=42, stratify=y_binary)
# 数据标准化
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)
# 初始化并训练逻辑回归模型
model = LogisticRegression(random_state=42)
model.fit(X_train, y_train)
# 测试集预测
y_pred = model.predict(X_test)
y_pred
# 评估准确率
accuracy = accuracy_score(y_test, y_pred)
print(f"模型准确率: {accuracy:.2f}")
# 混淆矩阵
conf_matrix = confusion_matrix(y_test, y_pred)
print("混淆矩阵:\n", conf_matrix)
# 分类报告
class_report = classification_report(y_test, y_pred)
print("分类报告:\n", class_report)
plt.figure(figsize=(8, 6)) # 调整图形尺寸
sns.set(font_scale=1.2) # 调整字体大小
sns.heatmap(
conf_matrix,
annot=True,
cmap="BuGn", # 使用蓝绿色配色方案
fmt="d",
cbar=True, # 显示颜色条
annot_kws={"size": 14, "weight": "bold"}, # 注释字体大小和加粗
xticklabels=["Class 0", "Class 1"],
yticklabels=["Class 0", "Class 1"],
linewidths=1.5, # 增加单元格边框
linecolor="gray" # 边框颜色为灰色
)
# 图表标题和轴标签
plt.title("Confusion Matrix", fontsize=18, weight="bold", pad=20, color="teal") # 标题加粗并增加间距,颜色为青绿色
plt.xlabel("Predicted Labels", fontsize=14, labelpad=10, color="darkblue") # 调整标签颜色
plt.ylabel("True Labels", fontsize=14, labelpad=10, color="darkblue")
# 旋转 x 轴标签
plt.xticks(rotation=45, ha="right", fontsize=12, color="darkgreen")
plt.yticks(fontsize=12, color="darkgreen")
# 显示图形
plt.tight_layout() # 调整布局避免溢出
plt.show()
标签:iris,逻辑,plt,分类,类别,train,test,import,鸢尾花
From: https://blog.csdn.net/fukase_mio/article/details/143919761