數據預處理之離散化


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

 

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

  比如在泰坦尼克號當中,有一個變量叫做乘客登陸的港口,取值為(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方法,可以進行獨熱編碼。當get_dummies接受的是一個DataFrame類型的時候,將其中變量類型為object和category的類型(可以使用info()查看類型)轉化為啞變量。int64,float64和bool類型不進行轉換。

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當中的map函數進行映射離散化;

train_df['Sex'] = train_df['Sex'].map({'male':0, 'female':1})

或者是借用sklearn.preprocessing.LabelEncoder 來完成這樣的操作。

 

連續變量的離散化

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

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

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

 

無監督的方法分為:

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

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

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

 

 有監督學習方法:

1R方法

基於信息熵的方法

基於卡方的方法

 

 參考

One-Hot Encoding與類別特征處理

特征工程七種常用方法

連續特征離散化方法綜述

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM