栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

sklearn中带有数据标签的定制变压器Mixin

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

sklearn中带有数据标签的定制变压器Mixin

fit()
Mehtod应该返回自身,而不是转换后的值。如果只需要功能用于火车数据而不需要测试,请实施该
fit_transform()
方法。

class smote(baseEstimator, TransformerMixin):    def fit(self, X, y=None):        print(X.shape, ' ', type(X)) # (57, 28)   <class 'numpy.ndarray'>        print(len(y), ' ', type)     #    57      <class 'list'>        self.smote = SMOTE(kind='regular', n_jobs=-1).fit(X, y)        return self    def fit_transform(self, X, y=None):        self.fit(X, y)        return self.smote.sample(X, y)    def transform(self, X):        return X

说明:在火车数据(即何时

pipeline.fit()
调用)上,管道将首先尝试调用
fit_transform()
内部对象。如果找不到,它将分别调用
fit()
transform()

在测试数据上,

transform()
每个内部对象仅调用,因此此处提供的测试数据不应更改。

更新
:上面的代码仍将引发错误。您会看到,当对提供的数据进行过度采样时,其中的采样数会发生变化,

X
并且
y
两者都会发生变化。但是管道只会对
X
数据起作用。它不会改变
y
。因此,如果我纠正上述错误,您将得到关于标签不匹配样本的错误。如果偶然地,所生成的样本等于先前的样本,那么这些
y
值也将不对应于新的样本。

工作解决方案 :愚蠢的我。

您可以只使用imblearn包中的Pipeline代替scikit-learn
Pipeline。它会自动注意

re-sample
何时
fit()
在管道上调用,并且不会对测试数据进行重新采样(调用
transform()
或时
predict()
)。

实际上,我知道imblearn.Pipeline处理

sample()
方法,但是当您实现自定义类并说测试数据不得更改时就被抛出了。我没有想到这就是默认行为。

只需更换

from sklearn.pipeline import Pipeline

from imblearn.pipeline import Pipeline

你们都准备好了。无需像您一样进行自定义类。只需使用原始的SMOTE。就像是:

random_state = 38model = Pipeline([        ('posFeat1', featureVECTOR()),        ('sca1', StandardScaler()),        # Original SMOTE class        ('smote', SMOTE(random_state=random_state)),        ('classification', SGDClassifier(loss='hinge', max_iter=1, random_state=random_state, tol=None))    ])


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/669543.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号