網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
OneHotEncoder獨(dú)熱編碼實(shí)例
class sklearn.preprocessing.OneHotEncoder(*, categories='auto', drop=None, sparse=True, dtype=<class 'numpy.float64'>, handle_unknown='error')
- 目的:將分類(lèi)要素編碼為one-hot數(shù)字?jǐn)?shù)組
- 輸入:為整數(shù)或字符串之類(lèi)的數(shù)組,表示分類(lèi)(離散)特征所采用的值。
- 這將為每個(gè)類(lèi)別創(chuàng)建一個(gè)二進(jìn)制列,并返回一個(gè)稀疏矩陣或密集數(shù)組(取決于稀疏參數(shù))默認(rèn)情況下,編碼器會(huì)根據(jù)每個(gè)功能中的唯一值得出類(lèi)別(可改為手動(dòng))
- 適用于GBDT、XGBoost、Lgb模型中效果都不錯(cuò) 注意:在最新版本的sklearn中,所有的數(shù)據(jù)都應(yīng)該是二維矩陣,所以當(dāng)它只是單獨(dú)一行或一列需要進(jìn)行
reshape(1, -1)
數(shù)據(jù)轉(zhuǎn)換,否則會(huì)報(bào)錯(cuò)ValueError: Expected 2D array, got 1D array instead
以下面數(shù)據(jù)為例(數(shù)據(jù)源):
from sklearn.preprocessing import OneHotEncoder import pandas as pd train = pd.read_csv('./train.csv') enc = OneHotEncoder(handle_unknown='ignore') numerical_feature = ['policy_annual_premium','insured_education_level','capital-gains','incident_type','incident_severity',\ 'property_damage','bodily_injuries','police_report_available','total_claim_amount','injury_claim','property_claim','vehicle_claim'] data = train[numerical_feature] c = enc.fit_transform(data.values.reshape(1,-1)) c.toarray()#查看轉(zhuǎn)化后的數(shù)據(jù)
輸入數(shù)據(jù)由處理后的這種格式:
經(jīng)過(guò)編碼后得出編碼后的數(shù)據(jù)(數(shù)據(jù)量過(guò)大用元組的形式展現(xiàn)),全部由二進(jìn)制數(shù)0、1表示:
注意:在一對(duì)多的情況下y標(biāo)簽需要使用 sklearn.preprocessing.LabelBinarizer() 函數(shù)將多類(lèi)標(biāo)簽轉(zhuǎn)換為二進(jìn)制標(biāo)簽
LabelEncoder標(biāo)簽編碼實(shí)例
- 目的:對(duì)目標(biāo)標(biāo)簽進(jìn)行編碼,其值介于0和n_classes-1之間
- 輸入可以是數(shù)字標(biāo)簽,也可以是非數(shù)字標(biāo)簽,這里需要注意的是返回的類(lèi)型是NumPy的array形式,上述
OneHotEncoder ()
返回的是系數(shù)矩陣形式。
from sklearn.preprocessing import LabelEncoder Enc=LabelEncoder() def yuchuli(data): numerical_feature = ['policy_annual_premium','insured_education_level','capital-gains','incident_type','incident_severity',\ 'property_damage','bodily_injuries','police_report_available','total_claim_amount','injury_claim','property_claim','vehicle_claim','auto_year'] data=pd.DataFrame() for fea in numerical_feature: data.insert(len(data.columns),fea,Enc.fit_transform(train[fea].values)) return data train_data = yuchuli(train)
經(jīng)過(guò)編碼后得出編碼后的數(shù)據(jù):
其中最清晰的就是標(biāo)黑的property_damage
一列,使用One-hot編碼轉(zhuǎn)換后變成?
屬于0,Yes
屬于2,No
屬于1。
LabelEncoder()
只有一個(gè)class_
屬性,是查看每個(gè)類(lèi)別的標(biāo)簽,在上述基礎(chǔ)上嘗試即最后一個(gè)特征所對(duì)應(yīng)的屬性標(biāo)簽,通俗來(lái)講就是這里面需要被編碼的個(gè)數(shù)就是這些數(shù):
- 果然不出所料,因?yàn)檫@是循環(huán),所以對(duì)應(yīng)的最后一個(gè)是
auto_year
,原數(shù)據(jù)如下圖:
注意:開(kāi)頭提到的編碼值介于 0 和 n_classes-1 之間于下圖可以清晰理解,里面有n種不同的值,就分成 n-1 類(lèi),因?yàn)檫€包括 0
不過(guò) LabelEncoder 標(biāo)簽編碼我想對(duì)用的比較少,一般我都是使用 One-hot 獨(dú)熱編碼去處理離散特征。
OrdinalEncoder特征編碼實(shí)例
- 目的:將分類(lèi)特征編碼為整數(shù)數(shù)組。
- 輸入:是一個(gè)類(lèi)似數(shù)組的整數(shù)或字符串,表示分類(lèi)(離散)特征所采用的值,特征會(huì)被轉(zhuǎn)換為序數(shù)整數(shù)
from sklearn.preprocessing import OrdinalEncoder import pandas as pd import numpy as np train = pd.read_csv('./train.csv') test = pd.read_csv('./test.csv') train.drop_duplicates() Enc=LabelEncoder() Enc=OneHotEncoder() def yuchuli(data_train): numerical_feature = ['incident_severity', 'insured_hobbies', 'vehicle_claim', 'auto_model', 'insured_education_level', 'insured_zip', 'insured_relationship', 'incident_date','auto_year'] data = pd.DataFrame() for fea in numerical_feature: data.insert(len(data.columns), fea, (Enc.fit_transform(train[fea].values.reshape(-1, 1))).tolist()) # return data train_data = yuchuli(train)
但是我通過(guò)輸出每一個(gè)特征結(jié)果的時(shí)候發(fā)現(xiàn)他和LabelEncoder()
編碼出的數(shù)據(jù)大差不離,特征編碼則通過(guò)categories_
查看編碼特征
總而言之就是結(jié)果數(shù)據(jù)是一樣的,但是類(lèi)型上是不同的,我通過(guò)本文了解到它們本質(zhì)的區(qū)別:
-
OrdinalEncoder
用于形狀為 2D 的數(shù)據(jù)(n_samples, n_features)
-
LabelEncoder
用于形狀為 1D 的數(shù)據(jù)(n_samples,)
至于為什么,我們從上面兩者的代碼中就可以發(fā)現(xiàn),OrdinalEncoder
編碼出的數(shù)據(jù)要想fit_transform
擬合,就得使用.reshape(-1, 1)
轉(zhuǎn)換成二維數(shù)據(jù),這一塊和OneHotEncoder
編碼相同,而LabelEncoder
則直接放入即可擬合出數(shù)據(jù)來(lái),這里也是使用過(guò)程中最容易出現(xiàn)的問(wèn)題。
OrdinalEncoder編碼還是有兩點(diǎn)需要注意的,第一點(diǎn),他可以接受np.nan缺失值,可根據(jù)需求選擇是否處理缺失值;第二點(diǎn),他有 這么一個(gè)參數(shù)->handle_unknown=error(默認(rèn)) ,通過(guò)判斷是否存在未知的特征來(lái)選擇是否繼續(xù)進(jìn)行程序,當(dāng)我們們選擇handle_unknown=use_encoded_value時(shí)會(huì)將存在的未知特征打上unknown_value標(biāo)簽
#將缺失值全部處理為-1 Enc.set_params(encoded_missing_value=-1,handle_unknown=use_encoded_value).fit_transform()
原文鏈接:https://juejin.cn/post/7142325338553450503
相關(guān)推薦
- 2021-12-16 Warning: Can‘t perform a React state update on an
- 2022-04-25 C語(yǔ)言的結(jié)構(gòu)體你了解嗎_C 語(yǔ)言
- 2022-10-07 Android?drawFunctor?原理及應(yīng)用詳情_(kāi)Android
- 2022-12-25 利用pycharm調(diào)試ssh遠(yuǎn)程程序并實(shí)時(shí)同步文件的操作方法_python
- 2022-10-04 C語(yǔ)言指針和數(shù)組深入探究使用方法_C 語(yǔ)言
- 2023-02-07 Pytorch中torch.cat()函數(shù)的使用及說(shuō)明_python
- 2021-12-02 利用Matlab仿真實(shí)現(xiàn)圖像煙霧識(shí)別(k-means聚類(lèi)圖像分割+LBP+PCA+SVM)_C 語(yǔ)言
- 2022-07-15 關(guān)于在Redis中使用Pipelining加速查詢(xún)的問(wèn)題_Redis
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過(guò)濾器
- Spring Security概述快速入門(mén)
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支