二十種特徵變換方法及Spark MLlib調用實例(Scala/Java/python)(一)

Tokenizer(分詞器)

算法介紹:

        Tokenization將文本劃分爲獨立個體(通常爲單詞)。下面的例子展示瞭如何把句子劃分爲單詞。

        RegexTokenizer基於正則表達式提供更多的劃分選項。默認情況下,參數“pattern”爲劃分文本的分隔符。或者,用戶可以指定參數“gaps”來指明正則“patten”表示“tokens”而不是分隔符,這樣來爲分詞結果找到所有可能匹配的情況。

示例調用:

Scala:

[plain] view plain copy
  1. import org.apache.spark.ml.feature.{RegexTokenizer, Tokenizer}  
  2.   
  3. val sentenceDataFrame = spark.createDataFrame(Seq(  
  4.   (0, "Hi I heard about Spark"),  
  5.   (1, "I wish Java could use case classes"),  
  6.   (2, "Logistic,regression,models,are,neat")  
  7. )).toDF("label", "sentence")  
  8.   
  9. val tokenizer = new Tokenizer().setInputCol("sentence").setOutputCol("words")  
  10. val regexTokenizer = new RegexTokenizer()  
  11.   .setInputCol("sentence")  
  12.   .setOutputCol("words")  
  13.   .setPattern("\\W") // alternatively .setPattern("\\w+").setGaps(false)  
  14.   
  15. val tokenized = tokenizer.transform(sentenceDataFrame)  
  16. tokenized.select("words", "label").take(3).foreach(println)  
  17. val regexTokenized = regexTokenizer.transform(sentenceDataFrame)  
  18. regexTokenized.select("words", "label").take(3).foreach(println)  

Java:

[java] view plain copy
  1. import java.util.Arrays;  
  2. import java.util.List;  
  3.   
  4. import org.apache.spark.ml.feature.RegexTokenizer;  
  5. import org.apache.spark.ml.feature.Tokenizer;  
  6. import org.apache.spark.sql.Dataset;  
  7. import org.apache.spark.sql.Row;  
  8. import org.apache.spark.sql.RowFactory;  
  9. import org.apache.spark.sql.types.DataTypes;  
  10. import org.apache.spark.sql.types.Metadata;  
  11. import org.apache.spark.sql.types.StructField;  
  12. import org.apache.spark.sql.types.StructType;  
  13.   
  14. List<Row> data = Arrays.asList(  
  15.   RowFactory.create(0"Hi I heard about Spark"),  
  16.   RowFactory.create(1"I wish Java could use case classes"),  
  17.   RowFactory.create(2"Logistic,regression,models,are,neat")  
  18. );  
  19.   
  20. StructType schema = new StructType(new StructField[]{  
  21.   new StructField("label", DataTypes.IntegerType, false, Metadata.empty()),  
  22.   new StructField("sentence", DataTypes.StringType, false, Metadata.empty())  
  23. });  
  24.   
  25. Dataset<Row> sentenceDataFrame = spark.createDataFrame(data, schema);  
  26.   
  27. Tokenizer tokenizer = new Tokenizer().setInputCol("sentence").setOutputCol("words");  
  28.   
  29. Dataset<Row> wordsDataFrame = tokenizer.transform(sentenceDataFrame);  
  30. for (Row r : wordsDataFrame.select("words""label").takeAsList(3)) {  
  31.   java.util.List<String> words = r.getList(0);  
  32.   for (String word : words) System.out.print(word + " ");  
  33.   System.out.println();  
  34. }  
  35.   
  36. RegexTokenizer regexTokenizer = new RegexTokenizer()  
  37.   .setInputCol("sentence")  
  38.   .setOutputCol("words")  
  39.   .setPattern("\\W");  // alternatively .setPattern("\\w+").setGaps(false);  

Python:

[python] view plain copy
  1. from pyspark.ml.feature import Tokenizer, RegexTokenizer  
  2.   
  3. sentenceDataFrame = spark.createDataFrame([  
  4.     (0"Hi I heard about Spark"),  
  5.     (1"I wish Java could use case classes"),  
  6.     (2"Logistic,regression,models,are,neat")  
  7. ], ["label""sentence"])  
  8. tokenizer = Tokenizer(inputCol="sentence", outputCol="words")  
  9. wordsDataFrame = tokenizer.transform(sentenceDataFrame)  
  10. for words_label in wordsDataFrame.select("words""label").take(3):  
  11.     print(words_label)  
  12. regexTokenizer = RegexTokenizer(inputCol="sentence", outputCol="words", pattern="\\W")  
  13. # alternatively, pattern="\\w+", gaps(False)  

StopWordsRemover

算法介紹:

       停用詞爲在文檔中頻繁出現,但未承載太多意義的詞語,他們不應該被包含在算法輸入中。

       StopWordsRemover的輸入爲一系列字符串(如分詞器輸出),輸出中刪除了所有停用詞。停用詞表由stopWords參數提供。一些語言的默認停用詞表可以通過StopWordsRemover.loadDefaultStopWords(language)調用。布爾參數caseSensitive指明是否區分大小寫(默認爲否)。

示例:

假設我們有如下DataFrame,有id和raw兩列:

id | raw

----|----------

 0  | [I,saw, the, red, baloon]

 1  |[Mary, had, a, little, lamb]

通過對raw列調用StopWordsRemover,我們可以得到篩選出的結果列如下:

id | raw                         | filtered

----|-----------------------------|--------------------

 0  | [I,saw, the, red, baloon]  |  [saw, red, baloon]

 1  |[Mary, had, a, little, lamb]|[Mary, little, lamb]

其中,“I”, “the”, “had”以及“a”被移除。

示例調用:

Scala:

[plain] view plain copy
  1. import org.apache.spark.ml.feature.StopWordsRemover  
  2.   
  3. val remover = new StopWordsRemover()  
  4.   .setInputCol("raw")  
  5.   .setOutputCol("filtered")  
  6.   
  7. val dataSet = spark.createDataFrame(Seq(  
  8.   (0, Seq("I", "saw", "the", "red", "baloon")),  
  9.   (1, Seq("Mary", "had", "a", "little", "lamb"))  
  10. )).toDF("id", "raw")  
  11.   
  12. remover.transform(dataSet).show()  

Java:

[java] view plain copy
  1. import java.util.Arrays;  
  2. import java.util.List;  
  3.   
  4. import org.apache.spark.ml.feature.StopWordsRemover;  
  5. import org.apache.spark.sql.Dataset;  
  6. import org.apache.spark.sql.Row;  
  7. import org.apache.spark.sql.RowFactory;  
  8. import org.apache.spark.sql.types.DataTypes;  
  9. import org.apache.spark.sql.types.Metadata;  
  10. import org.apache.spark.sql.types.StructField;  
  11. import org.apache.spark.sql.types.StructType;  
  12.   
  13. StopWordsRemover remover = new StopWordsRemover()  
  14.   .setInputCol("raw")  
  15.   .setOutputCol("filtered");  
  16.   
  17. List<Row> data = Arrays.asList(  
  18.   RowFactory.create(Arrays.asList("I""saw""the""red""baloon")),  
  19.   RowFactory.create(Arrays.asList("Mary""had""a""little""lamb"))  
  20. );  
  21.   
  22. StructType schema = new StructType(new StructField[]{  
  23.   new StructField(  
  24.     "raw", DataTypes.createArrayType(DataTypes.StringType), false, Metadata.empty())  
  25. });  
  26.   
  27. Dataset<Row> dataset = spark.createDataFrame(data, schema);  
  28. remover.transform(dataset).show();  

Python:

[python] view plain copy
  1. from pyspark.ml.feature import StopWordsRemover  
  2.   
  3. sentenceData = spark.createDataFrame([  
  4.     (0, ["I""saw""the""red""baloon"]),  
  5.     (1, ["Mary""had""a""little""lamb"])  
  6. ], ["label""raw"])  
  7.   
  8. remover = StopWordsRemover(inputCol="raw", outputCol="filtered")  
  9. remover.transform(sentenceData).show(truncate=False)  

n-gram

算法介紹:

       一個n-gram是一個長度爲整數n的字序列。NGram可以用來將輸入轉換爲n-gram。

        NGram的輸入爲一系列字符串(如分詞器輸出)。參數n決定每個n-gram包含的對象個數。結果包含一系列n-gram,其中每個n-gram代表一個空格分割的n個連續字符。如果輸入少於n個字符串,將沒有輸出結果。

示例調用:

Scala:

[plain] view plain copy
  1. import org.apache.spark.ml.feature.NGram  
  2.   
  3. val wordDataFrame = spark.createDataFrame(Seq(  
  4.   (0, Array("Hi", "I", "heard", "about", "Spark")),  
  5.   (1, Array("I", "wish", "Java", "could", "use", "case", "classes")),  
  6.   (2, Array("Logistic", "regression", "models", "are", "neat"))  
  7. )).toDF("label", "words")  
  8.   
  9. val ngram = new NGram().setInputCol("words").setOutputCol("ngrams")  
  10. val ngramDataFrame = ngram.transform(wordDataFrame)  
  11. ngramDataFrame.take(3).map(_.getAs[Stream[String]]("ngrams").toList).foreach(println)  

Java:

[java] view plain copy
  1. import java.util.Arrays;  
  2. import java.util.List;  
  3.   
  4. import org.apache.spark.ml.feature.NGram;  
  5. import org.apache.spark.sql.Row;  
  6. import org.apache.spark.sql.RowFactory;  
  7. import org.apache.spark.sql.types.DataTypes;  
  8. import org.apache.spark.sql.types.Metadata;  
  9. import org.apache.spark.sql.types.StructField;  
  10. import org.apache.spark.sql.types.StructType;  
  11.   
  12. List<Row> data = Arrays.asList(  
  13.   RowFactory.create(0.0, Arrays.asList("Hi""I""heard""about""Spark")),  
  14.   RowFactory.create(1.0, Arrays.asList("I""wish""Java""could""use""case""classes")),  
  15.   RowFactory.create(2.0, Arrays.asList("Logistic""regression""models""are""neat"))  
  16. );  
  17.   
  18. StructType schema = new StructType(new StructField[]{  
  19.   new StructField("label", DataTypes.DoubleType, false, Metadata.empty()),  
  20.   new StructField(  
  21.     "words", DataTypes.createArrayType(DataTypes.StringType), false, Metadata.empty())  
  22. });  
  23.   
  24. Dataset<Row> wordDataFrame = spark.createDataFrame(data, schema);  
  25.   
  26. NGram ngramTransformer = new NGram().setInputCol("words").setOutputCol("ngrams");  
  27.   
  28. Dataset<Row> ngramDataFrame = ngramTransformer.transform(wordDataFrame);  
  29.   
  30. for (Row r : ngramDataFrame.select("ngrams""label").takeAsList(3)) {  
  31.   java.util.List<String> ngrams = r.getList(0);  
  32.   for (String ngram : ngrams) System.out.print(ngram + " --- ");  
  33.   System.out.println();  
  34. }  

Python:

[python] view plain copy
  1. from pyspark.ml.feature import NGram  
  2.   
  3. wordDataFrame = spark.createDataFrame([  
  4.     (0, ["Hi""I""heard""about""Spark"]),  
  5.     (1, ["I""wish""Java""could""use""case""classes"]),  
  6.     (2, ["Logistic""regression""models""are""neat"])  
  7. ], ["label""words"])  
  8. ngram = NGram(inputCol="words", outputCol="ngrams")  
  9. ngramDataFrame = ngram.transform(wordDataFrame)  
  10. for ngrams_label in ngramDataFrame.select("ngrams""label").take(3):  
  11.     print(ngrams_label)  

Binarizer

算法介紹:

       二值化是根據閥值將連續數值特徵轉換爲0-1特徵的過程。

       Binarizer參數有輸入、輸出以及閥值。特徵值大於閥值將映射爲1.0,特徵值小於等於閥值將映射爲0.0。

示例調用:

Scala:

[plain] view plain copy
  1. import org.apache.spark.ml.feature.Binarizer  
  2.   
  3. val data = Array((0, 0.1), (1, 0.8), (2, 0.2))  
  4. val dataFrame = spark.createDataFrame(data).toDF("label", "feature")  
  5.   
  6. val binarizer: Binarizer = new Binarizer()  
  7.   .setInputCol("feature")  
  8.   .setOutputCol("binarized_feature")  
  9.   .setThreshold(0.5)  
  10.   
  11. val binarizedDataFrame = binarizer.transform(dataFrame)  
  12. val binarizedFeatures = binarizedDataFrame.select("binarized_feature")  
  13. binarizedFeatures.collect().foreach(println)  

Java:

[java] view plain copy
  1. import java.util.Arrays;  
  2. import java.util.List;  
  3.   
  4. import org.apache.spark.ml.feature.Binarizer;  
  5. import org.apache.spark.sql.Row;  
  6. import org.apache.spark.sql.RowFactory;  
  7. import org.apache.spark.sql.types.DataTypes;  
  8. import org.apache.spark.sql.types.Metadata;  
  9. import org.apache.spark.sql.types.StructField;  
  10. import org.apache.spark.sql.types.StructType;  
  11.   
  12. List<Row> data = Arrays.asList(  
  13.   RowFactory.create(00.1),  
  14.   RowFactory.create(10.8),  
  15.   RowFactory.create(20.2)  
  16. );  
  17. StructType schema = new StructType(new StructField[]{  
  18.   new StructField("id", DataTypes.IntegerType, false, Metadata.empty()),  
  19.   new StructField("feature", DataTypes.DoubleType, false, Metadata.empty())  
  20. });  
  21. Dataset<Row> continuousDataFrame = spark.createDataFrame(data, schema);  
  22. Binarizer binarizer = new Binarizer()  
  23.   .setInputCol("feature")  
  24.   .setOutputCol("binarized_feature")  
  25.   .setThreshold(0.5);  
  26. Dataset<Row> binarizedDataFrame = binarizer.transform(continuousDataFrame);  
  27. Dataset<Row> binarizedFeatures = binarizedDataFrame.select("binarized_feature");  
  28. for (Row r : binarizedFeatures.collectAsList()) {  
  29.   Double binarized_value = r.getDouble(0);  
  30.   System.out.println(binarized_value);  
  31. }  

Python:

[python] view plain copy
  1. from pyspark.ml.feature import Binarizer  
  2.   
  3. continuousDataFrame = spark.createDataFrame([  
  4.     (00.1),  
  5.     (10.8),  
  6.     (20.2)  
  7. ], ["label""feature"])  
  8. binarizer = Binarizer(threshold=0.5, inputCol="feature", outputCol="binarized_feature")  
  9. binarizedDataFrame = binarizer.transform(continuousDataFrame)  
  10. binarizedFeatures = binarizedDataFrame.select("binarized_feature")  
  11. for binarized_feature, in binarizedFeatures.collect():  
  12.     print(binarized_feature)  

PCA

算法介紹:

        主成分分析是一種統計學方法,它使用正交轉換從一系列可能相關的變量中提取線性無關變量集,提取出的變量集中的元素稱爲主成分。使用PCA方法可以對變量集合進行降維。下面的示例將會展示如何將5維特徵向量轉換爲3維主成分向量。

示例調用:

Scala:

[plain] view plain copy
  1. import org.apache.spark.ml.feature.PCA  
  2. import org.apache.spark.ml.linalg.Vectors  
  3.   
  4. val data = Array(  
  5.   Vectors.sparse(5, Seq((1, 1.0), (3, 7.0))),  
  6.   Vectors.dense(2.0, 0.0, 3.0, 4.0, 5.0),  
  7.   Vectors.dense(4.0, 0.0, 0.0, 6.0, 7.0)  
  8. )  
  9. val df = spark.createDataFrame(data.map(Tuple1.apply)).toDF("features")  
  10. val pca = new PCA()  
  11.   .setInputCol("features")  
  12.   .setOutputCol("pcaFeatures")  
  13.   .setK(3)  
  14.   .fit(df)  
  15. val pcaDF = pca.transform(df)  
  16. val result = pcaDF.select("pcaFeatures")  
  17. result.show()  

Java:

[java] view plain copy
  1. import java.util.Arrays;  
  2. import java.util.List;  
  3.   
  4. import org.apache.spark.ml.feature.PCA;  
  5. import org.apache.spark.ml.feature.PCAModel;  
  6. import org.apache.spark.ml.linalg.VectorUDT;  
  7. import org.apache.spark.ml.linalg.Vectors;  
  8. import org.apache.spark.sql.Dataset;  
  9. import org.apache.spark.sql.Row;  
  10. import org.apache.spark.sql.RowFactory;  
  11. import org.apache.spark.sql.types.Metadata;  
  12. import org.apache.spark.sql.types.StructField;  
  13. import org.apache.spark.sql.types.StructType;  
  14.   
  15. List<Row> data = Arrays.asList(  
  16.   RowFactory.create(Vectors.sparse(5new int[]{13}, new double[]{1.07.0})),  
  17.   RowFactory.create(Vectors.dense(2.00.03.04.05.0)),  
  18.   RowFactory.create(Vectors.dense(4.00.00.06.07.0))  
  19. );  
  20.   
  21. StructType schema = new StructType(new StructField[]{  
  22.   new StructField("features"new VectorUDT(), false, Metadata.empty()),  
  23. });  
  24.   
  25. Dataset<Row> df = spark.createDataFrame(data, schema);  
  26.   
  27. PCAModel pca = new PCA()  
  28.   .setInputCol("features")  
  29.   .setOutputCol("pcaFeatures")  
  30.   .setK(3)  
  31.   .fit(df);  
  32.   
  33. Dataset<Row> result = pca.transform(df).select("pcaFeatures");  
  34. result.show();  

Python:

[python] view plain copy
  1. from pyspark.ml.feature import PCA  
  2. from pyspark.ml.linalg import Vectors  
  3.   
  4. data = [(Vectors.sparse(5, [(11.0), (37.0)]),),  
  5.         (Vectors.dense([2.00.03.04.05.0]),),  
  6.         (Vectors.dense([4.00.00.06.07.0]),)]  
  7. df = spark.createDataFrame(data, ["features"])  
  8. pca = PCA(k=3, inputCol="features", outputCol="pcaFeatures")  
  9. model = pca.fit(df)  
  10. result = model.transform(df).select("pcaFeatures")  
  11. result.show(truncate=False)  

PolynomialExpansion

算法介紹:

       多項式擴展通過產生n維組合將原始特徵將特徵擴展到多項式空間。下面的示例會介紹如何將你的特徵集拓展到3維多項式空間。

示例調用:

Scala:

[plain] view plain copy
  1. import org.apache.spark.ml.feature.PolynomialExpansion  
  2. import org.apache.spark.ml.linalg.Vectors  
  3.   
  4. val data = Array(  
  5.   Vectors.dense(-2.0, 2.3),  
  6.   Vectors.dense(0.0, 0.0),  
  7.   Vectors.dense(0.6, -1.1)  
  8. )  
  9. val df = spark.createDataFrame(data.map(Tuple1.apply)).toDF("features")  
  10. val polynomialExpansion = new PolynomialExpansion()  
  11.   .setInputCol("features")  
  12.   .setOutputCol("polyFeatures")  
  13.   .setDegree(3)  
  14. val polyDF = polynomialExpansion.transform(df)  
  15. polyDF.select("polyFeatures").take(3).foreach(println)  

Java:

[java] view plain copy
  1. import java.util.Arrays;  
  2. import java.util.List;  
  3.   
  4. import org.apache.spark.ml.feature.PolynomialExpansion;  
  5. import org.apache.spark.ml.linalg.VectorUDT;  
  6. import org.apache.spark.ml.linalg.Vectors;  
  7. import org.apache.spark.sql.Dataset;  
  8. import org.apache.spark.sql.Row;  
  9. import org.apache.spark.sql.RowFactory;  
  10. import org.apache.spark.sql.types.Metadata;  
  11. import org.apache.spark.sql.types.StructField;  
  12. import org.apache.spark.sql.types.StructType;  
  13.   
  14. PolynomialExpansion polyExpansion = new PolynomialExpansion()  
  15.   .setInputCol("features")  
  16.   .setOutputCol("polyFeatures")  
  17.   .setDegree(3);  
  18.   
  19. List<Row> data = Arrays.asList(  
  20.   RowFactory.create(Vectors.dense(-2.02.3)),  
  21.   RowFactory.create(Vectors.dense(0.00.0)),  
  22.   RowFactory.create(Vectors.dense(0.6, -1.1))  
  23. );  
  24.   
  25. StructType schema = new StructType(new StructField[]{  
  26.   new StructField("features"new VectorUDT(), false, Metadata.empty()),  
  27. });  
  28.   
  29. Dataset<Row> df = spark.createDataFrame(data, schema);  
  30. Dataset<Row> polyDF = polyExpansion.transform(df);  
  31.   
  32. List<Row> rows = polyDF.select("polyFeatures").takeAsList(3);  
  33. for (Row r : rows) {  
  34.   System.out.println(r.get(0));  
  35. }  

Python:

[python] view plain copy
  1. from pyspark.ml.feature import PolynomialExpansion  
  2. from pyspark.ml.linalg import Vectors  
  3.   
  4. df = spark\  
  5.     .createDataFrame([(Vectors.dense([-2.02.3]),),  
  6.                       (Vectors.dense([0.00.0]),),  
  7.                       (Vectors.dense([0.6, -1.1]),)],  
  8.                      ["features"])  
  9. px = PolynomialExpansion(degree=3, inputCol="features", outputCol="polyFeatures")  
  10. polyDF = px.transform(df)  
  11. for expanded in polyDF.select("polyFeatures").take(3):  
  12.     print(expanded)  

Discrete Cosine Transform(DCT)

算法介紹:

       離散餘弦變換是與傅里葉變換相關的一種變換,它類似於離散傅立葉變換但是隻使用實數。離散餘弦變換相當於一個長度大概是它兩倍的離散傅里葉變換,這個離散傅里葉變換是對一個實偶函數進行的(因爲一個實偶函數的傅里葉變換仍然是一個實偶函數)。離散餘弦變換,經常被信號處理和圖像處理使用,用於對信號和圖像(包括靜止圖像和運動圖像)進行有損數據壓縮。

示例調用:

Scala:

[plain] view plain copy
  1. import org.apache.spark.ml.feature.DCT  
  2. import org.apache.spark.ml.linalg.Vectors  
  3.   
  4. val data = Seq(  
  5.   Vectors.dense(0.0, 1.0, -2.0, 3.0),  
  6.   Vectors.dense(-1.0, 2.0, 4.0, -7.0),  
  7.   Vectors.dense(14.0, -2.0, -5.0, 1.0))  
  8.   
  9. val df = spark.createDataFrame(data.map(Tuple1.apply)).toDF("features")  
  10.   
  11. val dct = new DCT()  
  12.   .setInputCol("features")  
  13.   .setOutputCol("featuresDCT")  
  14.   .setInverse(false)  
  15.   
  16. val dctDf = dct.transform(df)  
  17. dctDf.select("featuresDCT").show(3)  

Java:

[java] view plain copy
  1. import java.util.Arrays;  
  2. import java.util.List;  
  3.   
  4. import org.apache.spark.ml.feature.DCT;  
  5. import org.apache.spark.ml.linalg.VectorUDT;  
  6. import org.apache.spark.ml.linalg.Vectors;  
  7. import org.apache.spark.sql.Row;  
  8. import org.apache.spark.sql.RowFactory;  
  9. import org.apache.spark.sql.types.Metadata;  
  10. import org.apache.spark.sql.types.StructField;  
  11. import org.apache.spark.sql.types.StructType;  
  12.   
  13. List<Row> data = Arrays.asList(  
  14.   RowFactory.create(Vectors.dense(0.01.0, -2.03.0)),  
  15.   RowFactory.create(Vectors.dense(-1.02.04.0, -7.0)),  
  16.   RowFactory.create(Vectors.dense(14.0, -2.0, -5.01.0))  
  17. );  
  18. StructType schema = new StructType(new StructField[]{  
  19.   new StructField("features"new VectorUDT(), false, Metadata.empty()),  
  20. });  
  21. Dataset<Row> df = spark.createDataFrame(data, schema);  
  22. DCT dct = new DCT()  
  23.   .setInputCol("features")  
  24.   .setOutputCol("featuresDCT")  
  25.   .setInverse(false);  
  26. Dataset<Row> dctDf = dct.transform(df);  
  27. dctDf.select("featuresDCT").show(3);  

Python:

[python] view plain copy
  1. from pyspark.ml.feature import DCT  
  2. from pyspark.ml.linalg import Vectors  
  3.   
  4. df = spark.createDataFrame([  
  5.     (Vectors.dense([0.01.0, -2.03.0]),),  
  6.     (Vectors.dense([-1.02.04.0, -7.0]),),  
  7.     (Vectors.dense([14.0, -2.0, -5.01.0]),)], ["features"])  
  8.   
  9. dct = DCT(inverse=False, inputCol="features", outputCol="featuresDCT")  
  10.   
  11. dctDf = dct.transform(df)  
  12.   
  13. for dcts in dctDf.select("featuresDCT").take(3):  
  14.     print(dcts)  

STringindexer

算法介紹

StringIndexer將字符串標籤編碼爲標籤指標。指標取值範圍爲[0,numLabels],按照標籤出現頻率排序,所以出現最頻繁的標籤其指標爲0。如果輸入列爲數值型,我們先將之映射到字符串然後再對字符串的值進行指標。如果下游的管道節點需要使用字符串-指標標籤,則必須將輸入和鑽還爲字符串-指標列名。

示例:

假設我們有DataFrame數據含有id和category兩列:

id | category

----|----------

 0  | a

 1  | b

 2  | c

 3  | a

 4  | a

 5  | c

category是有3種取值的字符串列,使用StringIndexer進行轉換後我們可以得到如下輸出:

id | category |categoryIndex

----|----------|---------------

 0  |a        | 0.0

 1  |b        | 2.0

 2  |c        | 1.0

 3  |a        | 0.0

 4  |a        | 0.0

 5  |c        | 1.0

另外,如果在轉換新數據時出現了在訓練中未出現的標籤,StringIndexer將會報錯(默認值)或者跳過未出現的標籤實例。

示例調用:

Scala:

[plain] view plain copy
  1. import org.apache.spark.ml.feature.StringIndexer  
  2.   
  3. val df = spark.createDataFrame(  
  4.   Seq((0, "a"), (1, "b"), (2, "c"), (3, "a"), (4, "a"), (5, "c"))  
  5. ).toDF("id", "category")  
  6.   
  7. val indexer = new StringIndexer()  
  8.   .setInputCol("category")  
  9.   .setOutputCol("categoryIndex")  
  10.   
  11. val indexed = indexer.fit(df).transform(df)  
  12. indexed.show()  

Java:

[java] view plain copy
  1. import java.util.Arrays;  
  2. import java.util.List;  
  3.   
  4. import org.apache.spark.ml.feature.StringIndexer;  
  5. import org.apache.spark.sql.Dataset;  
  6. import org.apache.spark.sql.Row;  
  7. import org.apache.spark.sql.RowFactory;  
  8. import org.apache.spark.sql.types.StructField;  
  9. import org.apache.spark.sql.types.StructType;  
  10.   
  11. import static org.apache.spark.sql.types.DataTypes.*;  
  12.   
  13. List<Row> data = Arrays.asList(  
  14.   RowFactory.create(0"a"),  
  15.   RowFactory.create(1"b"),  
  16.   RowFactory.create(2"c"),  
  17.   RowFactory.create(3"a"),  
  18.   RowFactory.create(4"a"),  
  19.   RowFactory.create(5"c")  
  20. );  
  21. StructType schema = new StructType(new StructField[]{  
  22.   createStructField("id", IntegerType, false),  
  23.   createStructField("category", StringType, false)  
  24. });  
  25. Dataset<Row> df = spark.createDataFrame(data, schema);  
  26. StringIndexer indexer = new StringIndexer()  
  27.   .setInputCol("category")  
  28.   .setOutputCol("categoryIndex");  
  29. Dataset<Row> indexed = indexer.fit(df).transform(df);  
  30. indexed.show();  

Python:

[python] view plain copy
  1. from pyspark.ml.feature import StringIndexer  
  2.   
  3. df = spark.createDataFrame(  
  4.     [(0"a"), (1"b"), (2"c"), (3"a"), (4"a"), (5"c")],  
  5.     ["id""category"])  
  6. indexer = StringIndexer(inputCol="category", outputCol="categoryIndex")  
  7. indexed = indexer.fit(df).transform(df)  
  8. indexed.show()  

IndexToString

算法介紹:

       與StringIndexer對應,IndexToString將指標標籤映射回原始字符串標籤。一個常用的場景是先通過StringIndexer產生指標標籤,然後使用指標標籤進行訓練,最後再對預測結果使用IndexToString來獲取其原始的標籤字符串。

示例:

假設我們有如下的DataFrame包含id和categoryIndex兩列:

id | categoryIndex

----|---------------

 0  | 0.0

 1  | 2.0

 2  | 1.0

 3  | 0.0

 4  | 0.0

 5  | 1.0

使用originalCategory我們可以獲取其原始的標籤字符串如下:

id | categoryIndex| originalCategory

----|---------------|-----------------

 0  |0.0           | a

 1  |2.0           | b

 2  |1.0           | c

 3  |0.0           | a

 4  |0.0           | a

 5  |1.0           | c

示例調用:

Scala:

[plain] view plain copy
  1. import org.apache.spark.ml.feature.{IndexToString, StringIndexer}  
  2.   
  3. val df = spark.createDataFrame(Seq(  
  4.   (0, "a"),  
  5.   (1, "b"),  
  6.   (2, "c"),  
  7.   (3, "a"),  
  8.   (4, "a"),  
  9.   (5, "c")  
  10. )).toDF("id", "category")  
  11.   
  12. val indexer = new StringIndexer()  
  13.   .setInputCol("category")  
  14.   .setOutputCol("categoryIndex")  
  15.   .fit(df)  
  16. val indexed = indexer.transform(df)  
  17.   
  18. val converter = new IndexToString()  
  19.   .setInputCol("categoryIndex")  
  20.   .setOutputCol("originalCategory")  
  21.   
  22. val converted = converter.transform(indexed)  
  23. converted.select("id", "originalCategory").show()  

Java:

[java] view plain copy
  1. import java.util.Arrays;  
  2. import java.util.List;  
  3.   
  4. import org.apache.spark.ml.feature.IndexToString;  
  5. import org.apache.spark.ml.feature.StringIndexer;  
  6. import org.apache.spark.ml.feature.StringIndexerModel;  
  7. import org.apache.spark.sql.Row;  
  8. import org.apache.spark.sql.RowFactory;  
  9. import org.apache.spark.sql.types.DataTypes;  
  10. import org.apache.spark.sql.types.Metadata;  
  11. import org.apache.spark.sql.types.StructField;  
  12. import org.apache.spark.sql.types.StructType;  
  13.   
  14. List<Row> data = Arrays.asList(  
  15.   RowFactory.create(0"a"),  
  16.   RowFactory.create(1"b"),  
  17.   RowFactory.create(2"c"),  
  18.   RowFactory.create(3"a"),  
  19.   RowFactory.create(4"a"),  
  20.   RowFactory.create(5"c")  
  21. );  
  22. StructType schema = new StructType(new StructField[]{  
  23.   new StructField("id", DataTypes.IntegerType, false, Metadata.empty()),  
  24.   new StructField("category", DataTypes.StringType, false, Metadata.empty())  
  25. });  
  26. Dataset<Row> df = spark.createDataFrame(data, schema);  
  27.   
  28. StringIndexerModel indexer = new StringIndexer()  
  29.   .setInputCol("category")  
  30.   .setOutputCol("categoryIndex")  
  31.   .fit(df);  
  32. Dataset<Row> indexed = indexer.transform(df);  
  33.   
  34. IndexToString converter = new IndexToString()  
  35.   .setInputCol("categoryIndex")  
  36.   .setOutputCol("originalCategory");  
  37. Dataset<Row> converted = converter.transform(indexed);  
  38. converted.select("id""originalCategory").show();  

Python:

[python] view plain copy
  1. from pyspark.ml.feature import IndexToString, StringIndexer  
  2.   
  3. df = spark.createDataFrame(  
  4.     [(0"a"), (1"b"), (2"c"), (3"a"), (4"a"), (5"c")],  
  5.     ["id""category"])  
  6.   
  7. stringIndexer = StringIndexer(inputCol="category", outputCol="categoryIndex")  
  8. model = stringIndexer.fit(df)  
  9. indexed = model.transform(df)  
  10.   
  11. converter = IndexToString(inputCol="categoryIndex", outputCol="originalCategory")  
  12. converted = converter.transform(indexed)  
  13.   
  14. converted.select("id""originalCategory").show()  

OneHotEncoder

算法介紹:

    獨熱編碼將標籤指標映射爲二值向量,其中最多一個單值。這種編碼被用於將種類特徵使用到需要連續特徵的算法,如邏輯迴歸等。

示例調用:

Scala:

[plain] view plain copy
  1. import org.apache.spark.ml.feature.{OneHotEncoder, StringIndexer}  
  2.   
  3. val df = spark.createDataFrame(Seq(  
  4.   (0, "a"),  
  5.   (1, "b"),  
  6.   (2, "c"),  
  7.   (3, "a"),  
  8.   (4, "a"),  
  9.   (5, "c")  
  10. )).toDF("id", "category")  
  11.   
  12. val indexer = new StringIndexer()  
  13.   .setInputCol("category")  
  14.   .setOutputCol("categoryIndex")  
  15.   .fit(df)  
  16. val indexed = indexer.transform(df)  
  17.   
  18. val encoder = new OneHotEncoder()  
  19.   .setInputCol("categoryIndex")  
  20.   .setOutputCol("categoryVec")  
  21. val encoded = encoder.transform(indexed)  
  22. encoded.select("id", "categoryVec").show()  

Java:

[java] view plain copy
  1. import java.util.Arrays;  
  2. import java.util.List;  
  3.   
  4. import org.apache.spark.ml.feature.OneHotEncoder;  
  5. import org.apache.spark.ml.feature.StringIndexer;  
  6. import org.apache.spark.ml.feature.StringIndexerModel;  
  7. import org.apache.spark.sql.Dataset;  
  8. import org.apache.spark.sql.Row;  
  9. import org.apache.spark.sql.RowFactory;  
  10. import org.apache.spark.sql.types.DataTypes;  
  11. import org.apache.spark.sql.types.Metadata;  
  12. import org.apache.spark.sql.types.StructField;  
  13. import org.apache.spark.sql.types.StructType;  
  14.   
  15. List<Row> data = Arrays.asList(  
  16.   RowFactory.create(0"a"),  
  17.   RowFactory.create(1"b"),  
  18.   RowFactory.create(2"c"),  
  19.   RowFactory.create(3"a"),  
  20.   RowFactory.create(4"a"),  
  21.   RowFactory.create(5"c")  
  22. );  
  23.   
  24. StructType schema = new StructType(new StructField[]{  
  25.   new StructField("id", DataTypes.IntegerType, false, Metadata.empty()),  
  26.   new StructField("category", DataTypes.StringType, false, Metadata.empty())  
  27. });  
  28.   
  29. Dataset<Row> df = spark.createDataFrame(data, schema);  
  30.   
  31. StringIndexerModel indexer = new StringIndexer()  
  32.   .setInputCol("category")  
  33.   .setOutputCol("categoryIndex")  
  34.   .fit(df);  
  35. Dataset<Row> indexed = indexer.transform(df);  
  36.   
  37. OneHotEncoder encoder = new OneHotEncoder()  
  38.   .setInputCol("categoryIndex")  
  39.   .setOutputCol("categoryVec");  
  40. Dataset<Row> encoded = encoder.transform(indexed);  
  41. encoded.select("id""categoryVec").show();  

Python:

[python] view plain copy
  1. from pyspark.ml.feature import OneHotEncoder, StringIndexer  
  2.   
  3. df = spark.createDataFrame([  
  4.     (0"a"),  
  5.     (1"b"),  
  6.     (2"c"),  
  7.     (3"a"),  
  8.     (4"a"),  
  9.     (5"c")  
  10. ], ["id""category"])  
  11.   
  12. stringIndexer = StringIndexer(inputCol="category", outputCol="categoryIndex")  
  13. model = stringIndexer.fit(df)  
  14. indexed = model.transform(df)  
  15. encoder = OneHotEncoder(dropLast=False, inputCol="categoryIndex", outputCol="categoryVec")  
  16. encoded = encoder.transform(indexed)  

  1. encoded.select("id""categoryVec").show()

文章出處:https://blog.csdn.net/liulingyuan6/article/details/53397780?locationNum=3&fps=1

發佈了6 篇原創文章 · 獲贊 18 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章