對分類型變量,進(jìn)行編碼處理——pd.get_dummies()、LabelEncoder()施掏、oneHotEncoder()

對分類型變量,進(jìn)行編碼處理——pd.get_dummies()、LabelEncoder()耙箍、oneHotEncoder()

背景:

在拿到的數(shù)據(jù)里物喷,經(jīng)常有分類型變量的存在扇丛,如下:
球鞋品牌:Nike、adidas隘蝎、 Vans、PUMA曼振、CONVERSE
性別:男木羹、女
顏色:紅抛人、黃蚪黑、藍(lán)抒寂、綠
However,sklearn大佬不能直接分析這類變量呀。在回歸,分類躬翁,聚類等機(jī)器學(xué)習(xí)算法中,特征之間距離的計(jì)算或相似度的計(jì)算是算法關(guān)鍵部分拼卵,而常用的距離或相似度的計(jì)算都是在歐式空間的相似度計(jì)算印荔,計(jì)算余弦相似性,基于的就是歐式空間水泉。于是,我們要對這些分類變量進(jìn)行啞變量處理,又或者叫虛擬變量份殿。
缺點(diǎn):
當(dāng)類別的數(shù)量很多時(shí)夫壁,特征空間會變得非常大。在這種情況下姨蝴,一般可以用PCA來減少維度吨些。而且one hot encoding+PCA這種組合在實(shí)際中也非常有用黔寇。有些基于樹的算法在處理變量時(shí),并不是基于向量空間度量霎苗,數(shù)值只是個類別符號检眯,即沒有偏序關(guān)系刽严,所以不用進(jìn)行獨(dú)熱編碼恕曲。Tree Model不太需要one-hot編碼: 對于決策樹來說,one-hot的本質(zhì)是增加樹的深度吊履。
In summary,
要是one hot encoding的類別數(shù)目不太多腾窝,可優(yōu)先考慮驴娃。

一.pd.get_dummies()簡單&粗暴

pandas.get_dummies(data, prefix=None, prefix_sep='_', dummy_na=False, columns=None, sparse=False, drop_first=False, dtype=None)
官網(wǎng)文檔:
http://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.get_dummies.html

輸入:array-like, Series, or DataFrame
輸出:DataFrame
主要參數(shù)說明:
data : array-like, Series, or DataFrame
prefix : 給輸出的列添加前綴,如prefix="A",輸出的列會顯示類似
prefix_sep : 設(shè)置前綴跟分類的分隔符sepration,默認(rèn)是下劃線"_"
一般,我們輸入data就夠了向楼。如果要專門關(guān)注Nan這類東東宋列,可設(shè)置dummy_na=True,專門生成一列數(shù)據(jù)。
見下面的栗子:(簡直不要太容易)

import numpy as np
import pandas as pd
data = pd.DataFrame({"學(xué)號":[1001,1002,1003,1004],
                    "性別":["男","女","女","男"],
                    "學(xué)歷":["本科","碩士","專科","本科"]})
data

學(xué)歷 學(xué)號 性別
0 本科 1001
1 碩士 1002
2 專科 1003
3 本科 1004
pd.get_dummies(data)

學(xué)號 學(xué)歷_專科 學(xué)歷_本科 學(xué)歷_碩士 性別_女 性別_男
0 1001 0 1 0 0 1
1 1002 0 0 1 1 0
2 1003 1 0 0 1 0
3 1004 0 1 0 0 1
pd.get_dummies(data,prefix="A")

學(xué)號 A_屘磷埃科 A_本科 A_碩士 A_女 A_男
0 1001 0 1 0 0 1
1 1002 0 0 1 1 0
2 1003 1 0 0 1 0
3 1004 0 1 0 0 1
pd.get_dummies(data,prefix=["A","B"],prefix_sep="+")

學(xué)號 A+屓哂龋科 A+本科 A+碩士 B+女 B+男
0 1001 0 1 0 0 1
1 1002 0 0 1 1 0
2 1003 1 0 0 1 0
3 1004 0 1 0 0 1

二.sklearn的崽一:LabelEncoder 將不連續(xù)的數(shù)字or文本進(jìn)行編號

sklearn.preprocessing.LabelEncoder()
官方文檔:
https://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.LabelEncoder.html

from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
le.fit([1,5,67,100])
le.transform([1,1,100,67,5])
#輸出: array([0,0,3,2,1])

array([0, 0, 3, 2, 1], dtype=int64)

from sklearn import preprocessing
le = preprocessing.LabelEncoder()
le.fit([1, 3, 3, 7])
LabelEncoder()
le.transform([1, 1, 3, 7]) 
#array([0, 0, 1, 2]...)
le.classes_   #查看分類
#array([1, 2, 6])
le.inverse_transform([0, 0, 1, 2])  #transform的逆向
#array([1, 1, 2, 6])    

array([1, 1, 3, 7])

三.sklearn的崽二:OneHotEncoder 對表示分類的數(shù)字進(jìn)行編碼,輸出跟dummies一樣

sklearn.preprocessing.OneHotEncoder(n_values=None, categorical_features=None, categories=None, sparse=True, dtype=<class ‘numpy.float64’>, handle_unknown=’error’)
官方文檔:
https://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.OneHotEncoder.html
注意:
輸入的應(yīng)該是表示類別的數(shù)字,如果輸入文本,會報(bào)錯的壳繁。

from sklearn.preprocessing import OneHotEncoder
OHE = OneHotEncoder()
OHE.fit(data)

---------------------------------------------------------------------------

ValueError                                Traceback (most recent call last)

<ipython-input-7-ba3b2772e40d> in <module>()
      1 from sklearn.preprocessing import OneHotEncoder
      2 OHE = OneHotEncoder()
----> 3 OHE.fit(data)

F:\Anaconda\lib\site-packages\sklearn\preprocessing\data.py in fit(self, X, y)
   1954         self
   1955         """
-> 1956         self.fit_transform(X)
   1957         return self
   1958 

F:\Anaconda\lib\site-packages\sklearn\preprocessing\data.py in fit_transform(self, X, y)
   2017         """
   2018         return _transform_selected(X, self._fit_transform,
-> 2019                                    self.categorical_features, copy=True)
   2020 
   2021     def _transform(self, X):

F:\Anaconda\lib\site-packages\sklearn\preprocessing\data.py in _transform_selected(X, transform, selected, copy)
   1807     X : array or sparse matrix, shape=(n_samples, n_features_new)
   1808     """
-> 1809     X = check_array(X, accept_sparse='csc', copy=copy, dtype=FLOAT_DTYPES)
   1810 
   1811     if isinstance(selected, six.string_types) and selected == "all":

F:\Anaconda\lib\site-packages\sklearn\utils\validation.py in check_array(array, accept_sparse, dtype, order, copy, force_all_finite, ensure_2d, allow_nd, ensure_min_samples, ensure_min_features, warn_on_dtype, estimator)
    400                                       force_all_finite)
    401     else:
--> 402         array = np.array(array, dtype=dtype, order=order, copy=copy)
    403 
    404         if ensure_2d:

ValueError: could not convert string to float: '男'

看到嗅钻,OneHotEncoder處理不了字符串。要先用

data3 = le.fit_transform(data["性別"])
OHE.fit(data3.reshape(-1,1))
OHE.transform(data3.reshape(-1,1)).toarray()

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

對因變量y不能用OneHotEncoder,要用LabelBinarizer语御。

歡迎指錯。 Thanks船万!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末舱呻,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌雅采,老刑警劉巖刑棵,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件碍舍,死亡現(xiàn)場離奇詭異,居然都是意外死亡吹泡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進(jìn)店門色冀,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人趟径,你說我怎么就攤上這事。” “怎么了望拖?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長架诞。 經(jīng)常有香客問我,道長撑蚌,這世上最難降的妖魔是什么辣恋? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任携狭,我火速辦了婚禮,結(jié)果婚禮上碘举,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好李丰,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般呐舔。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼胳岂。 笑死镶蹋,一個胖子當(dāng)著我的面吹牛淆两,可吹牛的內(nèi)容都是我干的婶熬。 我是一名探鬼主播虽另,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼森缠,長吁一口氣:“原來是場噩夢啊……” “哼腹殿!你這毒婦竟也來了刻炒?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤访敌,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體陈莽,經(jīng)...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡朱盐,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片嫡丙。...
    茶點(diǎn)故事閱讀 39,779評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖惠窄,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤介劫,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布誉碴,位于F島的核電站蹈丸,受9級特大地震影響奋岁,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜光绕,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一景埃、第九天 我趴在偏房一處隱蔽的房頂上張望驯绎。 院中可真熱鬧屈尼,春花似錦、人聲如沸鞭执。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽伞租。三九已至祟同,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間砖顷,已是汗流浹背授嘀。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工压鉴, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人上鞠。 一個月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓轮听,卻偏偏與公主長得像,于是被迫代替她去往敵國和親述寡。 傳聞我的和親對象是個殘疾皇子衩辟,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,700評論 2 354