1. 程式人生 > >數據預處理之離散化

數據預處理之離散化

存在 Go 行處理 variable RR OS 個數 連接 ssi

按照我們對於變量的分類:分為數值變量和分類變量,數值變量可以分為連續型和離散型,分類變量又有有序的和無序的。下面我將介紹一些對於這些變量進行離散化處理。

無序分類變量的離散化方法:

比如在泰坦尼克號當中,有一個變量叫做乘客登陸的港口,取值為(C, Q, S)代表三個地方。這是一個典型的無序分類變量,我們在進行數據預處理的時候應該如何進行。 一種很容易想到的方法就是把每個值映射為一個數字,比如C=0, Q=1, S=2。 但是這樣容易產生一個問題:我們實際上是把它們當做了有序的數字來進行看待了,2比1大,這就存在了順序關系。但是我們的數據本來並不存在這樣的關系。

為了解決上面的問題,我們使用獨熱編碼(One-Hot Encoding)對無序的分類變量進行處理。對於取值有m種情況的變量,我們用m維來表示。比如上面的變量可以取值100, 010,001, 僅當樣本取值為第i種情況的時候,在第i維上面編碼為1,其余維均編碼為0。獨熱編碼形成的變量也叫做虛變量或者啞變量(dummpy variable)。

sklearn 中有提供的OneHotEncoder的方法

from sklearn.preprocessing import  OneHotEncoder

enc = OneHotEncoder()

enc.fit([[0, 0, 3], [1, 1, 0], [0, 2, 1], [1, 0, 2]])

print(enc.n_values_)

print(enc.transform([[0, 1, 1]]).toarray())
‘‘‘
數據為這樣的情況
0 0 3
1 1 0
0 2 1 
1 0 2
一共有三個特征,第一個特征有兩個取值,第二個特征有三個取值,第四個特征有四個取值
所以n_values_輸出為[2,3,4]
當我們對[0, 1, 1]進行編碼的時候為10 010 0100 

‘‘‘

輸出結果如下:

[2 3 4]
[[1. 0. 0. 1. 0. 0. 1. 0. 0.]]

另外,panda當中也有一個get_dummies方法,可以進行獨熱編碼

import pandas as pd
import seaborn as sns

#我們從seaborn當中調入 titanic的數據。
titanic = sns.load_dataset("titanic")

print(titanic[embarked].head())

embarked_dummpy = pd.get_dummies(titanic[embarked])

print(embarked_dummpy.head())

#我們可以使用 pd.concat方法,把得到的dummpy數據和元數據連接在一起 new_data = pd.concat([titanic, embarked_dummpy], axis=1)

輸出結果如下

0    S
1    C
2    S
3    S
4    S
Name: embarked, dtype: object
   C  Q  S
0  0  0  1
1  1  0  0
2  0  0  1
3  0  0  1
4  0  0  1

有序分類變量的離散化

有序分類變量可以直接利用劃分後的數值。如分類變量 [貧窮,溫飽,小康,富有],直接可以將他們轉換為[0,1,2,3]就可以了。

連續變量的離散化

對於連續變量,我們直接把他們扔進我們的模型當中,為什麽還有進行離散化?

離散化有很多的好處,比如能夠使我們的模型更加的簡單,因為相對於連續類型數據,離散類型數據的可能性更少。對於某些模型比如計算廣告中常用的邏輯回歸,是非常需要我們輸入離散化的特征的。

連續特征離散化的方法可以分為有監督的和無監督的。前者主要是利用了數據集中的類信息。

無監督的方法分為:

等寬劃分:按照相同寬度將數據分成幾等份。缺點是受到異常值的影響比較大。 pandas.cut方法可以進行等寬劃分。

等頻劃分:將數據分成幾等份,每等份數據裏面的個數是一樣的。pandas.qcut方法可以進行等頻劃分。

聚類劃分:使用聚類算法將數據聚成幾類,每一個類為一個劃分。

有監督學習方法:

1R方法

基於信息熵的方法

基於卡方的方法

參考

One-Hot Encoding與類別特征處理

特征工程七種常用方法

連續特征離散化方法綜述

數據預處理之離散化