sklearn处理文本和分类属性的方式
文章目錄
- 類別轉換成數字
- 類別one-hot
類別轉換成數字
我們看一下文本屬性。在此數據集中,只有一個:ocean_proximity屬性:
housing_cat = housing[['ocean_proximity']] sklearn.utils.shuffle(housing_cat).head()| <1H OCEAN |
| NEAR BAY |
| <1H OCEAN |
| NEAR OCEAN |
| NEAR OCEAN |
它不是任意文本,而是有限個可能的取值,每個值代表一個類別。因此,此屬性是分類屬性。大多數機器學習算法更喜歡使用數字,因此讓我們將這些類別從文本轉到數字:
from sklearn.preprocessing import OrdinalEncoder ordinal_encoder = OrdinalEncoder() housing_cat_encoded = ordinal_encoder.fit_transform(housing_cat) np.random.permutation(housing_cat_encoded)[:5] array([[4.],[1.],[0.],[4.],[4.]])我們看一下每個數字的含義:
ordinal_encoder.categories_ [array(['<1H OCEAN', 'INLAND', 'ISLAND', 'NEAR BAY', 'NEAR OCEAN'],dtype=object)]類別one-hot
上述將類型轉化為數字的方式產生的一個問題是,機器學習算法會認為兩個相近的值比兩個離得較遠的值更為相似一些。在某些情況下這是對的(對一些有序類別,像“壞”“平均”“好”“優秀”),但是,對ocean_proximity而言情況并非如此(例如,類別0和類別4之間就比類別0和類別1之間的相似度更高)。為了解決這個問題,常見的解決方案是給每個類別創建一個二進制的屬性:當類別是“<1HOCEAN”時,一個屬性為1(其他為0),當類別是“INLAND”時,另一個屬性為1(其他為0),以此類推。這就是獨熱編碼,因為只有一個屬性為1(熱),其他均為0(冷)。新的屬性有時候稱為啞(dummy)屬性。ScikitLearn提供了一個OneHotEncoder編碼器,可以將整數類別值轉換為獨熱向量。我們用它來將類別編碼為獨熱向量
from sklearn.preprocessing import OneHotEncoder oh_encoder = OneHotEncoder() housing_1hot = oh_encoder.fit_transform(housing_cat) housing_1hot <20640x5 sparse matrix of type '<class 'numpy.float64'>'with 20640 stored elements in Compressed Sparse Row format>注意到這里的輸出是一個SciPy稀疏矩陣,而不是一個NumPy數組。當你有成千上萬個類別屬性時,這個函數會非常有用。因為在獨熱編碼完成之后,我們會得到一個幾千列的矩陣,并且全是0,每行僅有一個1。占用大量內存來存儲0是一件非常浪費的事情,因此稀疏矩陣選擇僅存儲非零元素的位置。而你依舊可以像使用一個普通的二維數組那樣來使用他,當然如果你實在想把它轉換成一個(密集的)NumPy數組,只需要調用toarray()方法即可:
housing_1hot.toarray() array([[0., 0., 0., 1., 0.],[0., 0., 0., 1., 0.],[0., 0., 0., 1., 0.],...,[0., 1., 0., 0., 0.],[0., 1., 0., 0., 0.],[0., 1., 0., 0., 0.]])關于one-hot的詳細內容,可以參考另一篇文章:數值分箱與one-hot
總結
以上是生活随笔為你收集整理的sklearn处理文本和分类属性的方式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: sklearn综合示例9:分类问题的on
- 下一篇: tensorflow系列之1:加载数据