特徵值處理是資料工程中的一個重要環節, 用來將資料轉換為MLlib需要的格式, Feature Transformers為Spark所提供相當方便的工具, 本篇是使用Dataframe格式將官網範例做個測試 |
這裡結合一些網路上查到的說明
而本篇參考官網範例連結如下
官網MLlib Transformer說明
官網跑出的結果連結, 也可至下列網址看
我的github
StringIndexer
將文字的類別轉成數字index,才能放入分類器等model,按照標籤出現頻率排序,所以出現最頻繁的標籤其指標為0。如果輸入列為數值型,我們先將之映射到字符串然後再對字符串的值進行指標
IndexToString
將轉為index的類別反轉回原來值
VectorIndexer
將欲訓練特徵值欄位(array)轉成Vector丟入如分類器等演算法訓練model
OneHotEncoder
StringIndexer先將類別轉為離散的index,對隨機分佈的類別進行OneHotEncoder,轉換後可以當成連續數值輸入需要連續值的演算當中,轉為SparesVector格式(14,[3],[1.0]) 共14個欄位, 第三個欄位是1其餘是0 = 00010000000000, 因為大部分為0只需指定哪個欄位不為0
word2vec
word2vec 是把每個詞本身用一個多維向量來表示,把詞投影到一個向量空間裡。投影出來的空間有些特殊的性質,比如說相同屬性的詞可能會靠得很近,甚至部份的向量有邏輯上的線性關係等等
Tokenizer & HashingTF
為每個不同的字指派一個「索引,然後將向量傳至機器學習演算法,使每個索引的值包含該字在文字字串中出現的相對頻率,羅吉斯迴歸演算法的輸入應該是一組「標籤-特性向量配對,其中「特性向量」是代表輸入點的數字向量。 因此,我們需要將半結構化且包含許多自然語言評論的「違規情事」資料行,轉換成機器可輕易辨識的實數陣列。
Tokenizer : words為一串文字,將句子文字切成單字
HashingTF : 單字陣列轉換為特性向量,計算字頻,接著可以將它傳遞給羅吉斯迴歸演算法以構建模型
Bucketizer
分箱(分段處理),將連續值轉為離散值,比如特徵是年龄,是一个連續數值,需要將其轉換為離散類别(未成年人、青年人、中年人、老年人,分类的标准是自己定义的,在Spark中为split參数,定義如下:
double[] splits = {0, 18, 35,50, Double.PositiveInfinity}
將數值年齡分為四類0-18,18-35,35-50,55+四个段。
如果左右邊界拿不準,就設置為,Double.NegativeInfinity, Double.PositiveInfinity,不會有錯的。
QuantileDiscretizer
同Bucketizer,但只要定義Buckets數目即可
Imputer
補值,預設策略為其他高關聯的column的平均值補到nan,a有一列為nan,就會去找b和其他的column同列取mean補進去
Binarizer
二值化是根據閥值將連續數值特徵轉換為0-1特徵的過程。Binarizer參數有輸入、輸出以及閥值。特徵值大於閥值將映射為1.0,特徵值小於等於閥值將映射為0.0。
Normalizer
Normalizer是一個轉換器,它可以將多行向量輸入轉化為統一的形式。參數為p(默認值:2)來指定正則化中使用的p-norm。正則化操作可以使輸入數據標準化並提高後期學習算法的效果。
StandardScaler
StandardScaler處理Vector數據,標準化每個特徵使得其有統一的標準差以及(或者)均值為零。它需要如下參數:
1. withStd:默認值為真,使用統一標準差方式。
2. withMean:默認為假。此種方法將產出一個稠密輸出,所以不適用於稀疏輸入。
StandardScaler是一個Estimator ,它可以fit 數據集產生一個StandardScalerModel ,用來計算匯總統計。然後產生的模可以用來轉換向量至統一的標準差以及(或者)零均值特徵。注意如果特徵的標準差為零,則該特徵在向量中返回的默認值為0.0 。
MinMaxScaler
通過重新調節大小將Vector 形式的列轉換到指定的範圍內,通常為[ 0, 1] ,它的參數有:
1. min :默認為0.0 ,為轉換後所有特徵的下邊界。
2. max :默認為1.0 ,為轉換後所有特徵的下邊界。
MinMaxScaler 計算數據集的匯總統計量,並產生一個MinMaxScalerModel 。該模型可以將獨立的特徵的值轉換到指定的範圍內。
SQLTransformer
假设我们有如下DataFrame包含id,v1,v2列:
id | v1 | v2
—-|—–|—–
0 | 1.0 | 3.0
2 | 2.0 | 5.0
使用SQLTransformer语句"SELECT *,(v1 + v2) AS v3, (v1 * v2) AS v4 FROM __THIS__"轉換後得到輸出如下:
id | v1 | v2 | v3 | v4
—-|—–|—–|—–|—–
0 | 1.0| 3.0 | 4.0 | 3.0
2 | 2.0| 5.0 | 7.0 |10.0
n-gram
一個n-gram是一個長度為整數n的字序列。NGram可以用來將輸入轉換為n-gram。NGram的輸入為一系列字符串(如分詞器輸出)。參數n決定每個n-gram包含的對像個數。結果包含一系列n-gram,其中每個n-gram代表一個空格分割的n個連續字符。如果輸入少於n個字符串,將沒有輸出結果。
ElementwiseProduct
ElementwiseProduct 按提供的“weight” 向量,返回與輸入向量元素級別的乘積。即是說,按提供的權重分別對輸入數據進行縮放,得到輸入向量v 以及權重向量w 的Hadamard 積。
沒有留言:
張貼留言