为什么我的自定义转换器不转换测试集?

时间:2019-07-24 09:20:40

标签: machine-learning scikit-learn

我正在尝试构建用于标准化代码的自定义转换器。如果我在训练集上使用fit_transform,它将正常工作,但是如果我在测试测试上应用了transform函数,它只会返回NaN。我已经在下面提到了代码。该代码的输入是一个熊猫数据框。假设一个随机的3 * 3数据帧,其整数值在(0,4)范围内。我的转换返回的输出是Nans数组,其中rows =通过的测试数据的行数,column =像这样遍地都是NaN的测试数据的列数的两倍

array([[nan, nan, nan, nan, nan, nan],
       [nan, nan, nan, nan, nan, nan],
       [nan, nan, nan, nan, nan, nan]])

这是我的自定义转换器代码:

from sklearn.base import TransformerMixin, BaseEstimator

class smooth_score(TransformerMixin):

    def __init__(self):
        pass


    def fit(self, X, y=None):
        self.mean = np.mean(X)
        self.std = np.std(X)
        return self


    def transform(self, X):
        X = (X - self.mean) / self.std
        return np.array(X)

1 个答案:

答案 0 :(得分:0)

这是您代码的修改版本:

import pandas as pd
import numpy as np
from sklearn.base import TransformerMixin

class smooth_score(TransformerMixin):

    def __init__(self):
        pass


    def fit(self, X, y=None):
        self.mean = np.mean(X, axis=(0, 1))
        self.std = np.std(X, axis=(0, 1))
        return self


    def transform(self, X):
        X = (X - self.mean) / self.std
        return X

df = pd.DataFrame([[1, 2, 3], [4, 5, 6], [7, 8, 9]])

tf.fit(df.values)
new = tf.transform(df.values)

其中new是:

array([[-1.54919334, -1.161895  , -0.77459667],
       [-0.38729833,  0.        ,  0.38729833],
       [ 0.77459667,  1.161895  ,  1.54919334]])
  1. np.std()np.mean()每个轴工作,因此,如果要计算所有轴上的轴(即获取单个数字,而不是一维矢量),则需要指定所有轴-因此axis=(0, 1)参数。这应该可以解决您的尺寸问题。

  2. np.std()np.mean()不适用于熊猫数据,因此df.values会获得基础的numpy数组。另外,您可以使用X.mean().mean()X.std().std(),其中X是熊猫数据帧(双mean()std()不是错误!)

  3. 我会检查self.std == 0,这也会给您NaN