PySpark中StandardScaler标准化测试集时调用transform方法报错的解决
报错根源
PySpark ML 模块中的StandardScaler属于估计器(Estimator)类,仅用于定义标准化规则(输入列、输出列、是否除以标准差/减去均值等配置),本身没有实现transform方法。
只有当你调用.fit()方法在训练集上完成统计量计算(得到所有特征的均值、标准差)后,返回的StandardScalerModel才是持有具体转换逻辑、可以调用transform方法处理数据的转换器对象。
你之前的链式写法scaledTrainDF = scaler.fit(x_train).transform(x_train)对训练集转换是正常的,因为链式调用里fit返回的模型被直接用来转换训练集了,但这个模型对象没有被持久化保存。后续你单独写scaledTestDF = scaler.transform(x_test)时,操作的还是最开始只做了配置、没有做任何拟合的估计器实例,自然会触发“当前对象不存在transform方法”的报错。
正确实现逻辑
- 初始化
StandardScaler时仅定义列映射规则,这一步和之前的写法没有区别 - 调用训练集完成拟合后,将返回的训练好的模型对象单独存为变量
- 用这个同一个模型对象,分别对训练集、测试集执行转换
对应的可运行代码如下:
from pyspark.ml.feature import StandardScaler # 定义标准化规则 scaler = StandardScaler(inputCol="inputs", outputCol="scaled_features") # 仅在训练集上拟合,保存训练好的模型实例(带transform方法) scaler_model = scaler.fit(x_train) # 用统一模型分别转换训练、测试数据集 scaledTrainDF = scaler_model.transform(x_train) scaledTestDF = scaler_model.transform(x_test)
这种写法完全符合“仅在训练集上拟合一次,再复用模型参数转换测试集”的要求,全程没有把测试集数据暴露给拟合过程,不存在数据泄露问题。
内容的提问来源于stack exchange,提问作者williamscathy825
相关产品推荐
相关产品推荐

