Python 数据分析实战:分类分析与决策树实现
本文介绍机器学习中的分类分析概念,涵盖监督学习与无监督学习的区别,详细解析朴素贝叶斯、逻辑回归、决策树、随机森林及支持向量机等常用算法。重点阐述分类在预测、规则提炼、特征提取及缺失值处理中的应用场景,并提供基于 Python Scikit-learn 的决策树实现代码,包括数据预处理、模型训练、可视化及混淆矩阵、准确率、精确度、召回率、F1 得分、AUC 等评估指标的深入解读,帮助读者掌握分类建模全流程。

本文介绍机器学习中的分类分析概念,涵盖监督学习与无监督学习的区别,详细解析朴素贝叶斯、逻辑回归、决策树、随机森林及支持向量机等常用算法。重点阐述分类在预测、规则提炼、特征提取及缺失值处理中的应用场景,并提供基于 Python Scikit-learn 的决策树实现代码,包括数据预处理、模型训练、可视化及混淆矩阵、准确率、精确度、召回率、F1 得分、AUC 等评估指标的深入解读,帮助读者掌握分类建模全流程。

在机器学习和统计学中,分类(Classification)是基于包含其类别成员资格已知的观察(或实例)的训练数据集来识别新观察所属的一组类别(子群体)中的哪一个的问题。例如,将给定的电子邮件分配给'垃圾邮件'或'非垃圾邮件'类,并根据观察到的患者特征(性别、血压、某些症状的存在或不存在等)为给定患者分配诊断。分类是模式识别的一个典型例子。
在机器学习的术语中,分类被认为是监督学习(Supervised Learning)的一个实例,即学习可以获得正确识别的观察的训练集的情况。相应的无监督程序称为聚类(Clustering),并涉及基于固有相似性或距离的某种度量将数据分组,而无需预先定义的标签。
通常,将各个观察结果分析为一组可量化的属性,不同地称为解释变量或特征(Features)。这些属性可以不同地分类(例如,'A','B','AB'或'O',对于血型),序数(例如'大','中'或'小'),整数值(例如,电子邮件中特定单词的出现次数)或实际值(例如血压的测量值)。
实现分类的算法,特别是在具体实现中,被称为分类器(Classifier)。术语'分类器'有时也指由分类算法实现的数学函数,其将输入数据映射到类别。
跨领域的术语是多种多样的。在统计中,通常使用逻辑回归或类似程序进行分类,观察的属性称为解释变量(或独立变量,回归量等),要预测的类别称为结果,被认为是因变量的可能值。在机器学习中,观察通常被称为实例,解释变量被称为特征(被分组为特征向量),并且要预测的可能类别是类。其他领域可能使用不同的术语:例如,在社区生态学中,术语'分类'通常是指聚类分析,即一种无监督学习,而不是本文中描述的监督学习。
常用的分类算法各有优劣,适用于不同的场景:
分类的主要用途和场景是'预测',基于已有的样本预测新样本的所属类别。例如信用评级、风险等级、欺诈预测等;同时,它也是模式识别的重要组成部分,广泛应用到机器翻译、人脸识别、医学诊断、手写字符识别、指纹识别的图像识别、语音识别、视频识别的领域;另外,分类算法也可以用于知识抽取,通过模型找到潜在的规律,帮助业务得到可执行的规则。
为数据化运用提供规则,也是分类分析的主要应用方向。例如:
提炼特征规则利用的是在构建分类算法时产生的分类规则。
从大量的输入变量的重要性特征,然后提取权重较高的几个特征是分类分析的重点应用之一。是数据归约和数据降维的重要方式。获取原始数据集并对数据预处理,然后将数据集放到分类算法中进行训练,然后从算法模型中提取特征权重信息。
将缺失字段作为目标变量进行预测,从而得到较为可能的补全值。这是一种常见的数据清洗策略。
选择合适的算法对于模型效果至关重要:
以下是一个完整的决策树分类示例,包含数据加载、预处理、模型训练、评估及可视化。
import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier, export_graphviz
# 导入评估指标模块
from sklearn.metrics import accuracy_score, auc, confusion_matrix, f1_score, precision_score, recall_score, roc_curve
# 导入表格库
import prettytable
# 导入 dot 插件库
import pydotplus
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
# 设置绘图风格
sns.set(style="whitegrid")
# 数据导入
# 注意:实际使用时请确保网络可达或本地保存文件
df = pd.read_csv('https://raw.githubusercontent.com/ffzs/dataset/master/glass.csv', usecols=['Na','Ca','Type'])
# 为了决策树图示简洁我们尽量减少分类,和特征值
dfs = df[df.Type < 3]
# 获取特征值
X = dfs[dfs.columns[:-1]].values
# 获取标签值
y = dfs['Type'].values - 1
# 将数据分为测试集合训练集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=2018)
#### 模型训练 ####
# 决策树模型
dt_model = DecisionTreeClassifier(random_state=2018, max_depth=5)
# 训练模型
dt_model.fit(X_train, y_train)
# 对测试集做预测
pre_y = dt_model.predict(X_test)
#### 模型评估 ####
# 混淆矩阵
confusion_m = confusion_matrix(y_test, pre_y)
df_confusion_m = pd.DataFrame(confusion_m, columns=['0', '1'], index=['0', '1'])
df_confusion_m.index.name = 'Real'
df_confusion_m.columns.name = 'Predict'
print("混淆矩阵:")
print(df_confusion_m)

# 获取决策树的预测概率
y_score = dt_model.predict_proba(X_test)
# ROC 曲线
fpr, tpr, thresholds = roc_curve(y_test, y_score[:, 1])
# AUC
auc_s = auc(fpr, tpr)
# 准确率
accuracy_s = accuracy_score(y_test, pre_y)
# 精准度
precision_s = precision_score(y_test, pre_y)
# 召回率
recall_s = recall_score(y_test, pre_y)
# F1 得分
f1_s = f1_score(y_test, pre_y)
# 评估数据制表
df_metrics = pd.DataFrame([[auc_s, accuracy_s, precision_s, recall_s, f1_s]], columns=['auc', 'accuracy', 'precision', 'recall', 'f1'], index=['结果'])
print("评估指标:")
print(df_metrics)

#### 可视化 ROC #####
plt.figure(figsize=(8, 7))
plt.plot(fpr, tpr, label='ROC') # 画出 ROC 曲线
plt.plot([0, 1], [0, 1], linestyle='--', color='k', label='random chance') # 画出随机状态下的准确率线
plt.title('ROC Curve') # 子网格标题
plt.xlabel('false positive rate') # X 轴标题
plt.ylabel('true positive rate') # Y 轴标题
plt.legend(loc=0)
plt.savefig('roc_plot.png')
plt.show()
#### 保存决策树结构图为 pdf ####
# 决策树规则生成 dot 对象
dot_data = export_graphviz(dt_model, max_depth=5, feature_names=dfs.columns[:-1], filled=True, rounded=True)
# 通过 pydotplus 将决策树规则解析为图形
graph = pydotplus.graph_from_dot_data(dot_data)
# 将决策树规则保存为 PDF 文件
graph.write_pdf('tree.pdf')
# 保存为 jpg 图片
graph.write_jpg('xx.jpg')

在生成的决策树图中,每个节点包含以下关键信息:
混淆矩阵是评估分类模型性能的基础工具:
| 预测正例 | 预测负例 | |
|---|---|---|
| 真实正例 | TP (真正例) | FN (假负例) |
| 真实负例 | FP (假正例) | TN (真负例) |
通过以上步骤,我们可以构建一个稳健的分类模型,并利用 Python 强大的生态进行高效的分析与部署。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online