You need to enable JavaScript to run this app. 如何基于StandardScaler构建仅缩放连续变量的自定义缩放器并修复运行报错
优惠活动
大模型
产品
解决方案
定价
更多

如何基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.08 04:51:03