class 中的 Sklearn 方法
Sklearn method in class
我想创建一个使用 sklearn
转换方法的 class。我找到了这个 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)
如果我在 class.
中使用它实际上是 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'
解决您的错误
在你的代码中你有:
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
class。它只会连续调用这两个函数。
获得预期结果
您的转换器正在查看数据集的每一列,并在 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. ]]
我想创建一个使用 sklearn
转换方法的 class。我找到了这个 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)
如果我在 class.
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'
解决您的错误
在你的代码中你有:
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
class。它只会连续调用这两个函数。
获得预期结果
您的转换器正在查看数据集的每一列,并在 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. ]]