二十种特征变换方法及SparkMLlib调用实例(Scala/Java/python)(二)算法介绍:VectorIndexer解决数据集中的类别特征Vector。它可以自动识别哪些特征是类别型的,并且将原始值转换为类别指标。它的处理流程如下:1.获得一个向量类型的输入以及maxCategories参数。2.基于原始数值识别哪些特征需要被类别化,其中最多maxCategories需要被类别化。3.对于每一个类别特征计算0-based类别指标。4.对类别特征进行索引然后将原始值转换为指标。索引后的类别特征可以帮助决策树等算法处理类别型特征,并得到较好结果。在下面的例子中,我们读入一个数据集,然后使用VectorIndexer来决定哪些特征需要被作为非数值类型处理,将非数值型特征转换为他们的索引。调用示例:Scala:[plain]viewplaincopyimportorg.apache.spark.ml.feature.VectorIndexervaldata=spark.read.format(libsvm).load(data/mllib/sample_libsvm_data.txt)valindexer=newVectorIndexer().setInputCol(features).setOutputCol(indexed).setMaxCategories(10)valindexerModel=indexer.fit(data)valcategoricalFeatures:Set[Int]=indexerModel.categoryMaps.keys.toSetprintln(sChose${categoricalFeatures.size}categoricalfeatures:+categoricalFeatures.mkString(,))//CreatenewcolumnindexedwithcategoricalvaluestransformedtoindicesvalindexedData=indexerModel.transform(data)indexedData.show()Java:[java]viewplaincopyimportjava.util.Map;importorg.apache.spark.ml.feature.VectorIndexer;importorg.apache.spark.ml.feature.VectorIndexerModel;importorg.apache.spark.sql.Dataset;importorg.apache.spark.sql.Row;DatasetRowdata=spark.read().format(libsvm).load(data/mllib/sample_libsvm_data.txt);VectorIndexerindexer=newVectorIndexer().setInputCol(features).setOutputCol(indexed).setMaxCategories(10);VectorIndexerModelindexerModel=indexer.fit(data);MapInteger,MapDouble,IntegercategoryMaps=indexerModel.javaCategoryMaps();System.out.print(Chose+categoryMaps.size()+categoricalfeatures:);for(Integerfeature:categoryMaps.keySet()){System.out.print(+feature);}System.out.println();//CreatenewcolumnindexedwithcategoricalvaluestransformedtoindicesDatasetRowindexedData=indexerModel.transform(data);indexedData.show();Python:[python]viewplaincopyfrompyspark.ml.featureimportVectorIndexerdata=spark.read.format(libsvm).load(data/mllib/sample_libsvm_data.txt)indexer=VectorIndexer(inputCol=features,outputCol=indexed,maxCategories=10)indexerModel=indexer.fit(data)#CreatenewcolumnindexedwithcategoricalvaluestransformedtoindicesindexedData=indexerModel.transform(data)indexedData.show()Normalizer(正则化)算法介绍:Normalizer是一个转换器,它可以将多行向量输入转化为统一的形式。参数为p(默认值:2)来指定正则化中使用的p-norm。正则化操作可以使输入数据标准化并提高后期学习算法的效果。下面的例子展示如何读入一个libsvm格式的数据,然后将每一行转换为以及形式。调用示例:Scala:[plain]viewplaincopyimportorg.apache.spark.ml.feature.NormalizervaldataFrame=spark.read.format(libsvm).load(data/mllib/sample_libsvm_data.txt)//NormalizeeachVectorusing$L^1$norm.valnormalizer=newNormalizer().setInputCol(features).setOutputCol(normFeatures).setP(1.0)vall1NormData=normalizer.transform(dataFrame)l1NormData.show()//NormalizeeachVectorusing$L^\infty$norm.vallInfNormData=normalizer.transform(dataFrame,normalizer.p-Double.PositiveInfinity)lInfNormData.show()Java:[java]viewplaincopyimportorg.apache.spark.ml.feature.Normalizer;importorg.apache.spark.sql.Dataset;importorg.apache.spark.sql.Row;DatasetRowdataFrame=spark.read().format(libsvm).load(data/mllib/sample_libsvm_data.txt);//NormalizeeachVectorusing$L^1$norm.Normalizernormalizer=newNormalizer().setInputCol(features).setOutputCol(normFeatures).setP(1.0);DatasetRowl1NormData=normalizer.transform(dataFrame);l1NormData.show();//NormalizeeachVectorusing$L^\infty$norm.DatasetRowlInfNormData=normalizer.transform(dataFrame,normalizer.p().w(Double.POSITIVE_INFINITY));lInfNormData.show();Python:[python]viewplaincopyfrompyspark.ml.featureimportNormalizerdataFrame=spark.read.format(libsvm).load(data/mllib/sample_libsvm_data.txt)#NormalizeeachVectorusing$L^1$norm.normalizer=Normalizer(inputCol=features,outputCol=normFeatures,p=1.0)l1NormData=normalizer.transform(dataFrame)l1NormData.show()#NormalizeeachVectorusing$L^\infty$norm.lInfNormData=normalizer.transform(dataFrame,{normalizer.p:float(inf)})lInfNormData.show()StandardScaler算法介绍:StandardScaler处理Vector数据,标准化每个特征使得其有统一的标准差以及(或者)均值为零。它需要如下参数:1.withStd:默认值为真,使用统一标准差方式。2.withMean:默认为假。此种方法将产出一个稠密输出,所以不适用于稀疏输入。StandardScaler是一个Estimator,它可以fit数据集产生一个StandardScalerModel,用来计算汇总统计。然后产生的模可以用来转换向量至统一的标准差以及(或者)零均值特征。注意如果特征的标准差为零,则该特征在向量中返回的默认值为0.0。下面的示例展示如果读入一个libsvm形式的数据以及返回有统一标准差的标准化特征。调用示例:Scala:[plain]viewplaincopyimportorg.apache.spark.ml.feature.StandardScalervaldataFrame=spark.read.format(libsvm).load(data/mllib/sample_libsvm_data.txt)valscaler=newStandardScaler().setInputCol(features).setOutputCol(scaledFeatures).setWithStd(true).setWithMean(false)//ComputesummarystatisticsbyfittingtheStandardScaler.valscalerModel=scaler.fit(dataFrame)//Normalizeeachfeaturetohaveunitstandarddeviation.valscaledData=scalerModel.transform(dataFrame)scaledData.show()Java:[java]viewplaincopyimportorg.apache.spark.ml.feature.StandardScaler;importorg.apache.spark.ml.feature.StandardScalerModel;importorg.apache.spark.sql.Dataset;importorg.apache.spark.sql.Row;DatasetRowdataFrame=spark.read().format(libsvm).load(data/mllib/sample_libsvm_data.txt);StandardScalerscaler=newStandardScaler().setInputCol(features).setOutputCol(scaledFeatures).setWithStd(true).setWithMean(false);//Computesummarystatisticsbyfi