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