我想创建一个使用sklearn转换方法的类。我找到了这个文章,我正在用它作为一个例子。
from sklearn import preprocessing
from sklearn.base import TransformerMixin
def minmax(dataframe):
minmax_transformer = preprocessing.MinMaxScaler()
return minmax_tranformer
class FunctionFeaturizer(TransformerMixin):
def __init__(self, scaler):
self.scaler = scaler
def fit(self, X, y=None):
return self
def transform(self, X):
fv = self.scaler(X)
return fv
if __name__=="__main__":
scaling = FunctionFeaturizer(minmax)
df = pd.DataFrame({'feature': np.arange(10)})
df_scaled = scaling.fit(df).transform(df)
print(df_scaled) 输出是StandardScaler(copy=True, with_mean=True, with_std=True),这实际上是preprocessing.StandardScaler().fit(df)的结果,如果我将它用于类之外的话。
我期待的是:
array([[0. ],
[0.11111111],
[0.22222222],
[0.33333333],
[0.44444444],
[0.55555556],
[0.66666667],
[0.77777778],
[0.88888889],
[1. ]])我觉得我在这里混了几样东西,但我不知道是什么。
Update I做了一些修改:
def minmax():
return preprocessing.MinMaxScaler()
class FunctionFeaturizer(TransformerMixin):
def __init__(self, scaler):
self.scaler = scaler
def fit(self, X, y=None):
return self
def fit_transform(self, X):
self.scaler.fit(X)
return self.scaler.transform(X)
if __name__=="__main__":
scaling = FunctionFeaturizer(minmax)
df = pd.DataFrame({'feature': np.arange(10)})
df_scaled = scaling.fit_transform(df)
print(df_scaled) 但现在我收到了以下错误:
Traceback (most recent call last):
File "C:/my_file.py", line 33, in <module>
test_scale = scaling.fit_transform(df)
File "C:/my_file.py", line 26, in fit_transform
self.scaler.fit(X)
AttributeError: 'function' object has no attribute 'fit'发布于 2018-07-27 18:24:57
解决你的错误
在您的代码中有:
if __name__=="__main__":
scaling = FunctionFeaturizer(minmax)
df = pd.DataFrame({'feature': np.arange(10)})
df_scaled = scaling.fit_transform(df)
print(df_scaled)换行
scaling = FunctionFeaturizer(minmax)至
scaling = FunctionFeaturizer(minmax())您需要调用该函数以获得返回给您的MinMaxScaler实例化。
建议
与其实现fit和fit_transform,不如实现fit和transform,除非您可以将这两个流程优化为fit_tranform。这样,你所做的事情就更清楚了。
如果您只实现fit和transform,则仍然可以调用fit_transform,因为您扩展了TransformerMixin类。它将在一行中调用这两个函数。
得到你的预期结果
您的转换器正在查看数据集中的每一列,并在0和1之间线性地分配值。
因此,要获得预期的结果,这将取决于您的df是什么样子。然而,你并没有和我们分享,所以很难判断你是否会得到它。
但是,如果您有df = [[0],[1],[2],[3],[4],[5],[6],[7],[8],[9]],您将看到预期的结果。
if __name__=="__main__":
scaling = FunctionFeaturizer(minmax())
df = [[0], [1], [2], [3], [4], [5], [6], [7], [8], [9]]
df_scaled = scaling.fit_transform(df)
print(df_scaled)
> [[0. ]
> [0.11111111]
> [0.22222222]
> [0.33333333]
> [0.44444444]
> [0.55555556]
> [0.66666667]
> [0.77777778]
> [0.88888889]
> [1. ]]https://stackoverflow.com/questions/51536227
复制相似问题