如何编写具有两个输入的 fit_transformer 并将其包含在 python sklearn 的管道中?
Posted
技术标签:
【中文标题】如何编写具有两个输入的 fit_transformer 并将其包含在 python sklearn 的管道中?【英文标题】:How to write a fit_transformer with two inputs and include it in a pipeline in python sklearn? 【发布时间】:2017-01-26 14:56:58 【问题描述】:鉴于一些虚假数据:
X = pd.DataFrame( np.random.randint(1,10,28).reshape(14,2) )
y = pd.Series( np.repeat([0,1], [10,4]) ) # imbalanced with more 0s than 1s
我编写了一个 sklearn 拟合转换器,它对 y 的大部分进行欠采样以匹配少数标签的长度。我想在管道中使用它。
from sklearn.base import BaseEstimator, TransformerMixin
class UnderSampling(BaseEstimator, TransformerMixin):
def fit(self, X, y): # I don't need fit to do anything
return self
def transform(self, X, y):
is_pos = y == 1
idx_pos = y[is_pos].index
random.seed(random_state)
idx_neg = random.sample(y[~is_pos].index, is_pos.sum())
idx = sorted(list(idx_pos) + list(idx_neg))
X_resampled = X.loc[idx]
y_resampled = y.loc[idx]
return X_resampled, y_resampled
def fit_transform(self, X, y):
return self.transform(X,y)
最不幸的是,我不能在管道中使用它。
from sklearn.pipeline import make_pipeline
us = UnderSampling()
rfc = RandomForestClassifier()
model = make_pipeline(us, rfc)
model.fit(X,y)
我怎样才能使这个管道工作?
【问题讨论】:
【参考方案1】:您并不是要直接在类上调用估算器方法,而是要在类实例上调用它;这是因为估计器通常具有某种类型的存储状态(例如模型系数):
u = UnderSampling()
a,b = u.fit(X, y)
a,b = u.fit_transform(X, y)
【讨论】:
以上是关于如何编写具有两个输入的 fit_transformer 并将其包含在 python sklearn 的管道中?的主要内容,如果未能解决你的问题,请参考以下文章
sklearn PCA fit_transform() 是不是居中输入变量?
fit_transform 中的错误:输入包含 NaN、无穷大或对于 dtype('float64') 而言太大的值