使用代理模型构建可解释的ml模型。

safe-transformer的Python项目详细描述


[![下载](https://pepy.tech/badge/safe transformer)(https://pepy.tech/project/safe transformer)
[![PYPI版本](https://badge.fury.io/py/safe transformer.svg)](https://badge.fury.io/py/safe transformer)



\safe-代理辅助的特征提取

safe是一个Python库,您可以使用它来构建更好的可解释ML模型,利用更强大的功能,黑匣子模型。
其思想是使用更复杂的模型(称为代理模型)从特征中提取更多信息,这些信息可以稍后用于拟合一些更简单但可解释的模型。
输入数据被划分为间隔或新的类别集,由代理模型确定,然后根据每个点所属的间隔或类别对其进行转换。
库为您提供了safetransformer类,该类实现了transformermixin接口,因此它可以用作scikit学习管道的一部分。
使用此库,您可以通过从更复杂的模型中传输信息。
关于safe-on的文章可以在[这里](https://arxiv.org/abs/1902.11035)找到。

python 3安装在您的机器上。

gradientboostingressor
来自sklearn.model_selection导入train_test_split
导入熊猫作为pd
来自sklearn.linear_model导入linearregression
来自sklearn.metrics导入mean_squared_error
来自sklearn.pipeline导入pipeline

data=load_boston()
x=pd.dataframe(data.data,columns=data.feature\u names)
y=data['target']

x_-train,x_-test,y_-train,y_-test=train_-test_-split(x,y)

surrogate_-model=gradientBoostingRegressor(n_估计器=100,
max_depth=4,
learning_rate=0.1,
损失='huber')
代理项模型=代理项模型.fit(x_列,y_列)

线性模型=线性相关()
安全变压器=安全变压器(代理项模型,惩罚=0.84)
管道=管道(步骤=[("安全",安全变压器),("线性",线性模型])
管道=管道。拟合(x_列,y_列)
预测=管道。预测(x_检验)
均方误差(y_检验,预测)

````

``bash
13.617733207161479
`````
``python
``线性模型=线性回归()
线性模型=线性模型.拟合(x列,y_列)
标准_预测=线性_模型_标准。预测(x_检验)
平均_平方误差(y_检验,标准_预测)
`````
``bash
29.27790566931337
````

黑箱模型,保持简单模型的可解释性。

用于安装安全变压器的数据必须是pandas数据帧。

您还可以指定惩罚和毛皮模型参数。

[此处](https://plubon.github.io/safe docs/)


\
分割基于代理模型的响应。
对于每个变量的连续因变量,我们会找到表示值的变化点代理模型的响应快速变化的变量。变化点之间的间隔是转换的基础,例如,特征被转换为类别变量,其中相同间隔中的特征值形成相同的类别。为了找到变化点,我们需要部分依赖图。
这些图描述了给定变量(或多个变量)对模型结果的边际影响。
对于每个变量的分类变量,我们基于代理模型响应执行分层聚类。然后,根据类别之间响应的最大相似性,将它们合并在一起形成新的类别。




执行拟合方法的算法如下所示:

&;nbsp;

![*fit method algorithm*](images/fl.svg)


&;nbsp;

我们的算法适用于回归和分类问题。在回归的情况下,我们只是使用模型响应来创建部分依赖图和层次聚类。对于分类,我们使用每个类的预测概率。


它是为波士顿住房数据框架创建的,示例中的变量是lstat。为了从部分依赖图中获取变化点,我们使用[中断](http://ctruong.perso.math.cnrs.fr/ruptures-docs/build/html/index.html)库及其模型[pelt](http://ctruong.perso.math.cnrs.fr/ruptures docs/build/html/detection/pelt.html)。

<;img src="images/simple plot.png"width="425"/>;<;img src="images/changepoint.png"width="425"/>;


\要根据平均模型响应创建新类别,我们使用scikit learn[ward算法](https://scikit-learn.org/0.15/modules/generated/sklearn.cluster.ward.html)并查找要从[kneed library]中剪切kneelocator类的集群数(https://github.com/arvkevi/kneed)。

<;img src="images/categorical.png"width="425"/>;<;img src="images/dendo.png"width="425"/>;


\在这里你可以看到模型的质量如何随着惩罚而改变。对于代理模型和基本模型的参考结果也在图中。

&;nbsp;
<;img src="images/pens.png"alt="model performance"width="500"/>;
&;nbsp;

为了保证代理模型的准确性。



``python
安全变压器。总结(变量名为‘crim’’
```
` ` `
` ` ` `
数值变量crim
选择区间:
[-inf,4.90)
[4.90,11.14,11.14,15.59)
[15.59,24.50,24.50,24.50,24.50,33.40)
[33.40,48.40,48.54)
[48.54,48.54,48.54,48.54,48.54,48.54,48.54 inf)
```

请参见所有变量的转换不指定变量名参数。

``python
safe_transformer.summary()
````

```
numerical variable crim
所选间隔:
[-inf,4.90)
[4.90,11.14)
[11.14,15.59)
[15.59,24.50)
[24.50,33.40)
[33.40,48.54)
[48.54,inf)
[33.54,inf]
数值变量zn
选择区间:
[-inf,33.53)
[33.53,inf)
[33.53,inf]
>数值变量indus
>选择区间:
[-inf,2.78,2.78,2.78,3.19)
[3.19,4.28,4.28,10.29,10.29,10.29,26.68)
[10.29,26.29,26.68]
[26.26,26.68]
[26.26>[26.26.68,26.68分,inf)







数值变量lstat
选定间隔:
[-inf,4.55)
[4.55,4.73)
[4.73,5.43)
[5.43,5.96)
[5.96,7.55)
[7.55,8.08)
[8.08,9.67)
[9.67,9.85)
[9.85,10.02)
[10.02,14.43)
[14.43,14.96)
[14.96,16.02)
[16.02,18.14)
[18.14,19.37)
[19.37,23.96)
[23.96,26.78)
[26.78,29.61)
[29.61,inf)
```
引用

*[原始安全算法](https://mi2datalab.github.io/safe/index.html),在r
*[中断库](https://github.com/deepcharles/ruptures)中实现,用于查找变更点
*[跪库](https://github.com/arvkevi/kneed),用于剪切层次树
*[安全文章](https://arxiv.org/abs/1902.11035)-关于安全算法的文章,包括使用SAFE库的基准结果

该项目是由Aleksandra Gacek和Piotr Lubon在华沙理工大学数学与信息科学学院的[研究研讨会课程](https://github.com/pbiecek/casestudies2019w)上完成的。



欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java如何将springboot war部署到debian jetty8   java破坏了函数,即使它看起来是正确的   当MockMvc不可自动编译时,java会有选择地从Spring Security向其应用单个过滤器   java AndroidStudio每秒播放n次生成的声音   JavaJBossSeam:继承的方法被拦截了吗?   ScheduledExecutorService中线程默认名称中池号的java含义   在Java中用递归方法实现类Fibonacci的递归   java虚拟路径/文件夹   java即时与ZoneDateTime。转换到另一时区   用GaussLegendre算法在java中逼近Pi   java RecyclerView findFirstVisibleItemPosition()返回1   java根据当前经过身份验证的用户的角色返回不同的JSON对象   java从内部类访问扩展类的方法   Android程序中的Java语法WRT静态方法   可选参数初始化Java字符串文字时出错