首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >logit和sklearn管道的热编码

logit和sklearn管道的热编码
EN

Stack Overflow用户
提问于 2021-04-17 13:36:26
回答 1查看 1.2K关注 0票数 0

我试图使用Python中的Dalex包来可视化二进制logit模型的某些特性。

我从示例书这里 (整个第五个代码单元格)复制了一段代码,但现在我不太确定结果应该如何解释.

在我使用statsmodels创建的基本logit模型中,我手动为每个类别选择了一个引用级别变量,以避免多重共线性(这意味着模型的所有结果都是针对参考级别进行解释的)。

但是当我使用上面链接的代码(也复制在本文下面)时,它首先在sklearn中创建一些管道对象,一个热点对分类变量进行编码,然后管道对象被拟合到数据中,并在Dalex解释器中用作要解释的模型。

问题是,当我在Dalex中使用像model_profile()这样的函数时,它应该输出一个显示变量对预测的ceteris paribus效应的图表,我不知道如何解释结果,因为似乎一个范畴变量中的所有值都包含在图中。

例如,该模型显示了“性别”范畴变量对男性和女性平均预测的影响。

这也显示了一条名为“平均预测”的水平线,但“平均预测”是什么呢?它是根据男性作为参考水平计算的,还是女性?

我真的很困惑这些结果意味着什么..。有谁能澄清一下吗?我尝试使用的函数model_profile()也在笔记本中进行了解释。谢谢!

我复制的代码:

代码语言:javascript
复制
    numerical_features = ['age', 'fare', 'sibsp', 'parch']
    numerical_transformer = Pipeline(
        steps=[
            ('imputer', SimpleImputer(strategy='median')),
            ('scaler', StandardScaler())
        ]
    )
    
    categorical_features = ['gender', 'class', 'embarked']
    categorical_transformer = Pipeline(
        steps=[
            ('imputer', SimpleImputer(strategy='constant', fill_value='missing')),
            ('onehot', OneHotEncoder(handle_unknown='ignore'))
        ]
    )
    
    preprocessor = ColumnTransformer(
        transformers=[
            ('num', numerical_transformer, numerical_features),
            ('cat', categorical_transformer, categorical_features)
        ]
    )
    
    classifier = MLPClassifier(hidden_layer_sizes=(150,100,50), max_iter=500, random_state=0)
    
    clf = Pipeline(steps=[('preprocessor', preprocessor),
                          ('classifier', classifier)])
    clf.fit(X, y)
    exp = dx.Explainer(clf, X, y)
EN

回答 1

Stack Overflow用户

发布于 2021-04-17 14:23:16

为什么会发生这种情况?

之所以会出现这种情况,是因为在默认情况下,sklearnOneHotEncoder会对数据中的每个类别进行一次热转换。然而,对于像logit这样的线性模型,通常倾向于将其中一种类别排除在外,以避免多重共线性,并使结果可以解释为一个参考点。在这种情况下,您需要更改编码器的默认设置。

示例

您可以通过设置drop="first"来实现这一点,这将删除一个热编码过程的第一个类别。下面的示例说明了如何在一个简单的示例中这样做。在这里,“女性”类别从一个热编码中删除,只有“男性”类别被编码,这将返回您期望的结果。请注意,这也适用于非二进制特性。

代码语言:javascript
复制
from sklearn.preprocessing import OneHotEncoder
X = pd.DataFrame({"gender":["male","female","female","male"]})
OHE = OneHotEncoder(drop="first")
OHE.fit_transform(X).toarray()
#[[1.],
# [0.],
# [0.],
# [1.]]
OHE.get_feature_names()
#['x0_male']

你需要做的是

因此,您需要在代码中更改的只是管道定义中的以下一行:

代码语言:javascript
复制
'onehot', OneHotEncoder(drop='first', handle_unknown='ignore')
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67138759

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档