使用Python機器學習工具scikit-learn:從類別變量中提取特徵

Scikit-Learn是基於python的機器學習模塊,基於BSD開源許可證。

這個項目最早由DavidCournapeau 在2007年發起的,目前也是由社區自願者進行維護。它的主要特點有操作簡單、高效的數據挖掘和數據分析、無訪問限制、在任何情況下可重新使用、建立在NumPy、SciPy和matplotlib基礎上、使用商業開源協議--BSD許可證等。scikit-learn的基本功能主要被分為六個部分,分類,迴歸,聚類,數據降維,模型選擇,數據預處理等。

使用Python機器學習工具scikit-learn:從類別變量中提取特徵

今天我們將運用Scikit-Learn從類別變量中提取特徵。如果你喜歡,歡迎留言一起探討。

從類別變量中提取特徵

許多問題中的解釋變量是類別變量或者名義變量。類別變量的取值範圍是一組固定值。例如,一個預測職位薪水的應用可能會使用類似職位所在城市這樣的類別變量。類別變量通常使用one-of-k編碼算法或者one-hot編碼算法進行編碼,因此將使用一個二進制特徵表示解釋變量的所有可能取值。

例如,假設我們的模型中有一個city變量,該變量可以從下面3個值中取值:New York、San Francisco或者Chapel Hill。One-hot編碼算法使用每個可能城市的二元特徵來表示變量。scikit-learn類庫中的Dictvectorizer類是一個可以對類別特徵進行one-hot編碼的轉換器,具體用法如代碼1.1所示:

代碼1.1

# In[1]:
from sklearn.feature_extraction import DictVectorizer
onehot_encoder = DictVectorizer()

X= [
{'city': 'New York'},
{'city': 'San Francisco'},
{'city': 'Chapel Hill'}
]
print(onehot_encoder.fit_transform(X).toarray())
# Out[1]:
[[ 0. 1. 0.]
[ 0. 0. 1.]
[ 1. 0. 0.]]

需要注意的是,特徵的順序在結果向量中是隨機的。在第1個訓練實例中,city的值是New York。特徵向量的第2個元素代表New York值,它等同於第1個實例。

將一個類別解釋變量用單個整數特徵表示也許會比較直觀。例如New York可以表示為0,San Francisco表示為1,Chapel Hill表示為2。這種表示法存在一些問題用整數表示城市會對現實中不存在的城市順序進行編碼,同時也會促使模型對城市進行沒有意義的比較。沒有什麼自然順序會使Chapel Hill的編號比San Francisco大1。One-hot編碼算法避免了這個問題,它只對變量的值進行表示。

1.2 特徵標準化

當學習算法使用標準化數據進行訓練時會有更好的性能。回想一下,標準化數據有零平均值和單位方差。零平均值解釋變量相對於原點居中,其平均值為0。當特徵向量所有特徵的方差處於相同量級,則擁有單位方差。如果一個特徵的方差和其他特徵的方差相差太大的數量級,該特徵會控制學習算法,阻止算法從其他變量中學習。當數據沒有標準化時,一些學習算法也會更慢地收斂到最佳參數值。除了我們在前一章中使用的StandardScaler轉換器,prepocessing模塊中的scale函數也可以用於單獨對數據集的任何軸進行標準化,如代碼1.2所示。

代碼1.2

# In[1]:
from sklearn import preprocessing
import numpy as np
X = np.array([
[0., 0., 5., 13., 9., 1.],
[0., 0., 13., 15., 10., 15.],
[0., 3., 15., 2., 0., 11.]
])
print(preprocessing.scale(X))
# Out[1]:
[[ 0. -0.70710678 -1.38873015 0.52489066 0.59299945
-1.35873244]
[ 0. -0.70710678 0.46291005 0.87481777 0.81537425
1.01904933]
[ 0. 1.41421356 0.9258201 -1.39970842 -1.4083737
0.33968311]]

最後,RobustScaler是StandardScaler之外的另一個選擇,它對於異常值具有更好的魯棒性。StandardScaler會從在每個實例值上減去特徵均值,然後除以特徵的標準差。為了減輕大異常值的影響,RobustScaler會減去中位數,然後除以四分位差。四分位數通過把排序後的數據集等分為4個部分來計算。中位數是第2個四分位數,四分位差是第1個四分位數和第3個四分位數的差值。

使用Python機器學習工具scikit-learn:從類別變量中提取特徵

END

本文摘自《scikit-learn機器學習(第2版)

喜歡的朋友歡迎關注我們,並將文章轉發到朋友圈,


分享到:


相關文章: