日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

归一化处理公式_特征工程连续特征的常见处理方式(含实例)

發布時間:2024/1/23 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 归一化处理公式_特征工程连续特征的常见处理方式(含实例) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

點擊標題下「小小挖掘機」可快速關注

連續特征離散化可以使模型更加穩健,比如當我們預測用戶是否點擊某個商品時,一個點擊該商品所屬類別下次數為100次和一個點擊次數為105次的用戶可能具有相似的點擊行為,有時候特征精度過高也可能是噪聲,這也是為什么在LightGBM中,模型采用直方圖算法來防止過擬合。連續特征經常是用戶或者事物對應一些行為的統計值,常見的處理方法包括:
  • 歸一化
  • 標準化
  • 離散化
  • 缺失值處理
這里要特別注意一下歸一化和標準化的區別,在平常的使用中,很多同學都容易把這兩者的概念混淆,因為兩者的英文翻譯是一樣的(Feature scaling,特征縮放,參考維基百科 Feature scaling - Wikipedia)。但是根據其本意和實際用途(或者稱之為公式)來理解是不一樣的。

歸一化

歸一化一般是將數據映射到指定的范圍,用于去除不同維度數據的量綱以及量綱單位,最常見的歸一化方法有:

1、Min-Max 歸一化

Min-Max 歸一化是指對原始數據進行線性變換,將值映射到[0,1]之間。Min-Max 歸一化的計算公式為:式中,為原始數據中的一個數據,表示原始數據中的最小值,表示原始數據中的最大 值, 為 Min-Max 歸一化后的數據。

2、均值歸一化

均值歸一化是指通過原始數據中的均值、最大值和最小值來進行數據的標準化。均值歸 一化法計算公式為:式中,為原始數據中的一個數據,表示原始數據的均值,表示原始數據中的最大值,表示原始數據中的最小值, 為均值歸一化后的數據。

3、小數定標歸一化

小數定標歸一化是指通過移動小數點的位置來進行數據的歸一化。小數點移動的位數取決于原始數據中的最大絕對值。小數定標歸一化的計算公式為:式中,為原始數據中的一個數據,經過小數定標(Decimal scaling)歸一化后的數據,表示滿足條件的最小整數。例如,一組數據為[-309, -10, -43,87,344,970],其中絕對值最大的是 970。使用小數定標歸一化,用 1000(即 j=3)除以每個值。這樣,-309 被歸一化為-0.309,970 被歸一化為 0.97。

4、向量歸一化

向量歸一化是指通過用原始數據中的每個值除以所有數據之和來進行數據的歸一化。向量歸一化的計算公式為:式中,為原始數據中的一個值,分母表示的是原始數據的所有數據之和, 為歸一化后的數據。

5、指數歸一化

指數轉換是指通過對原始數據的值進行相應的指數函數變換來進行數據的標準化。進行指數轉換常見的函數方法有函數、函數和 函數。

a. 函數

函數對應的標準化計算公式為:式中,為原始數據中的一個數據,表示原始數據中的最大值, 為指數轉換后的數據。

b. 函數

函數對應的標準化計算公式為:式中,為原始數據中的一個數據,為自然常數,分母表示的是原始數據中每個數據被 求指數后的和,分子表示的是原始數據中一個數據被 求指數, 為指數轉換后的數據。

c. 函數

Sigmoid 函數對應的標準化計算公式為:式中,為原始數據中的一個常數,為自然常數, 為指數轉換后的數據。

標準化

標準化:對數據的分布的進行轉換,使其符合某種分布(比如正態分布)的一種非線性特征變換。需要注意的是標準化不改變數據分布的類型,比如原始數據服從正態分布,標準化處理之后依舊服從正態分布,只是數據的均值和方差發生了變化。可以結合PCA算法進行理解,如果分布改變了,那主成分分析就得不到原始數據的分布信息了。使用最廣泛的標準化方法為:Z-Score標準化。Z-Score(也叫 Standard Score,標準分數)標準化是指基于原始數據的均值(mean)和 標準差(standard deviation)來進行數據的標準化。Z-Score 標準化的計算公式為:式中,為原始數據中的一個數據,表示原始數據的均值,表示原始數據的標準差,為 Z-Score 標準化后的數據。特征經過歸一化或者標準化處理之后對于模型訓練的好處有:
  • 提升模型精度。

    因為使不同量綱的特征處于同一數值量級,減少方差大的特征的影響。在KNN中,我們需要計算待分類點與所有實例點的距離。假設每個實例點(instance)由n個features構成。如果我們選用的距離度量為歐式距離,如果數據預先沒有經過歸一化,那么那些絕對值大的features在歐式距離計算的時候起了決定性作用。

    從經驗上說,歸一化是讓不同維度之間的特征在數值上有一定比較性,可以大大提高分類器的準確性。

  • 提升收斂速度。

    對于線性model來說,數據歸一化后,最優解的尋優過程明顯會變得平緩,更容易正確的收斂到最優解。

    提升模型收斂速度
在對特征進行具體的處理時,需要結合具體的業務場景和算法模型評估特征是否需要進行歸一化或者標準化。歸一化改變數據分布,標準化不會改變數據分布,如下例:根據人的身高和體重預測人的健康指數,假設有如下原始樣本數據是四維的(當然一般不會有這么無聊的數據)在這里插入圖片描述在這里插入圖片描述從上面兩個坐標圖可以看出,樣本在數據值上的分布差距是不一樣的,但是其幾何距離是一致的。而標準化就是一種對樣本數據在不同維度上進行一個伸縮變化(而不改變數據的幾何距離),也就是不改變原始數據的信息(分布)。這樣的好處就是在進行特征提取時,忽略掉不同特征之間的一個度量,而保留樣本在各個維度上的信息(分布)。在這里插入圖片描述從采用大單位的身高和體重這兩個特征來看,如果采用標準化,不改變樣本在這兩個維度上的分布,則左圖還是會保持二維分布的一個扁平性;而采用歸一化則會在不同維度上對數據進行不同的伸縮變化(歸一區間,會改變數據的原始距離,分布,信息),使得其呈類圓形。雖然這樣樣本會失去原始的信息,但這防止了歸一化前直接對原始數據進行梯度下降類似的優化算法時最終解被數值大的特征所主導。歸一化之后,各個特征對目標函數的影響權重是一致的。這樣的好處是在提高迭代求解的精度。當然,數據歸一化并不是萬能的。在實際應用中,通過梯度下降法求解的模型通常是需要歸一化的,包括線性回歸、邏輯回歸、支持向量機、神經網絡等模型。但對于決策樹模型則并不適用,以C4.5為例,決策樹在進行節點分裂時主要依據數據集D關于特征x的信息增益比,而信息增益比跟特征是否經過歸一化是無關的,因為歸一化并不會改變樣本在特征 上的信息增益。

離散化

數據離散化(也叫數據分組)是指將連續的數據進行分組,使其變為一段段離散化的區間,離散化后的特征根據其所在的組進行One-Hot編碼。根據離散化過程中是否考慮類別屬性,可以將離散化算法分為有監督算法和無監督算法兩 類。由于有監督算法(如基于熵進行數據的離散化)充分利用了類別屬性的信息,所以在分類中能獲得較高的正確率。常見的數據離散化方法有以下幾種(以下介紹的數據分組方法均需要對數據進行排序,且假設待離散化的數據按照升序排列):
  • 二值化分組
  • 等寬分組
  • 等頻分組
  • 單變量分組
  • 基于信息熵分組

1、二值化分組

二值化分組比較好理解,即將離散特征根據某個值劃分成兩個字段。例如,一組變量(1,7,12,12,22,30,34,38,46),可以將分割值設置為22,即小于等于22的為一組,大于22的為一組,劃分后為:(1,7,12,12,22),(30,34,38,46)。

2、等寬分組

等寬分組的原理是,根據分組的個數得出固定的寬度,分到每個組中的變量的寬度是相等的。例如,將一組變量(1,7,12,12,22,30,34,38,46)分成三組。
  • 寬度為 15,即用變量中的最大值(46)減去變量中的最小值(1),然后用差除以組數(3)。
  • 每組的范圍為:(1,16]、(16,31]、(31,46]
  • 分組后的結果為:(1,7,12,12)、(22,30)、(34,38,46)
(1,16]表示半開半閉區間,即大于 1 且小于或等于 16。另外,采用半開半閉區間時,最 小值不能進行有效分組,這里默認將其歸為第一組。

3、等頻分組

等頻分組也叫分位數分組,即分組后每組的變量個數相同。例如,將一組變量(1,7,12,12,22,30,34,38,46)分成三組。變量的總個數為 9,所以每組的變量為 3 個。分組后的結果為:(1,7,12)、(12,22,30)、 (34,38,46)。等寬分組和等頻分組實現起來比較簡單,但都需要人為地指定分組個數。等寬分組的缺點是:對離群值比較敏感,將屬性值不均勻地分布到各個區間。有些區間 包含的變量較多,有些區間包含的變量較少。等頻分組雖然能避免等寬分組的缺點,但是會將相同的變量值分到不同的組(以滿足每 個組內的變量個數相同)。

4、單變量分組

單變量分組也叫秩分組。其原理是:將所有變量按照降序或升序排序,排序名次即為排序結果,即將值相同的變量劃分到同一組。例如,將一組變量(1,7,12,12,22,30,34,38,46)分成三組,去重后,變量個數為 8,所以該組變量的分組數目為 8。結果為:(1)、(7)、(12,12)、(22)、(30)、(34)、(38)、(46)。

5、基于信息熵分組

在學習信息熵分組之前,先了解一下信息量和熵的概念。

信息量

香農(Shannon)被稱為“信息論之父”,他認為“信息是用來消除隨機不確定性的東西”。即,衡量信息量大小就看這個信息消除不確定性的程度。信息量是對事件發生概率的度量,一個事件發生的概率越低,則這個事件包含的信息量越大,這跟我們直觀上的認知也是吻合的,越稀奇的新聞包含的信息量越大,因為這種新聞出現的概率低,即信息量的大小和事件發生的概率成反比。香農提出了一個定量衡量信息量的公式:式中,表示 事件發生的概率。信息量度量的是“一個具體事件發生”所帶來的信息。

熵是在結果出來之前對可能產生的信息量的期望——考慮該隨機變量的所有可能取值,即所有可能發生事件所帶來的信息量的期望。熵越大表示結果的不確定性越大,熵為0表示沒有任何不確定性。熵的計算公式為:式中,表示 事件發生的概率,為 中所有類別的個數。按照隨機變量的所有可能取值劃分數據的總熵 是所有事件的熵的加權平均:式中,是第 個事件出現的比例,是第 個可能取值出現的次數,是所有取值出現的總次數。所以,基于信息熵進行數據分組的具體做法是:
  • 1、對屬性 的所有取值從小到大排序
  • 2、遍歷屬性 的每個值 ,將屬性 的值分為兩個區間 、,使得將其作為分隔點劃分數據集后的熵 最小,熵 的計算方式見式上邊的兩個公式
  • 3、當劃分后的熵大于設置的閾值且小于指定的數據分組個數時,遞歸對 、 執行步驟2中的劃分

6、基于用戶是否點擊和信息熵對商品價格進行離散化

接下來通過一個實例看一下如何基于信息熵對數據進行離散化。基于信息熵的數據離散化算法是有監督學習算法。在使用該方法對數據進行離散化時,需 要數據有對應的標簽。假設現在有一份下面這樣的數據,其表示的是用戶是否點擊商品和商品價格之間的關系(當然這是一份假設的數據)。價格標簽價格標簽價格標簽
56145317640
8711011211
129090280
230881491
342122203611
64119701640
6302398112101
276415921
232305611
對該份數據進行離散化,其實現的代碼如下:#?Author:?Thinkgamer#?Desc??:?基于信息熵的數據離散化import?numpy?as?npimport?mathclass?DataSplitByEntropy:def?__init__(self,?group,?threshold):#?最大分組數
????????self.max_group?=?group#?停止劃分的最小熵
????????self.min_threshold?=?threshold#?保存最終結果變量
????????self.result?=?dict()#?加載數據def?load_data(self):
????????data?=?np.array(
????????????[
????????????????[56,?1],???[87,?1],??[129,?0],??[23,?0],???[342,?1],?
????????????????[641,?1],??[63,?0],??[2764,?1],?[2323,?0],?[453,?1],?
????????????????[10,?1],???[9,?0],???[88,?1],???[222,?0],??[97,?0],
????????????????[2398,?1],?[592,?1],?[561,?1],??[764,?0],??[121,?1],
????????????????[28,?0],???[49,?1],??[361,?1],??[164,?0],??[1210,?1]
????????????]
????????)return?data#?計算按照數據指定數據分組后的香農熵def?cal_entropy(self,?data):
????????num_data?=?len(data)
????????label_counts?=?{}for?feature?in?data:#?獲得標簽
????????????one_label?=?feature[-1]#?如果標簽不在新定義的字典里則創建該標簽
????????????label_counts.setdefault(one_label,?0)?#?該類標簽下含有數據的個數?
????????????label_counts[one_label]?+=?1
????????entropy?=?0.0for?key?in?label_counts:#?同類標簽出現的概率
????????????prob?=?float(label_counts[key])?/?num_data#?以2為底求對數
????????????entropy?-=?prob?*?math.log(prob,?2)return?entropy#?按照調和信息熵最小化原則分割數據集def?split(self,?data):#?inf為正無窮大
????????min_entropy?=?np.inf#?記錄最終分割索引
????????index?=?-1#?按照第一列對數據進行排序
????????sort_data?=?data[np.argsort(data[:,?0])]#?初始化最終分割數據后的熵
????????last_e1,?last_e2?=?-1,?-1#?返回的數據結構,包含數據和對應的熵
????????S1?=?dict()
????????S2?=?dict()for?i?in?range(len(sort_data)):#?分割數據集
????????????split_data_1,?split_data_2?=?sort_data[:?i?+?1],?sort_data[i?+?1?:]?
????????????entropy1,?entropy2?=?(?self.cal_entropy(split_data_1),?self.cal_entropy(split_data_2)?)?#?計算信息熵
????????????entropy?=?entropy1?*?len(split_data_1)?/?len(sort_data)?+??entropy2?*?len(?split_data_2)?/?len(sort_data)#?如果調和平均熵小于最小值if?entropy?????????????????min_entropy?=?entropy?
????????????????index?=?i
????????????????last_e1?=?entropy1?
????????????????last_e2?=?entropy2
????????S1["entropy"]?=?last_e1
????????S1["data"]?=?sort_data[:?index?+?1]
????????S2["entropy"]?=?last_e2
????????S2["data"]?=?sort_data[index?+?1?:]return?S1,?S2,?entropy#?對數據進行分組def?train(self,?data):#?需要遍歷的?key
????????need_split_key?=?[0]#?將整個數據作為一組
????????self.result.setdefault(0,?{})?
????????self.result[0]["entropy"]?=?np.inf?
????????self.result[0]["data"]?=?data
????????group?=?1for?key?in?need_split_key:
????????????S1,?S2,?entropy?=?self.split(self.result[key]["data"])#?如果滿足條件if?entropy?>?self.min_threshold?or?group?????????????????self.result[key]?=?S1
????????????????newKey?=?max(self.result.keys())?+?1?
????????????????self.result[newKey]?=?S2
????????????????need_split_key.extend([key])?
????????????????need_split_key.extend([newKey])
????????????????group?+=?1else:?breakif?__name__?==?"__main__":
????dse?=?DataSplitByEntropy(group=6,threshold=0.3)?
????data?=?dse.load_data()
????dse.train(data)
????print("result?is?{}".format(dse.result))輸出結果為:result?is?{0:?{'entropy':?0.8112781244591328,?'data':?array([[?9,??0],
???????[10,??1],
???????[23,??0],
???????[28,??0]])},?1:?{'entropy':?0.0,?'data':?array([[342,???1],
???????[361,???1],
???????[453,???1],
???????[561,???1],
???????[592,???1],
???????[641,???1]])},?2:?{'entropy':?0.0,?'data':?array([[129,???0]])},?3:?{'entropy':?0.9709505944546686,?'data':?array([[?764,????0],
???????[1210,????1],
???????[2323,????0],
???????[2398,????1],
???????[2764,????1]])},?4:?{'entropy':?0.863120568566631,?'data':?array([[?49,???1],
???????[?56,???1],
???????[?63,???0],
???????[?87,???1],
???????[?88,???1],
???????[?97,???0],
???????[121,???1]])},?5:?{'entropy':?0.0,?'data':?array([[164,???0],
???????[222,???0]])}}分析結果可以看出,熵越大的簇類下數據對應的標簽越凌亂,熵為0的簇類下數據對應的標簽是一致的,這里可以自行調節group、threshold參數觀察結果。

總結

以上是生活随笔為你收集整理的归一化处理公式_特征工程连续特征的常见处理方式(含实例)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。