網站首頁 編程語言 正文
OneHotEncoder獨熱編碼實例
class sklearn.preprocessing.OneHotEncoder(*, categories='auto', drop=None, sparse=True, dtype=<class 'numpy.float64'>, handle_unknown='error')
- 目的:將分類要素編碼為one-hot數字數組
- 輸入:為整數或字符串之類的數組,表示分類(離散)特征所采用的值。
- 這將為每個類別創建一個二進制列,并返回一個稀疏矩陣或密集數組(取決于稀疏參數)默認情況下,編碼器會根據每個功能中的唯一值得出類別(可改為手動)
- 適用于GBDT、XGBoost、Lgb模型中效果都不錯 注意:在最新版本的sklearn中,所有的數據都應該是二維矩陣,所以當它只是單獨一行或一列需要進行
reshape(1, -1)
數據轉換,否則會報錯ValueError: Expected 2D array, got 1D array instead
以下面數據為例(數據源):
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()#查看轉化后的數據
輸入數據由處理后的這種格式:
經過編碼后得出編碼后的數據(數據量過大用元組的形式展現),全部由二進制數0、1表示:
注意:在一對多的情況下y標簽需要使用 sklearn.preprocessing.LabelBinarizer() 函數將多類標簽轉換為二進制標簽
LabelEncoder標簽編碼實例
- 目的:對目標標簽進行編碼,其值介于0和n_classes-1之間
- 輸入可以是數字標簽,也可以是非數字標簽,這里需要注意的是返回的類型是NumPy的array形式,上述
OneHotEncoder ()
返回的是系數矩陣形式。
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)
經過編碼后得出編碼后的數據:
其中最清晰的就是標黑的property_damage
一列,使用One-hot編碼轉換后變成?
屬于0,Yes
屬于2,No
屬于1。
LabelEncoder()
只有一個class_
屬性,是查看每個類別的標簽,在上述基礎上嘗試即最后一個特征所對應的屬性標簽,通俗來講就是這里面需要被編碼的個數就是這些數:
- 果然不出所料,因為這是循環,所以對應的最后一個是
auto_year
,原數據如下圖:
注意:開頭提到的編碼值介于 0 和 n_classes-1 之間于下圖可以清晰理解,里面有n種不同的值,就分成 n-1 類,因為還包括 0
不過 LabelEncoder 標簽編碼我想對用的比較少,一般我都是使用 One-hot 獨熱編碼去處理離散特征。
OrdinalEncoder特征編碼實例
- 目的:將分類特征編碼為整數數組。
- 輸入:是一個類似數組的整數或字符串,表示分類(離散)特征所采用的值,特征會被轉換為序數整數
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)
但是我通過輸出每一個特征結果的時候發現他和LabelEncoder()
編碼出的數據大差不離,特征編碼則通過categories_
查看編碼特征
總而言之就是結果數據是一樣的,但是類型上是不同的,我通過本文了解到它們本質的區別:
-
OrdinalEncoder
用于形狀為 2D 的數據(n_samples, n_features)
-
LabelEncoder
用于形狀為 1D 的數據(n_samples,)
至于為什么,我們從上面兩者的代碼中就可以發現,OrdinalEncoder
編碼出的數據要想fit_transform
擬合,就得使用.reshape(-1, 1)
轉換成二維數據,這一塊和OneHotEncoder
編碼相同,而LabelEncoder
則直接放入即可擬合出數據來,這里也是使用過程中最容易出現的問題。
OrdinalEncoder編碼還是有兩點需要注意的,第一點,他可以接受np.nan缺失值,可根據需求選擇是否處理缺失值;第二點,他有 這么一個參數->handle_unknown=error(默認) ,通過判斷是否存在未知的特征來選擇是否繼續進行程序,當我們們選擇handle_unknown=use_encoded_value時會將存在的未知特征打上unknown_value標簽
#將缺失值全部處理為-1 Enc.set_params(encoded_missing_value=-1,handle_unknown=use_encoded_value).fit_transform()
原文鏈接:https://juejin.cn/post/7142325338553450503
相關推薦
- 2022-08-30 C語言中定義與聲明有哪些區別_C 語言
- 2022-09-01 ASP.NET輕量級MVC框架Nancy的基本用法_實用技巧
- 2022-05-03 Shell內置命令教程之alias和echo_linux shell
- 2022-06-01 C語言?詳解如何刪除有序數組中的重復項_C 語言
- 2022-08-01 使用docker環境變量動態配置nginx的問題小結_docker
- 2022-05-12 Nginx反向代理 對響應網頁中的字符串進行替換設置
- 2022-04-23 uniapp用Promise封裝get和post請求
- 2022-11-11 Navicat?Premium自定義?sql?標簽的創建方式_數據庫其它
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支