10.Partial Dependence Plots

本教程是ML系列的一部分。 在此步骤中,您将学习如何创建和解释部分依赖图,这是从模型中提取洞察力的最有价值的方法之一。

What Are Partial Dependence Plots

 有人抱怨机器学习模型是黑盒子。这些人会争辩说我们无法看到这些模型如何处理任何给定的数据集,因此我们既不能提取洞察力也不能确定模型的问题。

总的来说,提出这种说法的人不熟悉部分依赖图。部分依赖图显示每个变量或预测变量如何影响模型的预测。这对于以下问题很有用:

  1.     男女之间的工资差异有多少仅仅取决于性别,而不是教育背景或工作经历的差异?
  2.     控制房屋特征,经度和纬度对房价有何影响?为了重申这一点,我们想要了解在不同区域如何定价同样大小的房屋,即使 实际上这些地区的房屋大小不同。
  3.     由于饮食差异或其他因素,两组之间是否存在健康差异?

如果您熟悉线性或逻辑回归模型,则可以与这些模型中的系数类似地对部分依赖图进行解释。但是,部分依赖图可以从数据中捕获更复杂的模式,并且可以与任何模型一起使用。如果您不熟悉线性或逻辑回归,请不要接受这种比较。

我们将在下面展示几个示例,解释它们的含义,然后讨论代码。

Interpreting Partial Dependence Plots

我们将从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公里外似乎有一个不错的郊区,但房价高于许多更近的郊区。

右图显示了建筑面积的影响,其解释类似。较大的建筑面积意味着更高的价格。

这些图既可用于提取洞察力,也可用于检查模型是否正在学习您认为合理的内容。

Code

我们不关注加载数据的代码,相反关注绘图的代码:

【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有关的提示:

  1.     这些要素是您希望绘制的X数组或数据框中的列号。这开始看起来比2或3个变量更糟糕。您可以一次重复调用绘图2或3。
  2.     可以选择确定水平轴上的哪些点。最简单的是grid_resolution,我们用它来确定绘制了多少个不同的点。随着该值的增加,这些图形看起来呈锯齿状,因为您将在模型中拾取大量随机性或噪声。最好不要在字面上采用小的或锯齿状的波动。 grid_resolution的较小值使这一点平滑。对于具有多行的数据集来说,这也是一个问题。
  3.     有一个叫做partial_dependence的函数来获取构成这个图的原始数据,而不是制作视觉图。如果您想使用Seaborn等绘图包控制它的可视化方式,这非常有用。通过适度的努力,您可以制作更好看的图。

Another Examples

以下是泰坦尼克号数据中非常简单的模型的部分图。

[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)

乍一看,这些看起来可能令人惊讶。 但他们展示了一些有趣的见解:

  1.      年轻人生存几率大。 这与历史叙述一致,他们首先让女性和儿童脱离了泰坦尼克号。
  2.      支付更多的人有更好的生存几率。 事实证明,更高的票价让你有一个更接近船顶的小屋,并且可能给你更好的获得救生艇的几率。

Conclusion

部分依赖图是从复杂模型中提取洞察力的好方法(尽管不是唯一的方法)。这些可以非常强大,可以将这些见解传达给同事或非技术用户。

当这些图来自非实验数据时,对于如何解释这些图有各种各样的观点。有些人声称,除非来自实验,否则你不能对数据的因果关系做任何结论。其他人对从非实验数据(也称为观察数据)可以学到的东西更加积极。这是数据科学领域的一个分歧主题,超出了本教程的范围。

但大多数人都同意这些对于理解您的模型很有用。此外,鉴于大多数真实世界数据源的混乱,您的模型捕获真实模式也是一个很好的理智检查。

partial_dependence_plot函数是获取这些图的简单方法,尽管结果在视觉上并不美观。 partial_dependence函数为您提供原始数据,以防您想要制作演示质量图表。

Your Turn

在项目中选择三个预测变量。 制定关于部分依赖图将是什么样的。 创建绘图,并根据您的假设检查结果。

你可能感兴趣的:(Machine,Learning)