当我尝试在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) 字符串 'gender' (f -962, m - 140)。
和 R^2 为pd.get_dummies()
0.025946526223095123
R^2 表示DictVectorizer() 0.00170802695618677
问题不取决于样本量,因为我做了
df = pd.DataFrame({ 'a': range(6000) , 'b': ['а', 'м']*3000})
结果是一样的
可能是什么原因?谢谢你的帮助