資料預處理系列 (五)分類變數處理

2021-07-14 00:12:05 字數 4279 閱讀 5096

博主簡介:風雪夜歸子(英文名: allen),機器學習演算法攻城獅,喜愛鑽研machine learning的黑科技,對deep learning和artificial intelligence充滿興趣,經常關注kaggle資料探勘競賽平台,對資料、machine learning和artificial intelligence有興趣的各位童鞋可以一起**哦,個人csdn部落格: 

分類變數是經常遇到的問題。一方面它們提供了資訊;另一方面,它們可能是文字形式——純文字或者與文字相關的整數——就像**的索引一樣。

因此,我們在建模的時候往往需要將這些變數量化,但是僅僅用簡單的id或者原來的形式是不行的。因為我們也需要避免在上一節裡通過閾值建立二元特徵遇到的問題。如果我們把資料看成是連續的,那麼也必須解釋成連續的。

這裡boston資料集不適合演示。雖然它適合演示二元特徵,但是用來建立分類變數不太合適。因此,這裡用iris資料集演示。

解決問題之前先把問題描述清楚。假設有乙個問題,其目標是**花萼的寬度;那麼花的種類就可能是乙個有用的特徵。

首先,讓我們匯入資料:

from

sklearn

import

datasets

iris

=datasets

.load_iris()x

=iris

.datay=

iris

.target

現在xy都獲得了對應的值,我們把它們放到一起:

import

numpy

asnpd=

np.column_stack((x

,y))

下面我們把花型別y對應那一列轉換成分類特徵:

from

sklearn

import

preprocessing

text_encoder

=preprocessing

.onehotencoder

()text_encoder

.fit_transform(d

[:,-

1:])

.toarray

()[:

5]

array([[ 1.,  0.,  0.],

[ 1., 0., 0.],

[ 1., 0., 0.],

[ 1., 0., 0.],

[ 1., 0., 0.]])

這裡,編碼器為每個分類變數建立了額外的特徵,轉變成乙個稀疏矩陣。矩陣是這樣定義的:每一行由0和1構成,對應的分類特徵是1,其他都是0。用稀疏矩陣儲存資料很合理。

text_encoder是乙個標準的scikit-learn模型,可以重複使用:

text_encoder

.transform(np

.ones((3

,1))).

toarray

()

array([[ 0.,  1.,  0.],

[ 0., 1., 0.],

[ 0., 1., 0.]])

在scikit-learn和python庫中,還有一些方法可以建立分類變數。如果你更傾向於用scikit-learn,而且分類編碼原則很簡單,可以試試dictvectorizer。如果你需要處理更複雜的分類編碼原則,patsy是很好的選擇。

dictvectorizer

dictvectorizer可以將字串轉換成分類特徵:

from

sklearn.feature_extraction

import

dictvectorizerdv=

dictvectorizer

()my_dict=[

foriiny

]dv.fit_transform

(my_dict).

toarray

()[:

5]

array([[ 1.,  0.,  0.],

[ 1., 0., 0.],

[ 1., 0., 0.],

[ 1., 0., 0.],

[ 1., 0., 0.]])

python的詞典可以看成是乙個稀疏矩陣,它們只包含非0值。

pasty

patsy是另乙個分類變數編碼的包。經常和statsmodels一起用,patsy可以把一組字串轉換成乙個矩陣。

這部分內容與 scikit-learn關係不大,跳過去也沒關係。

例如,如果xy都是字串,dm = patsy.design_matrix("x + y")將建立適當的列。如果不是,c(x)將生成乙個分類變數。

例如,初看iris.target,可以把它當做是乙個連續變數。因此,用下面的命令處理:

import

patsy

patsy

.dmatrix

("0 + c(species)"

,)

designmatrix with shape (150, 3)

c(species)[0] c(species)[1] c(species)[2]

1 0 0

1 0 0

1 0 0

1 0 0

1 0 0

1 0 0

1 0 0

1 0 0

1 0 0

1 0 0

1 0 0

1 0 0

1 0 0

1 0 0

1 0 0

1 0 0

1 0 0

1 0 0

1 0 0

1 0 0

1 0 0

1 0 0

1 0 0

1 0 0

1 0 0

1 0 0

1 0 0

1 0 0

1 0 0

1 0 0

[120 rows omitted]

terms:

'c(species)' (columns 0:3)

(to view full data, use np.asarray(this_obj))

資料預處理1 分類特徵編碼

背景 we don t talk anymore 很多時候,在我們拿到的資料集裡,特徵不都是連續的值,而是由某些離散化取值的資料組成。例如,性別特徵可以具有如下取值 male female 天氣特徵有如下取值 rainy sunny snowy 這樣的特徵是無法直接被模型識別的,因此需要將這些特徵轉...

新聞分類 資料預處理

結構化資料,是可以表示成多行多列的形式,並且,每行 列 都有著具體的含義。非結構化資料,無法合理地表示為多行多列的形式,即使那樣表示,每行 列 也沒有具體的含義。文字資料,是一種非結構化資料,與我們之前分析的結構化資料有所不同。因此,其預處理的步驟與方式也會與結構化資料有所差異。文字資料預處理主要包...

系列二 資料預處理

旨在對資料探勘有個系統的認識,這部分僅僅是對於資料預處理!對於常規的資料預處理主要分為以下4步驟 1 資料清洗 解決缺失值 異常值 離群點的問題 2 資料整合 解決樣本重複 指標構建 屬性高度相似的問題 2 資料規約 解決資料規模過大的問題 4 資料變換 將資料轉化為更方便分析的資料 1 填充缺失值...