數據預處理之離散化
按照我們對於變量的分類:分為數值變量和分類變量,數值變量可以分為連續型和離散型,分類變量又有有序的和無序的。下面我將介紹一些對於這些變量進行離散化處理。
無序分類變量的離散化方法:
比如在泰坦尼克號當中,有一個變量叫做乘客登陸的港口,取值為(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與類別特征處理
特征工程七種常用方法
連續特征離散化方法綜述
數據預處理之離散化