本教程是ML系列的一部分。 在此步骤中,您将学习如何创建和解释部分依赖图,这是从模型中提取洞察力的最有价值的方法之一。
有人抱怨机器学习模型是黑盒子。这些人会争辩说我们无法看到这些模型如何处理任何给定的数据集,因此我们既不能提取洞察力也不能确定模型的问题。
总的来说,提出这种说法的人不熟悉部分依赖图。部分依赖图显示每个变量或预测变量如何影响模型的预测。这对于以下问题很有用:
如果您熟悉线性或逻辑回归模型,则可以与这些模型中的系数类似地对部分依赖图进行解释。但是,部分依赖图可以从数据中捕获更复杂的模式,并且可以与任何模型一起使用。如果您不熟悉线性或逻辑回归,请不要接受这种比较。
我们将在下面展示几个示例,解释它们的含义,然后讨论代码。
我们将从2个部分依赖图开始,显示Price和来自Melbourne Housing数据集的几个变量之间的关系(根据我们的模型)。 我们将介绍如何创建和解释这些图。
【1】
import pandas as pd
from sklearn.ensemble import GradientBoostingRegressor, GradientBoostingClassifier
from sklearn.ensemble.partial_dependence import partial_dependence, plot_partial_dependence
from sklearn.preprocessing import Imputer
cols_to_use = ['Distance', 'Landsize', 'BuildingArea']
def get_some_data():
data = pd.read_csv('../input/melbourne-housing-snapshot/melb_data.csv')
y = data.Price
X = data[cols_to_use]
my_imputer = Imputer()
imputed_X = my_imputer.fit_transform(X)
return imputed_X, y
X, y = get_some_data()
my_model = GradientBoostingRegressor()
my_model.fit(X, y)
my_plots = plot_partial_dependence(my_model,
features=[0,2],
X=X,
feature_names=cols_to_use,
grid_resolution=10)
左图显示了我们的目标,销售价格和距离变量之间的部分依赖关系。此数据集中的距离测量墨尔本中央商务区的距离。
仅在模型拟合后才计算部分依赖图。该模型适用于实际数据。在那些真实的数据中,城镇不同地区的房屋可能有多种不同的方式(不同的年龄,大小等)。但是在模型拟合之后,我们可以从一个房屋的所有特征开始。比如,一间有2间卧室,2间浴室,10岁的房子等等。
然后我们使用该模型来预测该房屋的价格,但我们在进行预测之前更改距离变量。我们首先预测距离为4时房屋的价格。然后我们预测设定距离为5的价格。然后再次预测距离为6的价格。依此类推。当我们从小的距离值(在水平轴上)移动时,我们会追踪预测价格如何变化(在垂直轴上)。
在本说明中,我们只使用了一个房子。但由于相互作用,单个房屋的部分依赖图可能是非典型的。所以,我们用多个房子重复那个实验,然后我们在垂直轴上绘制平均预测价格。你会看到一些负数。这并不意味着会以负价出售。相反,它意味着价格将低于该距离的实际平均价格。
在左图中,我们看到房价下跌,因为我们进一步从中央商务分散注意力。虽然大约16公里外似乎有一个不错的郊区,但房价高于许多更近的郊区。
右图显示了建筑面积的影响,其解释类似。较大的建筑面积意味着更高的价格。
这些图既可用于提取洞察力,也可用于检查模型是否正在学习您认为合理的内容。
我们不关注加载数据的代码,相反关注绘图的代码:
【2】
def get_some_data():
cols_to_use = ['Distance', 'Landsize', 'BuildingArea']
data = pd.read_csv('../input/melbourne-housing-snapshot/melb_data.csv')
y = data.Price
X = data[cols_to_use]
my_imputer = Imputer()
imputed_X = my_imputer.fit_transform(X)
return imputed_X, y
【3】
from sklearn.ensemble.partial_dependence import partial_dependence, plot_partial_dependence
# get_some_data is defined in hidden cell above.
X, y = get_some_data()
# scikit-learn originally implemented partial dependence plots only for Gradient Boosting models
# this was due to an implementation detail, and a future release will support all model types.
my_model = GradientBoostingRegressor()
# fit the model as usual
my_model.fit(X, y)
# Here we make the plot
my_plots = plot_partial_dependence(my_model,
features=[0, 2], # column numbers of plots we want to show
X=X, # raw predictors data.
feature_names=['Distance', 'Landsize', 'BuildingArea'], # labels on graphs
grid_resolution=10) # number of values to plot on x axis
一些与plot_partial_dependence有关的提示:
以下是泰坦尼克号数据中非常简单的模型的部分图。
[4]
titanic_data = pd.read_csv('../input/titanic/train.csv')
titanic_y = titanic_data.Survived
clf = GradientBoostingClassifier()
titanic_X_colns = ['PassengerId','Age', 'Fare',]
titanic_X = titanic_data[titanic_X_colns]
my_imputer = Imputer()
imputed_titanic_X = my_imputer.fit_transform(titanic_X)
clf.fit(imputed_titanic_X, titanic_y)
titanic_plots = plot_partial_dependence(clf, features=[1,2], X=imputed_titanic_X,
feature_names=titanic_X_colns, grid_resolution=8)
乍一看,这些看起来可能令人惊讶。 但他们展示了一些有趣的见解:
部分依赖图是从复杂模型中提取洞察力的好方法(尽管不是唯一的方法)。这些可以非常强大,可以将这些见解传达给同事或非技术用户。
当这些图来自非实验数据时,对于如何解释这些图有各种各样的观点。有些人声称,除非来自实验,否则你不能对数据的因果关系做任何结论。其他人对从非实验数据(也称为观察数据)可以学到的东西更加积极。这是数据科学领域的一个分歧主题,超出了本教程的范围。
但大多数人都同意这些对于理解您的模型很有用。此外,鉴于大多数真实世界数据源的混乱,您的模型捕获真实模式也是一个很好的理智检查。
partial_dependence_plot函数是获取这些图的简单方法,尽管结果在视觉上并不美观。 partial_dependence函数为您提供原始数据,以防您想要制作演示质量图表。
在项目中选择三个预测变量。 制定关于部分依赖图将是什么样的。 创建绘图,并根据您的假设检查结果。