day32 python解释性库PDPbox
目录
一、初识PDPbox官方文档
二、准备鸢尾花数据集和训练模型
三、使用PDPbox进行解释性分析
1. 导入类并实例化对象
2. 调用plot方法绘制图形
3. 探索返回值的意义
四、总结与感悟
作为一名正在学习机器学习的学生,今天要学习一个非常有趣的库——PDPbox(Partial Dependence Plot Toolbox)。这个库能够帮助我们可视化特征对模型预测的影响,让我们更好地理解模型的决策过程。今天,我将通过一个经典的鸢尾花数据集三分类项目,分享我是如何从PDPbox的官方文档入手,一步步完成特征影响的可视化分析的。
一、初识PDPbox官方文档
在探索新的Python库时,我总是会先去查看它的官方文档。PDPbox的官方文档 PDPbox — PDPbox 0.2.1+1.g7fae76b.dirty documentation 给了我很大的帮助。虽然我还在努力提升英语水平,但通过安装一个免费的网页翻译插件,我能够比较顺畅地阅读文档内容。
我发现,大多数Python库的官方文档都会有一个“API Reference”或“Documentation”部分,这里详细列出了所有可用的函数、类和方法。PDPbox库虽然不大,但对于我这样的新手来说,正好合适用来学习如何使用官方文档来掌握一个库的用法。
二、准备鸢尾花数据集和训练模型
在开始使用PDPbox之前,我先准备了一个经典的机器学习项目——鸢尾花数据集的三分类问题。这个数据集包含4个特征:花萼长度、花萼宽度、花瓣长度和花瓣宽度。我使用了sklearn
库来加载数据集,并用RandomForestClassifier
训练了一个模型。以下是代码示例:
import pandas as pd
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier# 加载鸢尾花数据集
iris = load_iris()
df = pd.DataFrame(iris.data, columns=iris.feature_names)
df['target'] = iris.target # 添加目标列(0-2类:山鸢尾、杂色鸢尾、维吉尼亚鸢尾)# 特征与目标变量
features = iris.feature_names # 4个特征
target = 'target' # 目标列名# 划分训练集与测试集
X_train, X_test, y_train, y_test = train_test_split(df[features], df[target], test_size=0.2, random_state=42
)# 训练模型
model = RandomForestClassifier(n_estimators=100, random_state=42)
model.fit(X_train, y_train)
三、使用PDPbox进行解释性分析
模型训练完成后,我迫不及待地打开了PDPbox的官方文档,寻找可以用来可视化特征影响的类和方法。我发现了一个叫TargetPlot
的类,它看起来很适合用来绘制目标变量在不同特征值下的分布情况。
1. 导入类并实例化对象
根据官方文档的说明,我首先导入了TargetPlot
类,并尝试实例化对象。在这个过程中,我遇到了一个SettingWithCopyWarning
的警告,提示我可能在对DataFrame的切片进行赋值操作时出现了问题。我查阅了Pandas的官方文档 Indexing and selecting data — pandas 2.2.3 documentation,了解到这可能是因为我在操作数据时没有正确使用.loc
方法。以下是代码示例:
import pdpbox
print(pdpbox.__version__) # 确保版本是最新的from pdpbox.info_plots import TargetPlot # 导入TargetPlot类# 选择待分析的特征
feature = 'petal length (cm)'
feature_name = feature # 特征显示名称# 初始化TargetPlot对象
target_plot = TargetPlot(df=df, # 原始数据(需包含特征和目标列)feature=feature, # 目标特征列feature_name=feature_name, # 特征名称(用于绘图标签)target='target', # 多分类目标索引(鸢尾花3个类别)grid_type='percentile', # 分桶方式:百分位num_grid_points=10 # 划分为10个桶
)
2. 调用plot方法绘制图形
实例化对象后,我调用了plot
方法来绘制目标变量的分布图。我发现这个方法返回了一个三元组(fig, axes, summary_df)
,其中fig
是Plotly的Figure对象,axes
是绘图的坐标轴对象(在这个例子中返回的是None
),而summary_df
是一个DataFrame,包含了目标变量在不同特征区间的统计摘要。以下是代码示例:
fig, axes, summary_df = target_plot.plot(which_classes=None, # 绘制所有类别(0,1,2)show_percentile=True, # 显示百分位线engine='plotly',template='plotly_white'
)# 手动设置图表尺寸(单位:像素)
fig.update_layout(width=800, # 宽度800像素height=500, # 高度500像素title=dict(text=f'Target Plot: {feature_name}', x=0.5) # 居中标题
)fig.show()
3. 探索返回值的意义
在绘制完图形后,我开始好奇plot
方法返回的三元组(fig, axes, summary_df)
究竟是什么。通过查阅官方文档,我了解到fig
是可以用来进一步修改图表外观的Plotly Figure对象,summary_df
则是包含了目标变量在不同特征区间的统计摘要数据。这些信息让我对特征如何影响目标变量有了更直观的理解。
四、总结与感悟
通过今天的实践,我不仅学会了如何使用PDPbox的TargetPlot
类来可视化特征对目标变量的影响,还掌握了如何通过官方文档来探索和使用新的Python库。
@浙大疏锦行