Python 3.x 对分类变量使用pd.get_dummies()和DictVectorizer()时会产生不同的结果

Python 3.x 对分类变量使用pd.get_dummies()和DictVectorizer()时会产生不同的结果,python-3.x,pipeline,dummy-variable,dictvectorizer,Python 3.x,Pipeline,Dummy Variable,Dictvectorizer,当我试图在管道中使用分类变量时,我遇到了一个问题。 pd.get_dummies()是一个很棒的工具,但我们不能在管道中正确使用它。所以我不得不使用DictVectorizer()。我按照下面的方法做(玩具示例) 然后我建造管道 class Cat(): def transform(self, X, y=None, **fit_params): enc = DictVectorizer(sparse = False) encc = enc.fit(df[

当我试图在
管道中使用分类变量时,我遇到了一个问题。
pd.get_dummies()
是一个很棒的工具,但我们不能在管道中正确使用它。所以我不得不使用
DictVectorizer()
。我按照下面的方法做(玩具示例)

然后我建造管道

class Cat():

    def transform(self, X, y=None, **fit_params):
        enc = DictVectorizer(sparse = False)
        encc = enc.fit(df[['b']].T.to_dict().values())
        enc_data = encc.transform(X.T.to_dict().values())
        return enc_data

    def fit_transform(self, X, y=None, **fit_params):
        self.fit(X, y, **fit_params)
        return self.transform(X)

    def fit(self, X, y=None, **fit_params):
        return self
xgb = XGBRegressor()
pipeline = Pipeline([ 

                ('categorical', Cat()),
    ('model_fitting', xgb),
])
pipeline.fit(X, y)
metrics.r2_score(y, pipeline.predict(X))
0.9999985362431687
它起作用了。与pd.get_dummies()比较

但问题是使用
pd.get_dummies()
DictVectorizer()
在实际数据集上的结果有很大的不同。真正的数据集既没有NAN,也没有空的sell。它有两个变量1)y数字和2)字符串“性别”(f-962,m-140)。
和R^2,用于pd.get_dummies()
0.025946526223095123

R^2用于
DictVectorizer()0.00170802695618677
问题不取决于样本量,因为我做了

df = pd.DataFrame({ 'a': range(6000) ,  'b': ['а', 'м']*3000})
结果是一致的


原因可能是什么?谢谢你的帮助,我看不出有什么问题。我建议你去掉管道的复杂性,使用get_dummies和dictvectorizer尝试第一步;比较两个输出,我已经完成了。相同的数据集)当您在这些相同的数据集上运行fit和score时?@simon抱歉,我发现了错误((我通过筛选获得了真实的数据集,并且必须重置索引……。我是个白痴(可能是因为您定义cat()的方式)。通常要包含在管道中,您的分类器需要从BaseEstimator继承。看不出任何错误。我建议您去掉管道的复杂性,使用get_dummies和dictvectorizer尝试第一步;并比较两个输出。我已经完成了。相同的数据集)当你在这些相同的数据集上运行fit和score时?@simon抱歉,我发现了错误((我通过过滤获得了我的真实数据集,并且我必须重置索引……。我是个白痴(可能是因为你定义cat()的方式)。通常要包含在管道中,你的分类器需要从BaseEstimator继承。
X1 = pd.get_dummies(df['b'])
xgb.fit(X1, y)
metrics.r2_score(y, xgb.predict(X1))
0.9999985362431687
df = pd.DataFrame({ 'a': range(6000) ,  'b': ['а', 'м']*3000})