Spark特徵工程

按照慣例,先附上業界那句名言“數據和特徵決定了機器學習的上限,而模型和算法只是逼近這個上限而已”。特徵工程是指用一系列工程化的方式從原始數據中篩選出更好的數據特徵,以提升模型的訓練效果。簡而言之,就是爲算法提供更友好的輸入,以最大化地發揮算法的作用。同時,特徵工程雖然是一種技術,但其前提是對數據以及產生這些數據的具體業務場景有比較深入的理解。一般的,python的sklearn、spark的mllib都包含了特徵工程相關的方法,這裏介紹spark的mllib中特徵工程相關的方法,但具體實現請參考官方文檔。

spark中特徵工程在mllib 中Extracting, transforming and selecting features裏,其分爲Feature Extractors(特徵提取)、Feature Transformers(特徵轉換)、Feature Selectors(特徵選擇)以及Locality Sensitive Hashing(即LSH局部敏感哈希)。其中特徵提取是從原始數據中提取特徵,特徵轉換是從已有的特徵中構建更有用的特徵,特徵選擇是從原特徵中選擇最有效的的一組子特徵。局部敏感哈希是一種用於海量高維數據的近似最近鄰快速查找技術,本博客不做介紹。

 

       特徵提取

spark中特徵提取中包含四個方法:TF-IDF、Word2Vec、CountVectorizer以及FeatureHasher。其中,TF-IDF以及Word2Vec的使用比較廣泛,這裏不詳細展開,TF-IDF主要用於提取文檔的關鍵詞,而Word2Vec將詞語或者文章轉換爲詞向量,通過空間距離表示文檔的相似度,距離越近則越相似,其中一篇文章的詞向量是文章所有詞語詞向量的平均值,所以使用Word2Vec儘量使用關鍵詞轉換詞向量。CountVectorizer與TF相似,輸出詞頻向量,但是CountVectorizer是可逆的,而TF是不可逆的,也就是說,CountVectorizer可以通過詞頻向量的索引找到對應的單詞,而TF則不可以。所以在使用spark做關鍵詞提取時,通常使用CountVectorizer和IDF,而如果只需要文檔關鍵詞的特徵向量的話,則使用TF和IDF。詳細地,可以參考博主spark關鍵詞提取相關的博客:

       https://blog.csdn.net/u013090676/article/details/81952235

最後FeatureHasher即特徵哈希,是將原來的N維特徵轉換爲一個M維的特徵向量,一般的M小於N。並且原始的N維特徵可以是不同的數據類型,比如數字、字符串、布爾值等,對於不同的數據類型,FeatureHasher會使用不同的方式進行處理。

 

       特徵轉換

特徵轉換是spark特徵工程的主要部分,其中也包含了最多的方法,這裏不一一介紹,總的來說,可以分爲以下幾類:

  • 文檔轉換

文檔轉換主要對文檔內容數據進行轉換。主要有Tokenizer、StopWordsRemover以及n-gram。其中Tokenizer用於分詞,StopWordsRemover用於去掉停用詞,但是這兩個方法針對的是英文,如果要做中文分詞以及去掉停用詞的話,需要使用中文分詞相關的方法,比如ansj。n-gram並不是n-gram算法,而是將分詞好的字符串根據參數n的值轉換成每組n個字符串的向量。例如,輸入["I", "love", "Java"]經過n=2的轉換後,輸出["I love", "love java"]。

  • 正則化

正則化將每個樣本縮放到單位範數上,對於二次型(點積)或者其他核函數方法計算兩個樣本之間的相似性比較有用。spark中正則化使用的方法是Normalizer,Normalizer作用於每一行(所有特徵),將一個行向量的範數轉換爲單位範數。需要參數p確定是p範數,默認p=2,就是模長(到原點的歐式距離)。特殊的,0範數爲絕對值之和,無窮範數是向量的最大值。

  • 標準化

 標準化是在不改變原數據分佈的前提下,將數據按比例縮放,使之落入一個限定的區間,使數據之間具有可比性。但當特徵明顯不遵從高斯正態分佈時,標準化的效果比較差。簡而言之,就是讓不同量綱單位的數據具有可比性。spark中標準化使用StandardScaler。StandardScaler作用於每一列(每一個特徵),將特徵標準化爲單位標準差或是0均值,或是0均值單位標準差。有兩個參數:withStd默認爲真,轉換爲單位標準差,withMean默認爲假,爲真時轉爲0均值。

  • 歸一化

歸一化是對數據集進行區間縮放,縮放到單位區間內,把有單位的數據轉化爲沒有單位的數據,即統一數據的衡量標準,消除單位的影響。spark中歸一化的方法有MinMaxScaler與MaxAbsScaler,他們都作用於每一列。其中MinMaxScaler將每一維特徵映射到[min,max]的區間,通常情況是[0,1]。而MaxAbsScaler通過除以每一維特徵最大值的絕對值,將每一維特徵映射到[-1,1]上。

  • 二值化

二值化是將數值型特徵轉換爲布爾類型特徵,通過設定一個閾值,當特徵值大於該閾值時爲1 ,小於等於則爲0。spark中二值化採用Binarizer。

  • 離散化

離散化即是將連續變量進行離散化,一則部門算法要求輸入爲離散變量,第二對離散變量的處理效率更高,噪聲的影響越低。Spark中離散化的方法有Bucketizer與QuantileDiscretize。其中Bucketizer是講連續的數據放入已經設置好的n個桶中(即每個桶的上下邊界人工設置好),而QuantileDiscretize根據設置的桶的數量對連續變量進行拆分,且它可以處理NaN值。另外,通常也可以使用聚類的方法來對連續變量進行離散化。

  • 獨熱編碼

獨熱編碼(也可稱爲啞變量)將分類轉換爲二進制向量,該向量中只有一位爲1,其他爲0。獨熱編碼一般在需要計算空間距離的算法中對原始的無先後順序的分類數據進行處理。例如一般的系統中,通過1、2、3對紅燈、綠燈和黃燈進行標識,但是紅黃綠三種狀態本來沒有大小和順序,如果不做處理,進行距離計算時,就會出現綠燈離紅燈比黃燈離紅燈更近的情況。所以通過獨熱編碼將其轉換爲紅燈[1,0,0]、黃燈[0,1,0]、綠燈[0,0,1],這樣三個分類的空間距離也就相同了。獨熱編碼使用OneHotEncoderEstimator,作用於列,可以作用於多個列,對一個特徵的值進行獨熱編碼。

  • 缺失值補全

缺失值補全使用Imputer方法。Imputer作用於列,對列中的NaN使用中位數或者平均數進行補全。

  • 特徵構造

特徵構造通過對已有特徵進行拆分、組合構建出新的特徵。特徵構建的過程,需要對原始數據以及業務特徵有一定的理解,例如在銷量分析中,通常會把時間拆分成月份和日期,來分析哪些月份、每個月哪幾天銷量較高。Spark中特徵構造的方法包括:PolynomialExpansion、Interaction、ElementwiseProduct和VectorAssembler。其中,PolynomialExpansion將特徵進行多項式展開形成新的特徵;Interaction將多列向量構造成一個向量,新向量的內容是每個輸入列的每個值與其他列組合的乘機;ElementwiseProduct通過將向量列與一個標量列進行乘積來對向量進行縮放;VectorAssembler對輸入列進行拼接生成一個新的向量。具體地,可以運行相關示例進行詳細的瞭解。

  • 降維

降維spark中目前博主只找到了PCA。但是一般情況下,數據降維有線性方法與非線性方法。線性方法比較常用的有PCA(主成分分析)與LDA(線性判別式 Linear Discriminant Analysis,注意與Latent Dirichlet Allocation區分開,在spark聚類中,它也叫LDA)。這裏不對LDA與PCA進行詳細的介紹,只是在應用中需要注意,PCA是爲了去掉冗餘的維度,使得降低了維度的數據之間的方差最大;而LDA則是爲了降維的結果數據更容易分類。

 

特徵選擇

Spark中特徵選擇提供了三種方法:VectorSlicer、RFormula以及ChiSqSelector。其中VectorSlicer支持用戶通過索引篩選某一個向量列中特定的下標的元素組成新的向量,同時也支持通過名稱來篩選,但是比較麻煩;RFormula基於R模型,根據R公式生存標籤列和特徵列(和博主一樣不熟悉R的同學就不用糾結這個了);ChiSqSelector通過卡方獨立性檢驗來選擇特徵,最終選擇與標籤列分佈最接近(也就是最相關)的特徵。因此ChiSqSelector一般用於在特徵比較多的時候,用來選取預測能力比較強的特徵。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章