Pickle自定义对象

2024-09-25 18:26:39 发布

您现在位置:Python中文网/ 问答频道 /正文

以下代码:

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

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

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

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

array([[1, 0],
       [0, 1],
       [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_变换,whitch提出了一个技巧,但现在不可能使用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'

那么,我们如何处理自定义对象呢


Tags: theselfconvertdefnptransformsklearnarray