天天看點

Flink ML 機器學習算法介紹(三)-特征工程

作者:程式你好
Flink ML 機器學習算法介紹(三)-特征工程

6、FeatureHasher

Flink ML 機器學習算法介紹(三)-特征工程

FeatureHasher的中文翻譯是特征哈希。它是一種機器學習中的特征抽取方法,可以将一組特征名稱(字元串)轉換為稀疏矩陣,使用哈希函數來計算特征名稱對應的矩陣列索引。

FeatureHasher可以處理多個列,每個列可以包含數值或分類特征。不同列的資料類型的處理方式如下:

1)、數值列:對于數值特征,使用列名稱的哈希值來将特征值映射到特征向量的索引。預設情況下,數值特征不被視為分類(即使它們是整數)。要将它們視為分類,可以在categoricalCols參數中指定相關列。

2)、字元串列:對于分類特征,使用字元串“column_name=value”的哈希值來映射到向量索引,訓示值為1.0。是以,分類特征被“one-hot”編碼(類似于使用OneHotEncoder并設定dropLast=false)。

3)、布爾列:布爾值與字元串列的處理方式相同。也就是說,布爾特征被表示為“column_name=true”或“column_name=false”,訓示值為1.0。

4)、空(缺失)值被忽略(在結果特征向量中隐式為零)。

由于使用了一個簡單的模運算來将哈希函數轉換為向量索引,是以建議使用2的幂作為numFeatures參數;否則,特征可能不會均勻地映射到向量索引。

FeatureHasher是一種無狀态的轉換器,不需要進行拟合。但是,我們建議調用fit_transform而不是transform,因為參數驗證隻在fit中進行。

FeatureHasher的優點是節省記憶體,适用于大規模(線上)學習和記憶體緊張的情況,例如在嵌入式裝置上運作預測代碼。它的缺點是可能發生哈希沖突,導緻不同的特征被映射到同一個索引,進而降低模型的準确性。

FeatureHasher有以下一些應用場景:

當原始特征空間非常大,而且特征稀疏時,可以使用FeatureHasher來降低次元,節省記憶體和計算資源。

當特征是動态生成的,或者不友善提前統計所有可能的特征時,可以使用FeatureHasher來快速地将特征映射到固定的向量空間。

當需要進行大規模的(線上)學習,或者在記憶體緊張的裝置上運作預測代碼時,可以使用FeatureHasher來減少對記憶體的需求。

當需要處理多種類型的特征(數值、分類、布爾等)時,可以使用FeatureHasher來統一地将它們轉換為數值型特征向量。

輸入

參數名稱 類型 預設值 描述
inputCols Number/String/Boolean null 要被哈希的列

輸出

參數名稱 類型 預設值 描述
outputCols Vector "output" 輸出Vector

參數

名稱 預設值 類型 是否必填 描述
inputCols null String[] yes 輸入列名稱
outputCols "output" String no 輸出列名稱
categoricalCols [] String[] no 類别名稱
numFeatures 262144 Integer no 特征數量

示例代碼:

StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
        StreamTableEnvironment tEnv = StreamTableEnvironment.create(env);


        // Generates input data.
        DataStream<Row> dataStream =
                env.fromCollection(
                        Arrays.asList(Row.of(0, "a", 1.0, true), Row.of(1, "c", 1.0, false)));
        Table inputDataTable = tEnv.fromDataStream(dataStream).as("id", "f0", "f1", "f2");


        // Creates a FeatureHasher object and initializes its parameters.
        FeatureHasher featureHash =
                new FeatureHasher()
                        .setInputCols("f0", "f1", "f2")
                        .setCategoricalCols("f0", "f2")
                        .setOutputCol("vec")
                        .setNumFeatures(1000);


        // Uses the FeatureHasher object for feature transformations.
        Table outputTable = featureHash.transform(inputDataTable)[0];


        // Extracts and displays the results.
        for (CloseableIterator<Row> it = outputTable.execute().collect(); it.hasNext(); ) {
            Row row = it.next();


            Object[] inputValues = new Object[featureHash.getInputCols().length];
            for (int i = 0; i < inputValues.length; i++) {
                inputValues[i] = row.getField(featureHash.getInputCols()[i]);
            }
            Vector outputValue = (Vector) row.getField(featureHash.getOutputCol());


            System.out.printf(
                    "Input Values: %s \tOutput Value: %s\n",
                    Arrays.toString(inputValues), outputValue);
        }           

7、HashingTF

HashingTF的中文翻譯是哈希詞頻。它是一種機器學習中的文本特征抽取方法,可以将一組單詞或詞組轉換為一個指定次元的稀疏向量,表示每個單詞或詞組在文本中出現的頻率。它使用哈希函數來将單詞或詞組映射到向量的索引,而不需要維護一個詞彙表。HashingTF使用哈希技巧将一系列的項(字元串、數字、布爾值)映射到一個指定次元的稀疏向量。如果多個特征被投影到同一列,輸出值預設會累加。

HashingTF算法使用的哈希函數是MurmurHash3算法,它是一種适用于一般的基于散列查找的非加密校驗函數,能夠産生32位或128位的哈希值。由于使用了一個簡單的模運算來将哈希值轉換為向量索引,是以建議使用2的幂次方作為向量次元。

HashingTF有以下一些應用場景:

1)、當需要對文本資料進行特征提取時,可以使用HashingTF來将單詞或詞組轉換為稀疏向量,表示每個單詞或詞組在文本中出現的頻率。

2)、當需要進行大規模或線上的文本分析時,可以使用HashingTF來節省記憶體和計算資源,避免維護一個全局的詞彙表。

3)、當需要處理多種類型的文本特征(字元串、數字、布爾值等)時,可以使用HashingTF來統一地将它們轉換為數值型特征向量。

HashingTF算法的優點是節省記憶體和計算資源,适用于大規模和線上的文本分析場景。它的缺點是可能發生哈希沖突,即不同的單詞或詞組被映射到同一個索引,進而影響特征向量的準确性。

StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
    StreamTableEnvironment tEnv = StreamTableEnvironment.create(env);


    // Generates input data.
    DataStream<Row> inputStream =
      env.fromElements(
        Row.of(
          Arrays.asList(
            "HashingTFTest", "Hashing", "Term", "Frequency", "Test")),
        Row.of(
          Arrays.asList(
            "HashingTFTest", "Hashing", "Hashing", "Test", "Test")));


    Table inputTable = tEnv.fromDataStream(inputStream).as("input");


    // Creates a HashingTF object and initializes its parameters.
    HashingTF hashingTF =
      new HashingTF().setInputCol("input").setOutputCol("output").setNumFeatures(128);


    // Uses the HashingTF object for feature transformations.
    Table outputTable = hashingTF.transform(inputTable)[0];


    // Extracts and displays the results.
    for (CloseableIterator<Row> it = outputTable.execute().collect(); it.hasNext(); ) {
      Row row = it.next();


      List<Object> inputValue = (List<Object>) row.getField(hashingTF.getInputCol());
      SparseVector outputValue = (SparseVector) row.getField(hashingTF.getOutputCol());


      System.out.printf(
        "Input Value: %s \tOutput Value: %s\n",
        Arrays.toString(inputValue.stream().toArray()), outputValue);
    }           
Flink ML 機器學習算法介紹(三)-特征工程

8、IDF

Inverse Document Frequency,縮寫為IDF(逆文檔頻率),IDF算法是一種用于資訊檢索和文本挖掘的常用權重技術,它可以衡量一個詞對于一個文檔或語料庫的重要性。IDF的含義是逆文檔頻率,它的大小與一個詞在文檔中出現的頻率成反比。IDF算法的優點是簡單快速,而且容易了解。它可以有效地過濾掉一些常見但無關緊要的詞,突出一些能夠反映文檔主題或内容的關鍵詞。

IDF算法有以下一些應用場景:

- 當需要對文本資料進行特征提取時,可以使用IDF算法來降低那些在語料庫中出現頻率較高的詞的權重,增強那些在語料庫中出現頻率較低但能夠區分文檔主題的詞的權重。

- 當需要進行文本分類或聚類時,可以使用IDF算法來提取文檔中的關鍵詞,作為分類或聚類的特征向量。

- 當需要進行文字檢索或相似度計算時,可以使用IDF算法來衡量查詢詞與文檔之間的相關性,根據TF-IDF值進行排序或比對。

TF-IDF的優點是簡單快速,而且容易了解。缺點是有時候用詞頻來衡量文章中的一個詞的重要性不夠全面,有時候重要的詞出現的可能不夠多,而且這種計算無法展現位置資訊,無法展現詞在上下文的重要性。如果要展現詞的上下文結構,那麼你可能需要使用word2vec算法來支援。

9、Imputer

Imputer算法是一種用于填補輸入列中缺失值的算法,它可以根據不同的政策(如平均值、中位數、最常見值等)來填補缺失的資料。缺失值可以用每一列中的統計量(均值、中位數或最頻繁值)來填補。輸入列應該是數值型的。Imputer算法可以用于資料預處理,提高資料的完整性和品質。

注意:均值/中位數/最頻繁值是在過濾掉缺失值和空值後計算的,空值總是被視為缺失值,是以也會被填補。

注意:參數relativeError隻有在政策為中位數時才有效。

用于處理不同領域的資料缺失問題,例如:

1)、機器學習中的資料預處理,例如使用sklearn庫中的Imputer類來對數值型或類别型資料進行填充。

2)、資料分析中的缺失值處理,例如使用pandas庫中的fillna方法來對資料框中的缺失值進行填充。

3)、資料挖掘中的資料清洗,例如使用R語言中的mice包來對多重缺失資料進行插補。

Imputer算法的局限性有以下幾點:

1)、 Imputer算法隻能處理數值型資料,對于非數值型資料需要先轉換為數值型資料再進行插補。

2)、Imputer算法隻能使用固定的政策(如均值、中位數、衆數、常數等)來填充缺失值,無法進行更複雜的插補方法,如線性插補、多重插補等。

3)、Imputer算法需要指定缺失值的辨別,如np.nan, None, 0等,如果資料中存在不同的缺失值辨別,需要先統一處理。

4)、Imputer算法可能會引入一些噪聲或偏差,導緻資料分布發生變化,影響後續的分析或模組化。

10、IndexToString /StringToIndex

與StringIndexer相對的是,IndexToString将标簽索引列映射回原來的字元串标簽。StringIndexer将标簽轉換為索引,然後通過索引訓練模型,最後通過IndexToString将預測的标簽索引恢複成字元串标簽。

StringIndexer

StringIndexer是指将一組字元串類型的标簽資料轉化成數值類型的資料。其基本原理就是将字元串出現的頻率進行排序,優先編碼出現頻率最高的字元串,索引的範圍為0到字元串數量。如果輸入的是數值型的,就會先把他轉成字元串型的,然後再進行編碼處理。

11、Interaction

Interaction算法是一種機器學習算法,将向量或數值列轉換為單一向量列的模型,它包含了每個輸入列中的一個值的所有組合的乘積。例如,當輸入特征值是Double(2)和Vector(3, 4)時,輸出将是Vector(6, 8)。當輸入特征值是Vector(1, 2)和Vector(3, 4)時,輸出将是Vector(3, 4, 6, 8)。如果你改變這兩個輸入向量的位置,輸出将是Vector(3, 6, 4, 8)。

它可以在資料中發現互動效應,即兩個或多個變量之間的互相作用。互動效應是指一個變量對因變量的影響取決于另一個變量的水準。Interaction算法的基本思想是使用一種稱為“分層注意力網絡”(HAN)的神經網絡結構,來自動地從資料中學習互動效應。HAN由兩層注意力機制組成,第一層注意力機制用于選擇與因變量相關的特征,第二層注意力機制用于選擇與其他特征互動的特征。HAN可以處理高維、稀疏、非線性和異質的資料,而無需進行特征工程或先驗假設。

Interaction算法在很多領域有應用,例如:

- 社會科學:Interaction算法可以幫助社會科學家發現社會現象中的互動效應,比如性别、種族、教育等因素對收入、健康、幸福等名額的影響。

- 醫學:Interaction算法可以幫助醫學研究者發現基因、環境、藥物等因素對疾病風險和治療效果的影響。

- 機器學習:Interaction算法可以幫助機器學習工程師提高模型的預測性能和解釋性,比如在圖像分類、文本分析、推薦系統等任務中。

12、KBinsDiscretizer

KBinsDiscretizer是一個用于将連續資料分成區間的算法,它提供了将連續特征劃分為離散特征值的方法。

該算法有三種政策可供選擇,分别是`uniform`(所有特征中的每個區間都具有相同的寬度),`quantile`(每個特征中的所有區間都具有相同數量的點),以及`kmeans`(每個區間中的值都具有與1D k-means聚類中心最近的值)。可以通過調整參數來控制區間數量、編碼方法和政策等。

KBinsDiscretizer的優點之一是它可以使線性模型更具表現力。通過将連續資料離散化,線性模型可以引入非線性關系,進而更好地拟合資料。

但是,KBinsDiscretizer也有一些缺點。例如,如果區間不夠寬,可能會增加過拟合的風險,是以需要在交叉驗證下調整離散器參數。此外,KBinsDiscretizer可能會産生不變的特征(例如,當encode ='onehot'并且某些bin不包含任何資料時),這些特征可以通過特征選擇算法删除。

對于基于樹的模型,離散化特征通常沒有什麼益處,因為這些模型可以學習在任何地方分割資料。

13、MaxAbsScaler

MaxAbsScaler是一種算法,它通過将每個特征中的最大絕對值除以特征值來将特征值重新縮放到[-1,1]範圍内。該算法獨立地縮放和轉換每個特征,使訓練集中每個特征的最大絕對值為1.0。它不會移動/居中資料,是以不會破壞任何稀疏性,這對于處理稀疏資料(例如文本資料)非常有用。

但是,MaxAbsScaler也有一些局限性。它對異常值非常敏感,因為它是通過除以每個特征的最大絕對值來進行縮放的。如果資料中存在異常值,那麼縮放結果可能會受到影響。

繼續閱讀