PySpark执行OneHotEncoder时出现__init__()获意外关键字参数outputCols报错
错误原因
- PySpark版本不兼容:你使用的PySpark版本低于3.0,该版本中
OneHotEncoder仅支持单列处理,初始化仅接受单数形式的inputCol、outputCol参数,不存在你代码中使用的复数形式inputCols、outputCols参数,因此触发参数不识别的TypeError。 - 列名拼写错误:构造
assemblerInputs时使用了classVsc后缀,但OneHotEncoder定义的输出后缀为classVec,后续运行会报特征列不存在的错误 - 流水线阶段重复添加:标签编码、特征拼接的逻辑写在了分类列遍历的for循环内部,每遍历一个分类列就会重复添加一次对应阶段,会导致流水线逻辑异常。
解决方法
方案1:适配PySpark <3.0版本(修改参数写法+调整代码逻辑)
修正后的完整代码如下:
stages = [] for categoricalCol in categoricalColumns: stringIndexer = StringIndexer( inputCol=categoricalCol, outputCol=categoricalCol + "Index" ) # 替换为单数形式的inputCol、outputCol参数,去掉数组包裹 encoder = OneHotEncoder( inputCol=stringIndexer.getOutputCol(), outputCol=categoricalCol + "classVec", ) stages += [stringIndexer, encoder] # 以下逻辑移到for循环外部,避免重复添加 label_stringIdx = StringIndexer(inputCol="Status", outputCol="label") stages += [label_stringIdx] # 修正拼写错误,把classVsc改为classVec assemblerInputs = [c + "classVec" for c in categoricalColumns] + numericColumns assembler = VectorAssembler(inputCols=assemblerInputs, outputCol="features") stages += [assembler]
方案2:如果使用PySpark >=3.0版本
可以利用多列处理特性简化代码,不需要遍历每个分类列:
from pyspark.ml.feature import OneHotEncoder stages = [] # 批量对所有分类列做索引编码 stringIndexer = StringIndexer( inputCols=categoricalColumns, outputCols=[c + "Index" for c in categoricalColumns] ) # 批量做独热编码 encoder = OneHotEncoder( inputCols=stringIndexer.getOutputCols(), outputCols=[c + "classVec" for c in categoricalColumns] ) stages += [stringIndexer, encoder] label_stringIdx = StringIndexer(inputCol="Status", outputCol="label") stages += [label_stringIdx] assemblerInputs = [c + "classVec" for c in categoricalColumns] + numericColumns assembler = VectorAssembler(inputCols=assemblerInputs, outputCol="features") stages += [assembler]
内容的提问来源于stack exchange,提问作者Snehith Raju
相关产品推荐
相关产品推荐

