如何在 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 中创建具有分类特征的易于解释的回归模型?的主要内容,如果未能解决你的问题,请参考以下文章
具有诸如 hasDate、hasLocation、第一个单词等特征的朴素贝叶斯文本分类器
你如何在python中创建一个具有其他用户可以写入权限的文件
如何在 Scikit-learn 的管道中创建我们的自定义特征提取器函数并将其与 countvectorizer 一起使用