如何基于StandardScaler构建仅缩放连续变量的自定义缩放器并修复运行报错
错误分析
- 缺少依赖包导入:代码中使用了
numpy(别名np)、pandas(别名pd),但开头没有对应的导入语句,运行时会触发名称未定义报错。 - 待缩放列参数传递错误:你通过
continuous = df.iloc[:, np.r_[0,2,10:13]]获取的是对应列的实际数据切片,不是列名列表,而CustomScaler的columns入参需要接收要缩放的列名,调用X[self.columns]时会因为索引不存在触发KeyError。 - StandardScaler初始化参数写法不规范:直接用位置参数传递
copy、with_mean、with_std,如果sklearn版本迭代调整参数顺序会触发报错,建议用关键字参数传递。 - 多余的属性赋值:
fit方法中自行计算mean_和var_是多余操作,StandardScaler实例本身已经存储了mean_、var_属性,无需重复计算。 - 存在数据错位隐患:原始
transform方法生成缩放后DataFrame时没有保留原始索引,后续合并非缩放列时可能出现行对应错误。
符合需求的自定义缩放器实现
首先修正自定义缩放器的代码:
import pandas as pd import numpy as np from sklearn.base import BaseEstimator, TransformerMixin from sklearn.preprocessing import StandardScaler class CustomScaler(BaseEstimator,TransformerMixin): def __init__(self, columns, copy=True, with_mean=True, with_std=True): # 用关键字参数初始化StandardScaler,避免版本兼容问题 self.scaler = StandardScaler(copy=copy, with_mean=with_mean, with_std=with_std) self.columns = columns def fit(self, X, y=None): # 仅对指定列拟合缩放规则 self.scaler.fit(X[self.columns], y) # 复用StandardScaler已计算的统计量,无需重复运算 self.mean_ = self.scaler.mean_ self.var_ = self.scaler.var_ 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, index=X.index) # 提取不需要缩放的列 X_not_scaled = X.loc[:, ~X.columns.isin(self.columns)] # 合并两部分数据后按原始列顺序返回 return pd.concat([X_not_scaled, X_scaled], axis=1)[init_col_order]
调用时修正待缩放列的取值逻辑:
# 假设new_df_upsampled为你已经完成重采样的数据集 X = new_df_upsampled.copy() X.drop('income', axis=1, inplace=True) # 修正:获取连续变量的列名,而非数据切片 columns_to_scale = df.columns[np.r_[0,2,10:13]] scaler = CustomScaler(columns_to_scale) # 拟合缩放规则 scaler.fit(X) # 如需完成缩放可调用 scaler.transform(X)
内容的提问来源于stack exchange,提问作者Hoang Cuong Nguyen
相关产品推荐
相关产品推荐

