【发布时间】:2019-01-03 07:06:06
【问题描述】:
我想创建一个使用sklearn 转换方法的类。我找到了这个article,并以它为例。
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. ]])
我觉得我在这里混合了一些东西,但我不知道是什么。
更新 我做了一些修改:
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'
【问题讨论】:
-
首先,您没有在
fit()中使用缩放器。其次,您没有在transform()中使用scaler().transform()。 -
@VivekKumar 感谢您的回复。能不能多给我一点启发?
-
从
transform()你返回self.scaler(X),它等于minmax(X),但是函数minmax不要在任何地方使用输入(X或dataframe),并返回最小最大缩放器。这就是你得到的。 -
谁能帮我解决这个问题?
-
@DimKoim 下面的答案对你有帮助吗?
标签: python-3.x oop scikit-learn sklearn-pandas