自定义preprocessing函数报无StandardScaler属性错误如何解决
问题原因
代码共存在两处核心问题,其中一处直接触发当前报错,另一处是修复首个问题后会触发的隐藏bug:
- 命名冲突:你自定义的函数名是
preprocessing,函数内部写preprocessing.StandardScaler()时,Python会优先匹配当前作用域下你自定义的这个函数对象,不会指向sklearn的preprocessing模块,函数对象不存在StandardScaler属性,因此抛出AttributeError。 - 方法名拼写错误:代码中写的
fit_transfrom为错误拼写,缩放器对应的正确方法名是fit_transform。 - 额外问题:原代码缺失sklearn相关依赖的导入语句。
修复方法
最稳妥的方案是直接导入需要的缩放器类,从根源避开模块名和自定义函数重名的冲突,同时修正拼写错误、补全导入语句,修复后完整代码如下:
# 补全依赖导入 import pandas as pd from sklearn.preprocessing import StandardScaler # 直接导入类即可完全避开命名冲突,也可以把函数名改成其他名字比如df_preprocessing进一步降低冲突风险 def preprocessing(df:pd.DataFrame,scaler:str): not_uv=[] for column in df.columns: if column != 'uv': # uv为目标列,不做标准化 not_uv.append(column) if scaler == 'standard': standard_scaler = StandardScaler() # 修正fit_transform的拼写错误 standard_df = pd.DataFrame(standard_scaler.fit_transform(df[not_uv]), columns = not_uv) standard_df = pd.concat([standard_df,df[['uv']]],axis=1) return standard_df
修复后原有调用逻辑可以正常运行:
preprocessing(df_13,'standard')
如果你更习惯通过模块路径调用类,也可以在导入时给sklearn的preprocessing模块起别名,避免和自定义函数重名,示例导入写法:
from sklearn import preprocessing as sk_prep # 实例化缩放器时写sk_prep.StandardScaler()即可
内容的提问来源于stack exchange,提问作者형한결
相关产品推荐
相关产品推荐

