Spark ML包中的幾種歸一化方法總結(jié)

org.apache.spark.ml.feature包中包含了4種不同的歸一化方法:

  • Normalizer
  • StandardScaler
  • MinMaxScaler
  • MaxAbsScaler

有時(shí)感覺會(huì)容易混淆乎莉,借助官方文檔和實(shí)際數(shù)據(jù)的變換民晒,在這里做一次總結(jié)奶稠。

原文地址:http://www.neilron.xyz/spark-ml-feature-scaler/ 轉(zhuǎn)載請(qǐng)注明。

0 數(shù)據(jù)準(zhǔn)備

import org.apache.spark.ml.linalg.Vectors

val dataFrame = spark.createDataFrame(Seq(
  (0, Vectors.dense(1.0, 0.5, -1.0)),
  (1, Vectors.dense(2.0, 1.0, 1.0)),
  (2, Vectors.dense(4.0, 10.0, 2.0))
)).toDF("id", "features")

dataFrame.show

// 原始數(shù)據(jù)
+---+--------------+
| id|      features|
+---+--------------+
|  0|[1.0,0.5,-1.0]|
|  1| [2.0,1.0,1.0]|
|  2|[4.0,10.0,2.0]|
+---+--------------+

1 Normalizer

Normalizer的作用范圍是每一行,使每一個(gè)行向量的范數(shù)變換為一個(gè)單位范數(shù)耸棒,下面的示例代碼都來(lái)自spark官方文檔加上少量改寫和注釋。

import org.apache.spark.ml.feature.Normalizer

// 正則化每個(gè)向量到1階范數(shù)
val normalizer = new Normalizer()
  .setInputCol("features")
  .setOutputCol("normFeatures")
  .setP(1.0)

val l1NormData = normalizer.transform(dataFrame)
println("Normalized using L^1 norm")
l1NormData.show()

// 將每一行的規(guī)整為1階范數(shù)為1的向量,1階范數(shù)即所有值絕對(duì)值之和婚温。
+---+--------------+------------------+
| id|      features|      normFeatures|
+---+--------------+------------------+
|  0|[1.0,0.5,-1.0]|    [0.4,0.2,-0.4]|
|  1| [2.0,1.0,1.0]|   [0.5,0.25,0.25]|
|  2|[4.0,10.0,2.0]|[0.25,0.625,0.125]|
+---+--------------+------------------+

// 正則化每個(gè)向量到無(wú)窮階范數(shù)
val lInfNormData = normalizer.transform(dataFrame, normalizer.p -> Double.PositiveInfinity)
println("Normalized using L^inf norm")
lInfNormData.show()

// 向量的無(wú)窮階范數(shù)即向量中所有值中的最大值
+---+--------------+--------------+
| id|      features|  normFeatures|
+---+--------------+--------------+
|  0|[1.0,0.5,-1.0]|[1.0,0.5,-1.0]|
|  1| [2.0,1.0,1.0]| [1.0,0.5,0.5]|
|  2|[4.0,10.0,2.0]| [0.4,1.0,0.2]|
+---+--------------+--------------+

2 StandardScaler

StandardScaler處理的對(duì)象是每一列,也就是每一維特征媳否,將特征標(biāo)準(zhǔn)化為單位標(biāo)準(zhǔn)差或是0均值栅螟,或是0均值單位標(biāo)準(zhǔn)差。
主要有兩個(gè)參數(shù)可以設(shè)置:

  • withStd: 默認(rèn)為真篱竭。將數(shù)據(jù)標(biāo)準(zhǔn)化到單位標(biāo)準(zhǔn)差力图。
  • withMean: 默認(rèn)為假。是否變換為0均值掺逼。

StandardScaler需要fit數(shù)據(jù)吃媒,獲取每一維的均值和標(biāo)準(zhǔn)差,來(lái)縮放每一維特征吕喘。

import org.apache.spark.ml.feature.StandardScaler

val scaler = new StandardScaler()
  .setInputCol("features")
  .setOutputCol("scaledFeatures")
  .setWithStd(true)
  .setWithMean(false)

// Compute summary statistics by fitting the StandardScaler.
val scalerModel = scaler.fit(dataFrame)

// Normalize each feature to have unit standard deviation.
val scaledData = scalerModel.transform(dataFrame)
scaledData.show

// 將每一列的標(biāo)準(zhǔn)差縮放到1赘那。
+---+--------------+------------------------------------------------------------+
|id |features      |scaledFeatures                                              |
+---+--------------+------------------------------------------------------------+
|0  |[1.0,0.5,-1.0]|[0.6546536707079772,0.09352195295828244,-0.6546536707079771]|
|1  |[2.0,1.0,1.0] |[1.3093073414159544,0.1870439059165649,0.6546536707079771]  |
|2  |[4.0,10.0,2.0]|[2.618614682831909,1.870439059165649,1.3093073414159542]    |
+---+--------------+------------------------------------------------------------+

3 MinMaxScaler

MinMaxScaler作用同樣是每一列,即每一維特征氯质。將每一維特征線性地映射到指定的區(qū)間募舟,通常是[0, 1]。
它也有兩個(gè)參數(shù)可以設(shè)置:

  • min: 默認(rèn)為0闻察。指定區(qū)間的下限拱礁。
  • max: 默認(rèn)為1。指定區(qū)間的上限辕漂。
import org.apache.spark.ml.feature.MinMaxScaler

val scaler = new MinMaxScaler()
  .setInputCol("features")
  .setOutputCol("scaledFeatures")

// Compute summary statistics and generate MinMaxScalerModel
val scalerModel = scaler.fit(dataFrame)

// rescale each feature to range [min, max].
val scaledData = scalerModel.transform(dataFrame)
println(s"Features scaled to range: [${scaler.getMin}, ${scaler.getMax}]")
scaledData.select("features", "scaledFeatures").show

// 每維特征線性地映射呢灶,最小值映射到0,最大值映射到1钉嘹。
+--------------+-----------------------------------------------------------+
|features      |scaledFeatures                                             |
+--------------+-----------------------------------------------------------+
|[1.0,0.5,-1.0]|[0.0,0.0,0.0]                                              |
|[2.0,1.0,1.0] |[0.3333333333333333,0.05263157894736842,0.6666666666666666]|
|[4.0,10.0,2.0]|[1.0,1.0,1.0]                                              |
+--------------+-----------------------------------------------------------+

4 MaxAbsScaler

MaxAbsScaler將每一維的特征變換到[-1, 1]閉區(qū)間上鸯乃,通過(guò)除以每一維特征上的最大的絕對(duì)值,它不會(huì)平移整個(gè)分布隧期,也不會(huì)破壞原來(lái)每一個(gè)特征向量的稀疏性飒责。

import org.apache.spark.ml.feature.MaxAbsScaler

val scaler = new MaxAbsScaler()
  .setInputCol("features")
  .setOutputCol("scaledFeatures")

// Compute summary statistics and generate MaxAbsScalerModel
val scalerModel = scaler.fit(dataFrame)

// rescale each feature to range [-1, 1]
val scaledData = scalerModel.transform(dataFrame)
scaledData.select("features", "scaledFeatures").show()

// 每一維的絕對(duì)值的最大值為[4, 10, 2]
+--------------+----------------+                                               
|      features|  scaledFeatures|
+--------------+----------------+
|[1.0,0.5,-1.0]|[0.25,0.05,-0.5]|
| [2.0,1.0,1.0]|   [0.5,0.1,0.5]|
|[4.0,10.0,2.0]|   [1.0,1.0,1.0]|
+--------------+----------------+

總結(jié)

所有4種歸一化方法都是線性的變換赘娄,當(dāng)某一維特征上具有非線性的分布時(shí),還需要配合其它的特征預(yù)處理方法宏蛉。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末遣臼,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子拾并,更是在濱河造成了極大的恐慌揍堰,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,183評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件嗅义,死亡現(xiàn)場(chǎng)離奇詭異屏歹,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)之碗,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門蝙眶,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人褪那,你說(shuō)我怎么就攤上這事幽纷。” “怎么了博敬?”我有些...
    開封第一講書人閱讀 168,766評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵友浸,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我偏窝,道長(zhǎng)收恢,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,854評(píng)論 1 299
  • 正文 為了忘掉前任祭往,我火速辦了婚禮伦意,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘链沼。我一直安慰自己默赂,他們只是感情好沛鸵,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,871評(píng)論 6 398
  • 文/花漫 我一把揭開白布括勺。 她就那樣靜靜地躺著,像睡著了一般曲掰。 火紅的嫁衣襯著肌膚如雪疾捍。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,457評(píng)論 1 311
  • 那天栏妖,我揣著相機(jī)與錄音乱豆,去河邊找鬼。 笑死吊趾,一個(gè)胖子當(dāng)著我的面吹牛宛裕,可吹牛的內(nèi)容都是我干的瑟啃。 我是一名探鬼主播,決...
    沈念sama閱讀 40,999評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼揩尸,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼蛹屿!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起岩榆,我...
    開封第一講書人閱讀 39,914評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤错负,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后勇边,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體犹撒,經(jīng)...
    沈念sama閱讀 46,465評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,543評(píng)論 3 342
  • 正文 我和宋清朗相戀三年粒褒,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了识颊。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,675評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡奕坟,死狀恐怖谊囚,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情执赡,我是刑警寧澤镰踏,帶...
    沈念sama閱讀 36,354評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站沙合,受9級(jí)特大地震影響奠伪,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜首懈,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,029評(píng)論 3 335
  • 文/蒙蒙 一绊率、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧究履,春花似錦滤否、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至泥彤,卻和暖如春欲芹,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背吟吝。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工菱父, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,091評(píng)論 3 378
  • 正文 我出身青樓浙宜,卻偏偏與公主長(zhǎng)得像官辽,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子粟瞬,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,685評(píng)論 2 360

推薦閱讀更多精彩內(nèi)容