日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

​数据分析最重要的 3 种特征编码,你真的能分清楚?

發布時間:2024/9/15 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ​数据分析最重要的 3 种特征编码,你真的能分清楚? 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

對于數據處理的新手來說,你可能聽說過:標簽編碼、特征編碼、獨熱編碼?等類似的概念

但是在用的時候卻不知道什么時候用哪個,徹底混為一談

歸根結底,還是對概念混淆了,或者你當時看的帖子就是錯的,被誤導了。

其實這樣的錯誤帖子很多,csdn、博客園,一抓一大把,被誤導也很正常

誤導了沒關系,忘掉錯誤的,從頭開始就行

ok,let's go

首先

需要明確一點,在大多數模型算法中,對于數值型數據,可以直接拿來訓練模型。

但是對于類別型特征,算法不能把字符數據像數值數據一樣構成數組矩陣,所以模型會直接報錯。

這種情況的處理也很容易,使用下面幾種方法進行簡單的特征轉換即可。

這么說你可能不是很理解,舉個例子:

現在有一個用戶數據集,其中用戶字段包括:身高、學歷、性別、婚姻狀態、等級、收入等,預通過這些用戶字段 去預測該用戶是否會發生逾期行為

用戶字段里面除了身高和收入,其他都是類別型特征,如下:

一般情況下,我們是這樣轉換的:

  • 是否逾期: 轉換為 1、 轉換為 0

  • 性別特征: 轉換為 1、 轉換為 0

  • ....

所以,在 sklearn 中,提供了下面幾種方法用來實現這樣的轉換:

?第一種:LabelEncoder

LabelEncoder 能夠將分類特征轉換為分類數值,使用起來也很簡單

直接看代碼:

from?sklearn.preprocessing?import?LabelEncoder #?讀入數據 df_data?=?pd.read_csv("數據.csv",?encoding='gbk') df_data_2?=?df_data.copy()#?特征轉換 le?=?LabelEncoder() df_data_2['是否逾期_fit']?=?le.fit_transform(df_data['是否逾期']) df_data_2['性別_fit']?=?le.fit_transform(df_data['性別'])

文中的代碼用到了 fit_transform 函數,不清楚用法的點這篇,講的很透徹了:做數據處理,你連 fit、transform、fit_transform 都分不清?

轉換后的效果如下:

可以看到,此種方法只能一次轉換一個特征,這個比較 適合于標簽列 進行特征轉換

像上面的需要轉換的特征比較多的情況,可以用第二種方法


?第二種:OrdinalEncoder

OrdinalEncoder 可以實現同樣的功能,而且可以批量

直接看代碼:

from?sklearn.preprocessing?import?LabelEncoder,?OrdinalEncoderdf_data_3?=?df_data.copy() #?特征轉換 df_data_3['是否逾期']?=?le.fit_transform(df_data['是否逾期']) df_data_3[['學歷',?'性別',?'婚姻狀態',?'等級']]?=?OrdinalEncoder().fit_transform(df_data[['學歷',?'性別',?'婚姻狀態',?'等級']])

轉換后的效果如下:

怎么樣,是不是覺得上面這種方法轉換起來是不是更快一些?

快是快,但是,上面這種方法存在本質上的錯誤!

首先,我們轉換的目的是為了讓算法在訓練模型的時候,能夠將類別型特征量化,然后轉換成特征矩陣進行計算等操作

但是,實際上,你將性別轉換為 0 和 1,對于算法來說,1 和 0 是可以進行計算的

將學歷轉換為 1、2、3、4、5,算法會認為 3 對應的學歷是 1 的 3倍。

事實上,我們知道,性別男和女是不可達的,本身就互斥的概念不能通過數值算出來,學歷你總不能說 5個小學學歷=1個碩士學歷 吧?


類似的特征還有:顏色、等級、郵編 等,都不可以直接用上面的方式進行轉換

正確的方式是這樣的:

  • 對了性別特征:用兩列表示,男性列+女性列

  • 對于婚姻狀態特征:也是兩列,已婚列+未婚列

  • ....

對應的處理效果是這樣的:

在 sklearn 中,可以用第三種方法實現這樣的特征轉換


?第三種:OneHotEncoder

OneHotEncoder:獨熱編碼,可以通過創建啞變量的方式進行特征轉換。

代碼如下:

from?sklearn.preprocessing?import?OneHotEncoderdf_data_4?=?df_data.copy() #?特征轉換-獨熱編碼 df_data_onehot?=?OneHotEncoder().fit_transform(df_data[['學歷',?'性別',?'婚姻狀態']]) df_data_onehot.toarray()

轉換后的效果如下:

最終是一個二維數組的形式,之后需要進一步的將二維數組轉換為 DataFrame,然后和原始的 DataFrame 進行合并,并且刪除原特征。

這一步有一個 更簡單、高效 的方法:使用 Pandas 的 get_dummies 函數

#?獨熱編碼 df_data_dummies?=?pd.get_dummies(df_data[['性別',?'婚姻狀態',?'學歷']].head(5)) df_data_dummies

轉換后的效果是一樣的:


?小技巧

上面三種方法針對的特征轉換都是特征 1V1,或者 1V多 的場景。

如果是需要將 多個類別值 轉換成 1個 特征 呢?

比如在 泰坦尼克號生還者預測 里面,乘客姓名中的稱呼就可以作為乘客的 title 進行轉換。

例如:

  • Miss、Mlle、Ms、Mme 為一個等級

  • Col、Major、Capt 為一個等級

  • Master、Don、Dona、Countess、Jonkheer 為一個等級

根據不同稱呼將乘客映射為不同的等級,這種處理方式能極大的提高模型預測的正確率。

對應的代碼可以這樣寫:

title_mapping?=?{'Mr':?1,?'Miss':?2,?'Mlle':?2,?'Ms':?2,?'Mrs':?2,?'Mme':?2,'Rev':?3,?'Dr':?3,?'Col':?4,?'Major':?4,?'Capt':?4,'Master':?5,?'Don':?5,?'Dona':?5,?'Lady':?5,?'Countess':?5,?'Jonkheer':?5,?'Sir':?5,} #?對?title?信息進行轉換 df_data['TitleType']?=?df_data['Title'].map(title_mapping)

本文總結

今天的文章比較簡單,稍微總結一下:

特征轉換一共有三種方式,分別是:LabelEncoder、OrdinalEncoder 和 OneHotEncoder

其中,第一種方式適合標簽列,將 是/否好客戶/壞客戶 等類別標簽進行數值轉換

第二種方式適合特征列,將可以量化的特征,如:年齡、重量、長度、溫度等特征進行批量數值轉換

第三種方式適合特征列,將無法量化、不能用數值代表內在含義的特征進行獨熱編碼。

另外還介紹了如何將 多V1 的數值進行轉換操作。

最后,本文中用到的數據集也比較簡單,需要的同學可以直接下載練練手

鏈接:https://pan.baidu.com/s/14wi199hcbnrp5tvO91F5DQ??

提取碼:1025

推薦閱讀

誤執行了rm -fr /*之后,除了跑路還能怎么辦?!

程序員必備58個網站匯總

大幅提高生產力:你需要了解的十大Jupyter Lab插件

總結

以上是生活随笔為你收集整理的​数据分析最重要的 3 种特征编码,你真的能分清楚?的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。