将pd.get_dummies()和DictVectorizer()与分类变量

时间:2017-01-21 16:01:56

标签: python-3.x pipeline dummy-variable dictvectorizer

当我尝试在pipeline中使用分类变量时,我遇到了问题。 pd.get_dummies()是一个了不起的工具,但我们无法在pipeline中正确使用它。所以我不得不使用DictVectorizer()。我这样做(玩具示例)

import numpy as np
import pandas as pd
import sklearn
from sklearn.pipeline import Pipeline
from sklearn.feature_extraction import DictVectorizer
from sklearn import metrics
from xgboost.sklearn import XGBRegressor
df = pd.DataFrame({'a':[1,1,1,2,2,2],  'b':['a', 'a', 'a', 'b', 'b', 'b']     })

X = df[['b']]
y = df['a']

然后我构建管道

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()

比较
X1 = pd.get_dummies(df['b'])
xgb.fit(X1, y)
metrics.r2_score(y, xgb.predict(X1))
0.9999985362431687

但问题是使用pd.get_dummies()DictVectorizer()的实际数据集的结果会有很大差异。真实数据集没有NAN也没有空卖。它有两个变量1)y - 数字和2)字符串'性别'(f -962,m - 140) 和pd.get_dummies() 0.025946526223095123

的R ^ 2

DictVectorizer() 0.00170802695618677的R ^ 2 问题不依赖于我做的样本量

df = pd.DataFrame({ 'a': range(6000) ,  'b': ['а', 'м']*3000})

并且结果相同

可能是什么原因? thanx求助你

0 个答案:

没有答案