我正在尝试构建用于标准化代码的自定义转换器。如果我在训练集上使用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)
答案 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]])
np.std()
和np.mean()
每个轴工作,因此,如果要计算所有轴上的轴(即获取单个数字,而不是一维矢量),则需要指定所有轴-因此axis=(0, 1)
参数。这应该可以解决您的尺寸问题。
np.std()
和np.mean()
不适用于熊猫数据,因此df.values
会获得基础的numpy数组。另外,您可以使用X.mean().mean()
和X.std().std()
,其中X
是熊猫数据帧(双mean()
和std()
不是错误!)
我会检查self.std == 0
,这也会给您NaN
的