數據處理 | pandas入門專題——離散化與one-hot

今天是pandas數據處理專題第7篇文章,能夠點擊上方專輯查看往期文章。node

在上一篇文章當中咱們介紹了對dataframe進行排序以及計算排名的一些方法,在今天的文章當中咱們來了解一下dataframe兩個很是重要的功能——離散化和one-hotweb

離散化

離散對應的反面是連續,離散化也就是將連續性的數值映射到一個離散的值。舉個很簡單的例子,好比說如今有一個特徵是用戶的收入,咱們都知道貧富差距是很是巨大的,一個馬雲的收入頂的上成千上萬人收入之和。而最窮的人收入很是少,甚至天天不到一美圓。api

咱們來設想一下,假設咱們將收入這個值做爲特徵放入模型,會發生什麼。若是是線性模型,很顯然模型會被這個特徵值給帶跑偏。咱們來看下線性迴歸的公式: ,這裏的W表示的樣本矩陣X的係數向量。假設某一維是收入,那麼它對應的係數顯然必須很是很是小,由於樣本當中有馬雲這種頂級大佬的收入存在,也就是說爲了擬合這樣的極端數據,模型被帶跑偏了。數組

這種狀況很是多,由於現實生活當中不少數據的分佈是很是不均勻的。每每不是正態分佈而是二八分佈,甚至更加兩極分化。那針對這種狀況該怎麼處理呢?機器學習

比較簡單也比較經常使用的一種方法就是將它離散化,將本來連續的值映射成離散的變量。好比說收入,咱們再也不直接用收入這個值來做爲特徵,而是將它分紅幾個桶,好比分爲低收入羣體,中等收入羣體,高收入羣體。這樣對模型訓練來講,就不會被帶偏了,可是缺點是損失了部分信息。好比說馬雲和東哥都是高收入羣體,可是兩人的掙錢能力其實仍是相差蠻遠的。若是採用這種方式就體現不出來了,因此離散化的設計也不是拍腦門的,也要根據實際狀況具體分析。編輯器

那麼假設咱們但願在dataframe當中作這樣離散化的操做,應該怎麼辦呢?svg

其實很是簡單,pandas的開發人員早就想到了這個需求,有現成且成熟的api可使用。咱們來看個例子,首先咱們建立一批數據,表示一批用戶的年收入:學習

income = [2000100001500008000200003000050000100000020000000300000000]

而後咱們再人爲的設置分桶用來對收入進行劃分:flex

bins = [030000100000100000001000000000]

以後咱們只須要調用pandas當中的cut方法,將income和bins數組都傳入就能夠了:url

pandas返回的結果是Categorical的對象,表示一種類別。像是(0, 30000]既是這個分桶的值的範圍,也表示這個分桶的名字。咱們也能夠本身傳入咱們定義的分桶名稱來替換這個範圍:

這裏要注意咱們傳入的labels的數量要比bins也就是劃分範圍少一個,由於劃分的區間是半閉半開的,區間的數量是bins-1,因此咱們指定的labels數量也應該是bins-1。在默認的劃分方法當中,採用的是左開右閉區間,和咱們經常使用的左閉右開區間不一樣,咱們能夠經過right=False這個參數將它設置成左閉右開區間。

在使用cut的過程中,若是咱們但願按照值的範圍來進行均等劃分的話,咱們也能夠傳入咱們但願劃分的分桶數量代替bins,這樣pandas會根據這一列值的範圍按照指定的數量進行均分進行劃分:

若是是採用均等劃分,想要對劃分的精度進行限定,能夠經過precision參數進行限定。好比說咱們但願精度保留兩位小數,那麼傳入precision=2便可。

離散化的方法除了cut以外,還有一個叫作qcut,和cut不一樣之處在於qcut是根據分位數進行劃分的。好比咱們但願忽視具體的數值,按照數據的數量進行等分,就須要用到qcut了。

除了傳入想要獲得的劃分數量以外,咱們也能夠指定想要劃分的分位數,是0到1之間的小數,包含端點:

one-hot

one-hot也是機器學習當中很是很是經常使用的一種數據處理方式,one-hot這個詞乍看不是很明白,也有地方翻譯成獨熱碼,也很費解。其實它的含義很簡單,就是將一系列非數值型的值進行類別分桶,

咱們舉個很簡單的例子,假設咱們把男生分爲三種:高富帥、矮矬窮和理工男,咱們如今有4個男生:[高富帥、矮矬窮、理工男、高富帥],這顯然是一個特徵,但問題是大部分模型是不接受字符串類型的特徵的,咱們必須將它轉化成數值才行。問題就在轉化這裏,咱們很難作這個映射。

有人會說咱們可讓高富帥、矮矬窮這些標籤對應不一樣的數值,作一個映射不就能夠了嗎?好比說矮矬窮等於1,高富帥等於2,這樣一映射不就變成數值了嗎?很惋惜不行,緣由也很簡單,由於咱們單純地把它們映射成數值以後,它們就從一個抽象的概念變成數了。抽象的概念之間是沒有大小關係也沒有倍數關係的,可是數值有。好比說高富帥等於2,矮矬窮等於1,那在模型當中是否一個高富帥等於兩個矮矬窮?是否高富帥大於矮矬窮?

這些額外的信息對模型是很是致命的,咱們不但願模型獲得這些信息。最好的方法是咱們生成一個列表,列表當中有三列分別是高富帥、矮矬窮和理工男。你是高富帥就高富帥那一列爲1,其餘列都爲0,同理你是矮矬窮就矮矬窮那一列爲1,其餘列爲0。在這個列表當中每一行只有一列爲1,其餘都爲0,至關於只有一列熱,其餘列都是冷的,one-hot就是這麼來的。

咱們噼裏啪啦說了不少,但實際上one-hot的實現很是簡單,只有一行:

pd.get_dummies(dataframe)

默認獲得的列表的名稱會加上這一列的列名做爲前綴,咱們也能夠本身經過prefix傳入咱們想要的前綴:

多列一塊兒進行one-hot也沒有關係:

總結

離散化和one-hot都是很是經常使用的功能, 通常來講這兩個功能一般會連在一塊兒使用,先將某一個值進行離散化,而後再將離散化的結果進行one-hot,從而適應模型。所以本文的內容很是實用,不要錯過哦。

今天的文章到這裏就結束了,若是喜歡本文的話,請來一波素質三連,給我一點支持吧(關注、轉發、點贊)。

- END -

原文連接,求個關注

相關文章
相關標籤/搜索