Pickle 自定义对象

问题描述

以下代码

from sklearn.preprocessing import LabelBinarizer
lb = LabelBinarizer()
lb.fit_transform(['yes','no','yes'])

返回二进制类的向量,如此处所述http://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.LabelBinarizer.html

array([[1],[0],[1]])

虽然二进制类的理想情况是(如 MultiLabelBinarizer):

array([[1,0],[0,1],[1,0]])

使用@applecider 中的以下类 sklearn LabelBinarizer returns vector when there are 2 classes

import numpy as np
from sklearn.preprocessing import LabelBinarizer


class LabelBinarizer2:

    def __init__(self):
        self.lb = LabelBinarizer()

    def fit(self,X):
        # Convert X to array
        X = np.array(X)
        # Fit X using the LabelBinarizer object
        self.lb.fit(X)
        # Save the classes
        self.classes_ = self.lb.classes_

    def fit_transform(self,X):
        # Convert X to array
        X = np.array(X)
        # Fit + transform X using the LabelBinarizer object
        Xlb = self.lb.fit_transform(X)
        # Save the classes
        self.classes_ = self.lb.classes_
        if len(self.classes_) == 2:
            Xlb = np.hstack((Xlb,1 - Xlb))
        return Xlb

    def transform(self,X):
        # Convert X to array
        X = np.array(X)
        # Transform X using the LabelBinarizer object
        Xlb = self.lb.transform(X)
        if len(self.classes_) == 2:
            Xlb = np.hstack((Xlb,1 - Xlb))
        return Xlb

    def inverse_transform(self,Xlb):
        # Convert Xlb to array
        Xlb = np.array(Xlb)
        if len(self.classes_) == 2:
            X = self.lb.inverse_transform(Xlb[:,0])
        else:
            X = self.lb.inverse_transform(Xlb)
        return X

然后,我对数据进行 fit_transform,这可以解决问题,但现在无法使用 pickle 并存储它,以便稍后加载编码器进行转换并将其用于测试数据。

encoder_leadsourcecode = preprocessing.MultiLabelBinarizer()
feature_leadsourcecode = encoder_leadsourcecode.fit_transform(df["Lead Source Code"])
feature_leadsourcecode = pd.DataFrame(feature_leadsourcecode,columns=encoder_leadsourcecode.classes_)

什么时候,我尝试腌制它:

LeadSourceCodeEnc = pk.dumps(encoder_leadsourcecode)

我得到以下信息:

AttributeError: Can't pickle local object 'transform.<locals>.LabelBinarizer2'

那么我们如何腌制自定义对象?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)