11個常見的分類特徵的編碼技術

WBOY
發布: 2023-04-12 12:16:09
轉載
1707 人瀏覽過

機器學習演算法只接受數值輸入,所以如果我們遇到分類特徵的時候都會對分類特徵進行編碼,本文總結了常見的11個分類變數編碼方法。

11個常見的分類特徵的編碼技術

1、ONE HOT ENCODING

最受歡迎且常用的編碼方法是One Hot Enoding。一個具有n個觀測值和d個不同值的單一變量被轉換成具有n個觀測值的d個二元變量,每個二元變量使用一位(0,1)進行標識。

例如:

11個常見的分類特徵的編碼技術

編碼後

11個常見的分類特徵的編碼技術

#最簡單的實作是使用pandas的' get_dummies

new_df=pd.get_dummies(columns=[‘Sex’], data=df)
登入後複製

2、Label Encoding

為分類資料變數指派一個唯一識別的整數。這種方法非常簡單,但對於表示無序資料的分類變數是可能會產生問題。例如:具有高值的標籤可以比具有低值的標籤具有更高的優先權。

例如上面的數據,我們編碼後得到了下面的結果:

11個常見的分類特徵的編碼技術

sklearn的LabelEncoder 可以直接轉換:

from sklearn.preprocessing import LabelEncoder
 le=LabelEncoder()
 df[‘Sex’]=le.fit_transform(df[‘Sex’])
登入後複製

3、Label Binarizer

LabelBinarizer 是一個用來從多類別清單建立標籤矩陣的工具類,它將把一個清單轉換成一個列數與輸入集合中惟一值的列數完全相同的矩陣。

例如這個資料

11個常見的分類特徵的編碼技術

轉換後結果為

11個常見的分類特徵的編碼技術

from sklearn.preprocessing import LabelBinarizer
 lb = LabelBinarizer()
 new_df[‘Sex’]=lb.fit_transform(df[‘Sex’])
登入後複製

4、Leave one out Encoding

Leave One Out 編碼時,目標分類特徵變數會對具有相同值的所有記錄會被平均以確定目標變數的平均值。在訓練資料集和測試資料集之間,編碼演算法略有不同。因為考慮到分類的特徵記錄被排除在訓練資料集外,因此被稱為“Leave One Out”。

對特定類別變數的特定值的編碼如下。

ci = (Σj != i tj / (n — 1 + R)) x (1 + εi) where
 ci = encoded value for ith record
 tj = target variable value for jth record
 n = number of records with the same categorical variable value
 R = regularization factor
 εi = zero mean random variable with normal distribution N(0, s)
登入後複製

例如下面的資料:

11個常見的分類特徵的編碼技術

編碼後:

11個常見的分類特徵的編碼技術

##為了示範這個編碼過程,我們建立資料集:

import pandas as pd;
 data = [[‘1’, 120], [‘2’, 120], [‘3’, 140],
 [‘2’, 100], [‘3’, 70], [‘1’, 100],[‘2’, 60],
 [‘3’, 110], [‘1’, 100],[‘3’, 70] ]
 df = pd.DataFrame(data, columns = [‘Dept’,’Yearly Salary’])
登入後複製

然後進行編碼:

import category_encoders as ce
 tenc=ce.TargetEncoder()
 df_dep=tenc.fit_transform(df[‘Dept’],df[‘Yearly Salary’])
 df_dep=df_dep.rename({‘Dept’:’Value’}, axis=1)
 df_new = df.join(df_dep)
登入後複製

這樣就得到了上面的結果。

5、Hashing

當使用雜湊函數時,字串將被轉換為惟一的雜湊值。因為它使用的記憶體很少可以處理更多的分類資料。對於管理機器學習中的稀疏高維度特徵,特徵雜湊是一種有效的方法。它適用於線上學習場景,具有快速、簡單、高效、快速的特點。

例如下面的資料:

11個常見的分類特徵的編碼技術

編碼後

11個常見的分類特徵的編碼技術

程式碼如下:

from sklearn.feature_extraction import FeatureHasher
 # n_features contains the number of bits you want in your hash value.
 h = FeatureHasher(n_features = 3, input_type =’string’)
 # transforming the column after fitting
 hashed_Feature = h.fit_transform(df[‘nom_0’])
 hashed_Feature = hashed_Feature.toarray()
 df = pd.concat([df, pd.DataFrame(hashed_Feature)], axis = 1)
 df.head(10)
登入後複製

6、Weight of Evidence Encoding

(WoE) 開發的主要目標是創建一個預測模型,用於評估信貸和金融業的貸款違約風險。證據支持或駁斥理論的程度取決於其證據權重或 WOE。

11個常見的分類特徵的編碼技術

若P(Goods) / P(Bads) = 1,則WoE為0。如果這個組別的結果是隨機的,那麼P(Bads) > P(Goods),比值比為1,證據的權重(WoE)為0。如果一組中P(Goods) > P(bad),則WoE大於0。

因为Logit转换只是概率的对数,或ln(P(Goods)/P(bad)),所以WoE非常适合于逻辑回归。当在逻辑回归中使用wo编码的预测因子时,预测因子被处理成与编码到相同的尺度,这样可以直接比较线性逻辑回归方程中的变量。

例如下面的数据

11個常見的分類特徵的編碼技術

会被编码为:

11個常見的分類特徵的編碼技術

代码如下:

from category_encoders import WOEEncoder
 df = pd.DataFrame({‘cat’: [‘a’, ‘b’, ‘a’, ‘b’, ‘a’, ‘a’, ‘b’, ‘c’, ‘c’], ‘target’: [1, 0, 0, 1, 0, 0, 1, 1, 0]})
 woe = WOEEncoder(cols=[‘cat’], random_state=42)
 X = df[‘cat’]
 y = df.target
 encoded_df = woe.fit_transform(X, y)
登入後複製

7、Helmert Encoding

Helmert Encoding将一个级别的因变量的平均值与该编码中所有先前水平的因变量的平均值进行比较。

反向 Helmert 编码是类别编码器中变体的另一个名称。它将因变量的特定水平平均值与其所有先前水平的水平的平均值进行比较。

11個常見的分類特徵的編碼技術

会被编码为

11個常見的分類特徵的編碼技術

代码如下:

import category_encoders as ce
 encoder=ce.HelmertEncoder(cols=’Dept’)
 new_df=encoder.fit_transform(df[‘Dept’])
 new_hdf=pd.concat([df,new_df], axis=1)
 new_hdf
登入後複製

8、Cat Boost Encoding

是CatBoost编码器试图解决的是目标泄漏问题,除了目标编码外,还使用了一个排序概念。它的工作原理与时间序列数据验证类似。当前特征的目标概率仅从它之前的行(观测值)计算,这意味着目标统计值依赖于观测历史。

11個常見的分類特徵的編碼技術

TargetCount:某个类别特性的目标值的总和(到当前为止)。

Prior:它的值是恒定的,用(数据集中的观察总数(即行))/(整个数据集中的目标值之和)表示。

featucalculate:到目前为止已经看到的、具有与此相同值的分类特征的总数。

11個常見的分類特徵的編碼技術

编码后的结果如下:

11個常見的分類特徵的編碼技術

代码:

import category_encoders
 category_encoders.cat_boost.CatBoostEncoder(verbose=0,
 cols=None, drop_invariant=False, return_df=True,
 handle_unknown=’value’, handle_missing=’value’,
 random_state=None, sigma=None, a=1)
 
 target = df[[‘target’]]
 train = df.drop(‘target’, axis = 1)
 
 # Define catboost encoder
 cbe_encoder = ce.cat_boost.CatBoostEncoder()
 
 # Fit encoder and transform the features
 cbe_encoder.fit(train, target)
 train_cbe = cbe_encoder.transform(train)
登入後複製

9、James Stein Encoding

James-Stein 为特征值提供以下加权平均值:

  • 观察到的特征值的平均目标值。
  • 平均期望值(与特征值无关)。

James-Stein 编码器将平均值缩小到全局的平均值。该编码器是基于目标的。但是James-Stein 估计器有缺点:它只支持正态分布。

它只能在给定正态分布的情况下定义(实时情况并非如此)。为了防止这种情况,我们可以使用 beta 分布或使用对数-比值比转换二元目标,就像在 WOE 编码器中所做的那样(默认使用它,因为它很简单)。

10、M Estimator Encoding:

Target Encoder的一个更直接的变体是M Estimator Encoding。它只包含一个超参数m,它代表正则化幂。m值越大收缩越强。建议m的取值范围为1 ~ 100。

11、 Sum Encoder

Sum Encoder将类别列的特定级别的因变量(目标)的平均值与目标的总体平均值进行比较。在线性回归(LR)的模型中,Sum Encoder和ONE HOT ENCODING都是常用的方法。两种模型对LR系数的解释是不同的,Sum Encoder模型的截距代表了总体平均值(在所有条件下),而系数很容易被理解为主要效应。在OHE模型中,截距代表基线条件的平均值,系数代表简单效应(一个特定条件与基线之间的差)。

最后,在编码中我们用到了一个非常好用的Python包 “category-encoders”它还提供了其他的编码方法,如果你对他感兴趣,请查看它的官方文档:

http://contrib.scikit-learn.org/category_encoders/

以上是11個常見的分類特徵的編碼技術的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:51cto.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板