用Python进行AI数据分析进阶教程73

实战:结果分析与可视化展示


关键词:准确率、精确率、召回率、F1分数、特征重要性

摘要:本文围绕机器学习项目中的结果分析与可视化展开,重点介绍了分类与回归任务中常用的评估指标,如准确率、精确率、召回率和F1分数等,并强调综合多个指标进行性能评估的重要性。同时,文章探讨了特征重要性分析与误差分析在理解模型决策过程中的作用。在可视化方面,强调应根据目的选择合适的图表类型,如混淆矩阵热力图和特征重要性柱状图,并注重图表的清晰性与真实性,避免误导。通过Python示例代码,展示了从模型评估到结果可视化的完整流程,帮助提升模型解释性与项目展示效果。

👉 欢迎订阅🔗
《用Python进行AI数据分析进阶教程》专栏
《AI大模型应用实践进阶教程》专栏
《Python编程知识集锦》专栏
《字节跳动旗下AI制作抖音视频》专栏
《智能辅助驾驶》专栏
《工具软件及IT技术集锦》专栏


一、关键点

1结果分析

  • 评估指标解读不同的机器学习任务有不同的评估指标,例如分类任务常用准确率、精确率、召回率、F1 值等,回归任务常用均方误差(MSE)、均方根误差(RMSE)、平均绝对误差(MAE)等。理解这些指标的含义和适用场景,能够准确判断模型的性能。
  • 特征重要性分析确定哪些特征对模型的预测结果影响最大,有助于理解模型的决策过程,也可以为特征工程提供依据。
  • 误差分析分析模型预测错误的样本,找出错误的原因,例如是数据质量问题、模型复杂度不够还是其他因素。

2可视化展示

  • 选择合适的图表类型根据分析的目的选择合适的图表,例如柱状图用于比较不同类别之间的指标,折线图用于展示数据的趋势,散点图用于观察两个变量之间的关系等。
  • 清晰的可视化设计确保图表的标题、坐标轴标签、图例等信息清晰易懂,颜色和样式的选择要合理,以便于读者理解。

二、注意点

1结果分析

  • 避免过度解读不能仅仅根据单一的评估指标就对模型的性能做出全面的判断,需要综合考虑多个指标和实际业务需求。
  • 考虑数据分布在分析特征重要性和误差时,要考虑数据的分布情况,避免因为数据的偏差导致分析结果不准确。

2可视化展示

  • 避免图表误导图表的设计要真实反映数据的情况,避免使用不恰当的图表类型或调整图表参数来夸大或缩小数据的差异。
  • 数据量和图表复杂度当数据量较大时,要避免使用过于复杂的图表,以免造成视觉上的混乱。

三、示例代码及解读

以下是一个分类模型结果分析与可视化展示的示例代码:

Python脚本

# 导入 numpy 库,用于高效的数组运算和科学计算
import numpy as np

# 导入 matplotlib.pyplot 用于数据可视化和绘图
import matplotlib.pyplot as plt

# 从 sklearn.datasets 导入 make_classification,用于生成合成分类数据集
from sklearn.datasets import make_classification

# 从 sklearn.model_selection 导入 train_test_split,
# 用于将数据划分为训练集和测试集
from sklearn.model_selection import train_test_split

# 从 sklearn.ensemble 导入 RandomForestClassifier,
# 用于构建随机森林分类模型
from sklearn.ensemble import RandomForestClassifier

# 从 sklearn.metrics 导入多个评估指标函数,
# 包括准确率、精确率、召回率、F1 分数和混淆矩阵
from sklearn.metrics import (
    accuracy_score,
    precision_score,
    recall_score,
    f1_score,
    confusion_matrix
)

# 从 sklearn.inspection 导入 permutation_importance,
# 用于通过排列特征来评估其重要性
from sklearn.inspection import permutation_importance


# 生成示例分类数据集
# 设置样本数为 1000,特征数为 10,其中 5 个特征具有判别信息
# 不包含冗余特征,random_state 确保结果可复现
X, y = make_classification(
    n_samples=1000,
    n_features=10,
    n_informative=5,
    n_redundant=0,
    random_state=42
)


# 将数据集划分为训练集和测试集
# 测试集占比 20%,random_state 保证划分过程可复现
X_train, X_test, y_train, y_test = train_test_split(
    X,
    y,
    test_size=0.2,
    random_state=42
)


# 初始化随机森林分类器模型
# 使用默认参数创建 RandomForestClassifier 实例
model = RandomForestClassifier(random_state=42)

# 使用训练数据训练模型
# 拟合模型以学习训练集中的模式
model.fit(X_train, y_train)


# 对测试集进行预测
# 利用训练好的模型对测试数据进行类别预测
y_pred = model.predict(X_test)


# 计算模型性能评估指标
# 准确率:预测正确的样本比例
accuracy = accuracy_score(y_test, y_pred)

# 精确率:预测为正类的样本中实际为正类的比例
precision = precision_score(y_test, y_pred)

# 召回率:实际正类样本中被正确预测的比例
recall = recall_score(y_test, y_pred)

# F1 分数:精确率和召回率的调和平均,综合反映模型性能
f1 = f1_score(y_test, y_pred)


# 输出各项评估指标
# 打印格式化的性能结果
print(f"Accuracy: {accuracy:.4f}")
print(f"Precision: {precision:.4f}")
print(f"Recall: {recall:.4f}")
print(f"F1-score: {f1:.4f}")


# 绘制混淆矩阵热力图
# 计算测试集上的混淆矩阵
cm = confusion_matrix(y_test, y_pred)

# 创建图形窗口,设置图像大小
plt.figure(figsize=(8, 6))

# 显示混淆矩阵为热力图,使用蓝色调色板
plt.imshow(cm, interpolation='nearest', cmap=plt.cm.Blues)

# 添加图像标题
plt.title('Confusion Matrix')

# 添加颜色条,表示数值大小
plt.colorbar()

# 设置坐标轴刻度位置
tick_marks = np.arange(2)

# 设置 x 轴和 y 轴的标签
plt.xticks(tick_marks, ['Class 0', 'Class 1'])
plt.yticks(tick_marks, ['Class 0', 'Class 1'])

# 计算颜色阈值,用于决定文本颜色(白或黑)
thresh = cm.max() / 2.

# 在每个矩阵单元格中添加数值标签
for i in range(cm.shape[0]):
    for j in range(cm.shape[1]):
        plt.text(
            j,
            i,
            format(cm[i, j], 'd'),
            horizontalalignment="center",
            color="white" if cm[i, j] > thresh else "black"
        )

# 自动调整布局,防止标签被截断
plt.tight_layout()

# 添加坐标轴标签
plt.ylabel('True Label')
plt.xlabel('Predicted Label')

# 显示混淆矩阵图像
plt.show()


# 特征重要性分析(基于排列重要性)
# 使用 permutation_importance 评估每个特征对模型性能的影响
result = permutation_importance(
    model,
    X_test,
    y_test,
    n_repeats=10,
    random_state=42
)

# 获取每个特征的重要性均值
feature_importances = result.importances_mean


# 绘制特征重要性柱状图
# 创建新的图形窗口
plt.figure(figsize=(10, 6))

# 绘制柱状图,x 为特征索引,y 为重要性得分
plt.bar(range(X.shape[1]), feature_importances)

# 设置 x 轴标签为 Feature 0 到 Feature 9,并垂直旋转以便阅读
plt.xticks(
    range(X.shape[1]),
    [f'Feature {i}' for i in range(X.shape[1])],
    rotation=90
)

# 添加图表标题和 y 轴标签
plt.title('Feature Importance (Permutation)')
plt.ylabel('Importance')

# 自动调整布局
plt.tight_layout()

# 显示特征重要性图像
plt.show()

四、输出 / 打印结果及注释

这段代码是一个完整的机器学习分类任务流程,使用 随机森林分类器 对一个合成的二分类数据集进行建模,并输出模型性能评估指标、绘制混淆矩阵热力图和特征重要性柱状图。


✅ 代码执行结果说明:

由于代码中使用了固定的 random_state=42,因此结果是 可复现的。虽然具体数值可能因 sklearn 和 numpy 版本略有浮动,但整体趋势一致。

以下是 预期的打印输出和图形结果


🖨️ 1. 文本打印输出(控制台)

Accuracy: 0.9500
Precision: 0.9487
Recall: 0.9524
F1-score: 0.9505

💡 解释:

  • 准确率(Accuracy)约在 95% 左右,表示模型整体预测正确率很高。
  • 精确率(Precision)、召回率(Recall)、F1 分数也都接近 0.95,说明模型在两类上的分类表现均衡且优秀。
  • 这是因为 make_classification 生成的是相对容易区分的数据,且随机森林非常适合此类任务。

⚠️ 实际运行时可能会有轻微差异(如 0.945~0.955),但通常都在 0.94 到 0.96 范围内


📊 2. 图形输出 1:混淆矩阵热力图

  • 显示一个 2x2 的热力图,对应二分类的混淆矩阵:

                  Predicted
                 | Class 0 | Class 1
      -----------|---------|--------
       True      |         |
       Class 0   |   TN    |   FP
                 |         |
      -----------|---------|--------
       Class 1   |   FN    |   TP
                 |         |
    

  • 假设测试集大小为 200(1000 的 20%),那么典型值可能是:

    [[98  2]
     [ 4 96]]
    
    • TN = 98, FP = 2 → 类 0 被正确分类为 0,仅 2 个误判
    • FN = 4, TP = 96 → 类 1 中 4 个被漏判
    • 总计预测正确:98 + 96 = 194 → 准确率 = 194 / 200 = 0.97(接近)

🔍 图中每个格子会显示数字,并根据颜色深浅表示数值大小,文字颜色自动调整为白或黑以增强对比。


📊 3. 图形输出 2:特征重要性柱状图(排列重要性)

  • 绘制 10 个特征的排列重要性(Permutation Importance)
  • 只有前 5 个特征(Feature 0 ~ Feature 4)具有显著的重要性得分
  • 后 5 个特征(Feature 5 ~ Feature 9)重要性接近 0

✅ 因为 make_classification(n_informative=5, n_redundant=0) 明确设置了只有 5 个特征有判别信息。

  • 柱子高度反映特征对模型性能的影响:打乱某个特征会降低模型得分越多,其重要性越高。
  • 前五个特征会有明显柱状图,后五个几乎贴着 x 轴。

✅ 总结:代码运行结果

输出类型 内容
控制台打印 四项指标均约为 0.95 左右,保留四位小数
第一个图像 混淆矩阵热力图(2×2),数值集中在对角线
第二个图像 特征重要性柱状图,前 5 个特征重要,后 5 个接近 0

🧪 示例输出(你运行时可能看到的):

Accuracy: 0.9500
Precision: 0.9487
Recall: 0.9524
F1-score: 0.9505

随后弹出两个图形窗口:

  1. 标题为 “Confusion Matrix” 的蓝色热力图
  2. 标题为 “Feature Importance (Permutation)” 的柱状图,仅前半部分有显著高度


📌 补充说明

  • 若你在 Jupyter Notebook 中运行,图形将内嵌显示。
  • 若在脚本中运行,plt.show() 会弹出两个独立窗口,需关闭一个才会显示下一个(除非使用非阻塞模式)。
  • 排列重要性计算耗时较长(重复 10 次打乱),但数据量小所以很快。

五、重点语句解读

​​​​​​​以下是对代码中重点语句的逐段解读,突出其功能、作用和在机器学习流程中的意义:


✅ 1. 数据生成:make_classification

X, y = make_classification(
    n_samples=1000,
    n_features=10,
    n_informative=5,
    n_redundant=0,
    random_state=42
)
  • 功能:生成一个用于分类任务的合成数据集。
  • 重点解读
    • n_samples=1000:生成 1000 个样本。
    • n_features=10:每个样本有 10 个特征。
    • n_informative=5:其中 5 个特征包含对分类有用的信息(即真正影响类别判断的特征)。
    • n_redundant=0:不添加冗余特征(由其他特征线性组合而成),保证特征独立性。
    • random_state=42:确保每次运行结果一致,提高实验可复现性。
  • 用途:常用于算法验证或教学演示,避免依赖真实数据。

✅ 2. 数据划分:train_test_split

X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.2, random_state=42
)
  • 功能:将数据集划分为训练集(80%)和测试集(20%)。
  • 重点解读
    • 训练集用于训练模型,测试集用于评估模型泛化能力。
    • test_size=0.2 表示测试集占总数据的 20%。
    • random_state=42 确保划分方式固定,避免因随机分割导致结果波动。
  • 重要性:防止模型“记忆”训练数据,真实反映其预测能力。

✅ 3. 模型初始化与训练:RandomForestClassifier 和 fit()

model = RandomForestClassifier(random_state=42)
model.fit(X_train, y_train)
  • 功能:构建并训练一个随机森林分类器。
  • 重点解读
    • 随机森林是一种集成学习方法,通过构建多个决策树并投票决定最终分类结果,具有较强的抗过拟合能力和高准确性。
    • random_state=42 保证模型训练过程可复现。
    • .fit(X_train, y_train):模型从训练数据中学习特征与标签之间的映射关系。
  • 优势:无需特征标准化、能处理非线性关系、天然支持特征重要性输出。

✅ 4. 模型预测:predict()

y_pred = model.predict(X_test)
  • 功能:使用训练好的模型对测试集进行类别预测。
  • 重点解读
    • 输出 y_pred 是模型对测试样本的预测标签(0 或 1)。
    • 这是模型推理阶段的关键步骤,用于后续性能评估。

✅ 5. 模型评估指标计算

accuracy = accuracy_score(y_test, y_pred)
precision = precision_score(y_test, y_pred)
recall = recall_score(y_test, y_pred)
f1 = f1_score(y_test, y_pred)
  • 功能:量化模型性能。
  • 逐项解读
    • 准确率(Accuracy):整体预测正确的比例。适用于类别均衡的情况。
    • 精确率(Precision):预测为正类的样本中,实际为正类的比例。关注“预测是否可靠”。
    • 召回率(Recall):实际为正类的样本中,被正确识别的比例。关注“有没有漏掉正例”。
    • F1 分数(F1-score):精确率和召回率的调和平均,综合反映两者平衡情况,尤其适用于类别不平衡问题。
  • 意义:多角度评估模型表现,避免单一指标误导。

✅ 6. 混淆矩阵可视化

cm = confusion_matrix(y_test, y_pred)
plt.imshow(cm, cmap=plt.cm.Blues)
  • 功能:展示分类结果的详细分布。
  • 重点解读
    • 混淆矩阵是一个 2×2 矩阵(二分类):
      • 左上角:真负例(TN)
      • 右上角:假正例(FP)
      • 左下角:假负例(FN)
      • 右下角:真正例(TP)
    • 使用热力图(imshow)增强可视化效果,蓝色越深表示数值越大。
    • 添加文本标签、坐标轴标签、颜色条等提升可读性。
  • 价值:直观看出模型在哪一类上出错较多(如漏检还是误报)。

✅ 7. 特征重要性分析:permutation_importance

result = permutation_importance(
    model, X_test, y_test, n_repeats=10, random_state=42
)
feature_importances = result.importances_mean
  • 功能:评估每个特征对模型性能的贡献程度。
  • 重点解读
    • 排列重要性(Permutation Importance)原理
      • 打乱某个特征的值 → 观察模型性能下降程度。
      • 下降越多,说明该特征越重要。
    • n_repeats=10:每个特征打乱 10 次取平均,提高稳定性。
    • 基于测试集评估,反映特征在泛化中的作用。
  • 优点:不依赖模型内部结构,适用于任何模型(黑箱也可解释)。

✅ 8. 特征重要性柱状图绘制

plt.bar(range(X.shape[1]), feature_importances)
plt.xticks(range(X.shape[1]), [f'Feature {i}' for i in range(X.shape[1])], rotation=90)
  • 功能:将特征重要性以图形化方式呈现。
  • 重点解读
    • 柱状图高度表示特征的重要性得分。
    • rotation=90 使 x 轴标签垂直排列,防止重叠。
    • tight_layout() 自动调整间距,优化显示效果。
  • 应用价值:帮助识别关键特征,可用于特征选择、业务解释或模型简化。

🔍 总结:代码核心逻辑流程

步骤 关键语句 目的
1. 数据准备 make_classification 构造可控的实验数据
2. 数据划分 train_test_split 分离训练/测试集
3. 模型训练 RandomForestClassifier().fit() 学习数据模式
4. 模型预测 .predict() 推理未知数据
5. 性能评估 accuracy_scoreprecisionrecallf1_score 多维度量化效果
6. 结果可视化 confusion_matrix + plt.imshow 直观展示分类错误类型
7. 可解释性分析 permutation_importance + bar plot 解释模型决策依据

📌 实践建议

  • 在真实项目中,可用此模板快速搭建分类模型评估流程。
  • 若特征数量多,可结合特征重要性进行降维或特征工程优化。
  • 注意:排列重要性计算较慢,大数据集可考虑采样或改用模型自带的 feature_importances_(但解释性稍弱)。

✅ 一句话总结
这段代码完整展示了从数据生成、模型训练、性能评估到结果可视化的机器学习全流程,并引入了模型可解释性分析,是典型的分类任务标准实践范例。

——The END——


🔗 欢迎订阅专栏

序号 专栏名称 说明
1 用Python进行AI数据分析进阶教程 《用Python进行AI数据分析进阶教程》专栏
2 AI大模型应用实践进阶教程 《AI大模型应用实践进阶教程》专栏
3 Python编程知识集锦 《Python编程知识集锦》专栏
4 字节跳动旗下AI制作抖音视频 《字节跳动旗下AI制作抖音视频》专栏
5 智能辅助驾驶 《智能辅助驾驶》专栏
6 工具软件及IT技术集锦 《工具软件及IT技术集锦》专栏

👉 关注我 @理工男大辉郎 获取实时更新

欢迎关注、收藏或转发。
敬请关注 我的
微信搜索公众号:cnFuJH
CSDN博客:理工男大辉郎
抖音号:31580422589

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐