我正在尝试构建一个自定义缩放器,用于缩放数据集中的连续变量(美国成人收入数据集:https://www.kaggle.com/uciml/adult-census-income),以StandardScaler为基础。以下是我使用的Python代码:
from sklearn.base import BaseEstimator, TransformerMixinfrom sklearn.preprocessing import StandardScalerclass CustomScaler(BaseEstimator,TransformerMixin): def __init__(self,columns,copy=True,with_mean=True,with_std=True): self.scaler = StandardScaler(copy,with_mean,with_std) self.columns = columns self.mean_ = None self.var_ = None def fit(self, X, y=None): self.scaler.fit(X[self.columns], y) self.mean_ = np.mean(X[self.columns]) self.var_ = np.var(X[self.columns]) return self def transform(self, X, y=None, copy=None): init_col_order = X.columns X_scaled = pd.DataFrame(self.scaler.transform(X[self.columns]), columns=self.columns) X_not_scaled = X.loc[:,~X.columns.isin(self.columns)] return pd.concat([X_not_scaled, X_scaled], axis=1)[init_col_order]X=new_df_upsampled.copy()X.drop('income',axis=1,inplace=True)continuous = df.iloc[:, np.r_[0,2,10:13]] #basically independent variables that I consider continuouscolumns_to_scale = continuousscaler = CustomScaler(columns_to_scale)scaler.fit(X)
那么,我在构建缩放器时遇到了什么错误?此外,您如何为这个数据集构建一个自定义缩放器?
谢谢!
回答:
我同意@AntoineDubuis的观点,ColumnTransformer
是一种更好的(内置的)方法来实现这个功能。尽管如此,我想指出你的代码中出现的问题。
在fit
中,你有self.scaler.fit(X[self.columns], y)
;这表明self.columns
应该是一个列名列表(或其他几种选择)。但你定义的参数是continuous = df.iloc[:, np.r_[0,2,10:13]]
,这是一个数据框。
还有几个其他问题:
- 你应该只在
__init__
中设置来自其签名的属性,否则克隆将失败。将self.scaler
移到fit
中,并在__init__
中直接保存其参数copy
等。不要初始化mean_
或var_
。 - 你从未实际使用
mean_
或var_
。如果你想保留它们可以,但相关统计数据已经存储在缩放器对象中。