如何在 Python 中创建具有分类特征的易于解释的回归模型?

Posted

技术标签:

【中文标题】如何在 Python 中创建具有分类特征的易于解释的回归模型?【英文标题】:How to create an easy to explain regression model in Python with categorical features? 【发布时间】:2018-06-21 17:38:07 【问题描述】:

我有一个如下所示的数据集,其中每一行都是一个用户。

gender   age_group c1  c2     c3    total_cost
F        0-10      10  F1234  3456  135.2
F        65-100    10  G5143  876   523.6
M        18-35     15  F3457  876   98.5
F        0-10      10  F1234  545   1052.1
M        35-65     20  G5143  3456  345.8

我需要提供一个模型/摘要,说明哪些因素会导致每个年龄组和性别组合的 total_cost 方差。这必须在 python 中完成,并且每个模型中每个特征的贡献的可解释性是关键。

c1, c2 and c3 是模型的特征,是分类的(不是数字的),可以有大约 1000 个不同的类别。

我最初的想法是创建一个Decision Tree,这将有助于实现更易于解释的目标,但DecisionTreeRegressor scikit 似乎不支持分类变量。 One-hot 编码可以工作,但由于某些功能可能有 1000 多个类别,这似乎对可解释性毫无帮助。

对于更易于解释的模型,我有哪些选择?另外,由于我需要为性别和年龄组的每种组合创建不同的模型,这样做的好方法是什么?最终模型应该能够为给定的性别和年龄组自动选择合适的模型。

【问题讨论】:

您可以使用LabelEncoder 为树提供分类值,您不必使用单热向量,但是分类或标签编码将为您提供与一个一样多的功能-热编码(同样难以阅读,无论哪种方式分析)。您可能还想查看来自 scikit-learn 的 f_regression 或 ELI5 library 以了解您想要的内容。 【参考方案1】:

如果 one-hot-encoding 对可解释性没有帮助,可能是因为对于观察数量而言,类别太多,而某些类别可能很少出现。我知道这可能是不言而喻的,但它会建议使用降维算法,例如 PCA。

使用 one-hot-encoding 转换您的 c1 功能(以及随后的所有其他功能)并运行 Multiple Correspondence Analysis。它本质上是分类特征的 PCA。 Python 实现是here。

【讨论】:

以上是关于如何在 Python 中创建具有分类特征的易于解释的回归模型?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Python 中创建分类气泡图?

具有诸如 hasDate、hasLocation、第一个单词等特征的朴素贝叶斯文本分类器

在 R 中创建具有简单特征的 voronoi 多边形

朴素贝叶斯分类算法预测具有属性的人是不是买电脑python

你如何在python中创建一个具有其他用户可以写入权限的文件

如何在 Scikit-learn 的管道中创建我们的自定义特征提取器函数并将其与 countvectorizer 一起使用