数值化
import org.apache.spark.ml.feature.{OneHotEncoder, StringIndexer, VectorAssembler}
import org.apache.spark.sql.types._
//把grade这一列数值化
val indexer = new StringIndexer()
.setInputCol("grade")
.setOutputCol("gradeIndex")
.fit(dffull)
val indexed = indexer.transform(dffull)
//对grade这列进行 有效位编码
val encoder = new OneHotEncoder()
.setInputCol("gradeIndex")
.setOutputCol("gradeVec")
val encoded = encoder.transform(indexed).drop("grade").drop("gradeIndex")
// 将其他列组合
val assembler= new VectorAssembler()
.setinputCols(Array("X","c_idx","c idxvec"))
.setOutputCol("features”)
val vecDF: DataFrame = assembler.transform(fe)
首先创建对象 StringIndexer 然后输入列名与转化后的列名。
然后进行transform。转化后的结果采用libsvm格式存储在列表中。
然后通过VectorAssembler将其他列进行组合。
对于需要删除已经做过转化的列,采用drop(),一次只能删除一个列。
参考:
https://my.oschina.net/kyo4321/blog/2050708
https://cloud.tencent.com/developer/article/1021585
对于one hot编码首先需要将数据数值化,然后把将数值进行onehot
所有的操作都是对dataframe来进行的,参看如何RDD转换dataframe