🫐PyCaret(Python自动化机器学习)自定义交互式解释性模型

Python | PyCaret | 自动机器学习 | 分类模型 | 聚类模型 | 异常检测 | 自然语言处理 | 身体质量指数 | 植物物种分类 | 合成数据 | 批发商客户 | 探索性数据分析 | 交互式显示 | 饱和成本 | 营销渠道 | Power BI | 监督学习 | 非监督学习 | 蛋白质 | 皮质 | 预防性维护 | 视觉见解 | 博弈论 | 沙普利值 | 解释模型

🏈page指点迷津 | Brief

要点

  1. PyCaret代码实现数学定义分类、聚类、异常检测和自然语言处理模型

  2. PyCaret模型创建模型和数据分析:身体质量指数回归模型探索性数据分析,植物物种分类模型预测,合成数据聚类模型探索性数据分析,批发商客户异常检测模型探索性数据分析,新闻板块自然语言处理探索性数据分析。模型部署到云端,或创建自定义交互式网页应用。

  3. PyCaret更多示例:预测饱和成本下,不同营销渠道销售额; 关联规则挖掘Power BI;蛋白质皮质异常检测;自然语言处理生成预防性维护视觉见解;应用博弈论沙普利值解释模型输出结果。

解释性模型

当人类可以轻松理解模型做出的预测和决策背后的推理时,模型就是可解释的。模型的可解释性越高,人们就越容易理解和信任该模型。深度学习和梯度提升等模型是不可解释的,被称为黑盒模型,因为它们对于人类理解来说过于复杂。 人类不可能立即理解整个模型并理解每个决策背后的推理。

有许多易于解释的传统模型类别,例如线性回归和决策树模型。 可解释性不仅仅是一个二元决定,因为它还取决于所讨论的特定模型的复杂性。 例如,使用 5 个特征的线性回归比使用 100 个特征的线性回归更容易解释。

本质上可解释的模型

线性/逻辑

对于线性模型和逻辑回归等线性模型,我们可以从每个特征的权重/系数中获取重要性。让我们快速回顾一下。假设我们尝试使用线性回归来预测员工的工资。自变量是多年的经验和之前的评分(满分 5 分)。

 薪酬 =W1 经验 + W2* 评分 \text { 薪酬 }=W 1^* \text { 经验 }+ \text { W2* 评分 }

对于标准化数据,W1 和 W2 本质上可以告诉我们,经验还是评级更重要。在这里,请注意,这是一种特定于模型的技术,可用于全局和局部解释。

决策树

决策树是另一种易于解释的算法,因为我们可以访问每个特征的所有分割:

我们可以清楚地看到从根节点到叶节点是如何做出决策的。 我们只需遵循基于自变量的规则,并将它们列出来解释每个预测。 同样,这是一种特定于模型的技术,可用于局部解释。

全局解释又如何呢?

对于小型决策树,我们可以使用上图。 然而,如果我们有很多特征,并且我们正在训练深度决策树,比如说深度为 8 或 9,那么就会有太多的决策规则无法有效地呈现。 在这种情况下,我们可以使用特征重要性来解释每个特征在全局层面的重要性。

决策树进行分裂以最大限度地减少杂质。我们可以使用这种减少来衡量每个特征的贡献。

Python实现可解释模型示例

 import pandas as pd
 import numpy as np
 from sklearn.model_selection import train_test_split
 from sklearn.metrics import mean_squared_error
 ​
 from sklearn.linear_model import LinearRegression
 from sklearn.tree import DecisionTreeRegressor
 from sklearn.ensemble import RandomForestRegressor
 from xgboost.sklearn import XGBRegressor
 from sklearn.preprocessing import OneHotEncoder, LabelEncoder
 from sklearn import tree
 ​
 import matplotlib.pyplot as plt
 %matplotlib inline

读取数据

 df = pd.read_csv('data.csv')

处理缺失值

 df['Item_Weight'].fillna(df['Item_Weight'].median(), inplace=True)
 df['Outlet_Size'].fillna(df['Outlet_Size'].mode()[0], inplace=True)

特征工程

 df['Item_Type_Combined'] = df['Item_Identifier'].apply(lambda df: df[0:2])
 df['Item_Type_Combined'] = df['Item_Type_Combined'].map({'FD':'Food', 'NC':'Non-Consumable', 'DR':'Drinks'})
 ​
 df['Item_Type_Combined'].value_counts()
 ​
 df['Outlet_Years'] = 2013 - df['Outlet_Establishment_Year']
 ​
 df['Item_Fat_Content'] = df['Item_Fat_Content'].replace({'LF':'Low Fat', 'reg':'Regular', 'low fat':'Low Fat'})
 df['Item_Fat_Content'].value_counts()

数据预处理

 le = LabelEncoder()
 df['Outlet'] = le.fit_transform(df['Outlet_Identifier'])
 var_mod = ['Item_Fat_Content','Outlet_Location_Type','Outlet_Size','Item_Type_Combined','Outlet_Type','Outlet']
 le = LabelEncoder()
 for i in var_mod:
 df[i] = le.fit_transform(df[i])
 ​
 df = pd.get_dummies(df, columns=['Item_Fat_Content','Outlet_Location_Type','Outlet_Size','Outlet_Type',
                               'Item_Type_Combined','Outlet'])

训练-测试-分割

 df.drop(['Item_Type','Outlet_Establishment_Year', 'Item_Identifier', 'Outlet_Identifier'],axis=1,inplace=True)
 ​
 X = df.drop('Item_Outlet_Sales',1)
 y = df['Item_Outlet_Sales']
 ​
 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=.25, random_state=42)

训练决策树模型

 dt = DecisionTreeRegressor(max_depth = 5, random_state=10)
 ​
 # fitting the decision tree model on the training set
 dt.fit(X_train, y_train)

可视化决策树

 decision_tree = tree.export_graphviz(dt, out_file='tree.dot', feature_names=X_train.columns, filled=True, max_depth=2)
 ​
 !dot -Tpng tree.dot -o tree.png
 ​
 image = plt.imread('tree.png')
 plt.figure(figsize=(25,25))
 plt.imshow(image)

我们的决策树的可视化清楚地显示了它用于进行预测的规则。 在这里,Item_MRP 和 Outlet_Type 是影响每个商店各种商品销售的首要特征。 如果您想查看完整的决策树,可以通过使用export_graphviz函数更改max_深度参数来轻松实现。

PyCaret

PyCaret 是一个开源、低代码的 Python 机器学习库,可自动化机器学习工作流程。 它是一种端到端的机器学习和模型管理工具,可以成倍地加快实验周期并提高您的工作效率。与其他开源机器学习库相比,PyCaret 是一个替代的低代码库,只需几行代码即可替换数百行代码。 这使得实验速度呈指数级增长且更加高效。 PyCaret 本质上是多个机器学习库和框架的 Python 包装器,例如 scikit-learn、XGBoost、LightGBM、CatBoost、spaCy、Optuna、Hyperopt、Ray 等。

PyCaret 简单易用。 PyCaret 中执行的所有操作都按顺序存储在为部署而完全编排的管道中。 无论是估算缺失值、转换分类数据、特征工程,甚至是超参数调整,PyCaret 都能自动执行所有操作。

线性回归模型

监督机器学习的一项基本任务是回归,其目标是预测连续值。这是通过了解给定数据集上目标变量 y 和特征变量 x 之间的关系来实现的。最基本的回归模型之一是线性回归 { }^6,其定义如下。还提供了方程的等效矢量化形式,其中计算转置矢量 \boldsymbol{\beta}^{\top} 和 \boldsymbol{X}_n 的内积。

yn=β0+β1xn1++βpxnp+ϵn=βXn+ϵn y_n=\beta_0+\beta_1 x_{n 1}+\cdots+\beta_p x_{n p}+\epsilon_n=\boldsymbol{\beta}^{\top} \boldsymbol{X}_{\boldsymbol{n}}+\epsilon_n

  • yny_n 是给定数据集的 nth n^{\text {th }} 实例的目标变量。

  • x1x_1xpx_p 是特征变量。

  • β0\beta_0 是截距项。

  • β1\beta_1βp\beta_p 是特征变量的系数。

  • ϵ\epsilon 是错误变量。

分类

分类是基本的监督学习任务之一,其目标是预测一个分类变量,称为类标签。 当只有两个类(0 和 1)时,此任务称为二元分类;如果有更多类,则称为多类分类。 最广泛使用的二元分类模型之一是逻辑回归,其数学定义如下式:

log(pn1pn)=β0+β1xn1++βpxnp=βXn \log \left(\frac{p_n}{1-p_n}\right)=\beta_0+\beta_1 x_{n 1}+\cdots+\beta_p x_{n p}=\boldsymbol{\beta}^{\top} \boldsymbol{X}_{\boldsymbol{n}}

  • log(pn1pn)\log \left(\frac{p_n}{1-p_n}\right) 是赔率的自然对数,称为 logit 函数。

  • x1x_1xpx_p 是特征变量。

  • β0\beta_0 是截距项。

  • β1\beta_1βp\beta_p 是特征变量的系数。

  • βXn\boldsymbol{\beta}^{\top} \boldsymbol{X}_n​ 是方程的矢量化形式。

聚类

无监督机器学习的基本任务之一是聚类。 此任务的目标是根据给定数据集的共同特征对不同集群中的实例进行分类。 聚类在各个领域都有许多实际应用,包括市场研究、社交网络分析、生物信息学、医学等。 K-Means 聚类是一种简单且广泛使用的方法,数学定义如下式:

minimizeC1,,CK{k=1KW(Ck)} \operatorname{minimize}_{C_1, \ldots, C_K}\left\{\sum_{k=1}^K W\left(C_k\right)\right\}

K 是所有簇的数量,而 C_K 代表每个单独的簇。我们的目标是最小化 W,这是簇内变化的度量。

W(Ck)=1Cki,iCkj=1p(xijxij)2 W\left(C_k\right)=\frac{1}{\left|C_k\right|} \sum_{i, i^{\prime} \in C_k} \sum_{j=1}^p\left(x_{i j}-x_{i^{\prime} j}\right)^2

异常检测

异常检测是无监督机器学习的主要任务之一,其目标是识别与大多数数据集实例显着不同的数据集实例。 这些实例被称为异常值,并且根据每个应用程序的上下文和领域,有各种激励措施来检测它们。 还有用于异常检测的半监督和完全监督方法,但我们将重点关注无监督方法,因为它受到 PyCaret 支持。局部离群因素是主要的异常检测模型之一,数学定义如下式:

LOFk(A)=BNk(A)lrdk(B)ldk(A)Nk(A) \operatorname{LOF}_k(A)=\frac{\sum_{B \in N_k(A)} \frac{\operatorname{lrd}_k(B)}{\operatorname{ld}_k(A)}}{\left|\mathbf{N}_k(A)\right|}

自然语言处理

自然语言处理位于计算语言学和机器学习的交叉点。 这个动态领域的主要目标是从自然语言(即人类在日常生活中使用的语言)中提取信息和见解。 包含多种方法和技术,包括主题建模、情感分析、机器翻译、文档摘要和语音到文本转换。 我们将重点关注主题建模,因为它受到 PyCaret 库的 NLP 模块的支持。 我们可以使用这种技术来发现主题,即隐藏的结构,让我们可以对文档集合(称为语料库)进行语义分组。 潜在狄利克雷分配是一种可用于主题建模的生成概率模型,数学其定义如下。

p(wα,β)=p(θα)(n=1Nznp(znθ)p(wnzn,β))dθ p(\mathbf{w} \mid \boldsymbol{\alpha}, \boldsymbol{\beta})=\int p(\theta \mid \alpha)\left(\prod_{n=1}^N \sum_{z_n} p\left(z_n \mid \theta\right) p\left(w_n \mid z_n, \boldsymbol{\beta}\right)\right) d \theta

Last updated