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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

专栏 | 基于 Jupyter 的特征工程手册:数据预处理(三)

發(fā)布時間:2025/3/15 编程问答 13 豆豆
生活随笔 收集整理的這篇文章主要介紹了 专栏 | 基于 Jupyter 的特征工程手册:数据预处理(三) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

作者:陳穎祥、楊子晗

編譯:AI有道

基于 Jupyter 的特征工程手冊:數(shù)據(jù)預處理的上一篇:

專欄 | 基于 Jupyter 的特征工程手冊:數(shù)據(jù)預處理(一)

專欄 | 基于 Jupyter 的特征工程手冊:數(shù)據(jù)預處理(二)

項目地址:

https://github.com/YC-Coder-Chen/feature-engineering-handbook

本項目將探討數(shù)據(jù)預處理部分:介紹了如何利用 scikit-learn 處理靜態(tài)的連續(xù)變量,利用 Category Encoders 處理靜態(tài)的類別變量以及利用 Featuretools 處理常見的時間序列變量。

目錄

特征工程的數(shù)據(jù)預處理我們將分為三大部分來介紹:

  • 靜態(tài)連續(xù)變量

  • 靜態(tài)類別變量

  • 時間序列變量

本文將介紹 1.2 靜態(tài)類別變量的數(shù)據(jù)預處理(下部分,即1.2.7-1.2.11)。下面將結(jié)合 Jupyter,使用 sklearn,進行詳解。

1.2?Static Categorical Variables 靜態(tài)類別變量

真實世界的數(shù)據(jù)集還往往包含類別特征。但是由于scikit-learn中的模型只能處理數(shù)值特征,因此我們需要將類別特征編碼為數(shù)值特征但是,很多新的模型開始直接提供類別變量支持,例如lightGBM和Catboost。這里我們使用category_encoders包,因為它涵蓋了更多的編碼方法。

1.2.7?M-estimate Encoding M估計量編碼

M估計量編碼是目標編碼的一個簡化版本。與目標編碼器相比,M估計量編碼僅具有一個可調(diào)參數(shù)(m),而目標編碼器具有兩個可調(diào)參數(shù)(min_samples_leaf和smoothing)。

公式:

其中m為用戶定義的參數(shù);
m:m為非負數(shù), m的值越高,先驗概率的權(quán)重則更大。
????′????為類別特征X中類別k的編碼值;
Prior:目標變量的先驗概率/期望值;
????+:訓練集中特征X類別為k,而且具有正因變量標簽的樣本數(shù);
????+:訓練集中具有正因變量標簽的樣本數(shù);

參考文獻:Micci-Barreca, D. (2001). A preprocessing scheme for high-cardinality categorical attributes in classification and prediction problems. ACM SIGKDD Explorations Newsletter, 3(1), 27-32.

import numpy as np import pandas as pd from category_encoders.m_estimate import MEstimateEncoder # category_encoders 直接支持dataframe# 隨機生成一些訓練集 train_set = pd.DataFrame(np.array([['male',10],['female', 20], ['male',10], ['female',20],['female',15]]),columns = ['Sex','Type']) train_y = np.array([False, True, True, False, False])# 隨機生成一些測試集, 并有意讓其包含未在訓練集出現(xiàn)過的類別與缺失值 test_set = pd.DataFrame(np.array([['female',20],['male', 20], ['others',15], ['male',20],['female',40], ['male', 25]]),columns = ['Sex','Type']) test_set.loc[4,'Type'] = np.nan train_set # 原始訓練集

test_set # 原始測試集

encoder = MEstimateEncoder(cols=['Sex','Type'], handle_unknown='value', handle_missing='value').fit(train_set,train_y) # 在訓練集上訓練 encoded_train = encoder.transform(train_set) # 轉(zhuǎn)換訓練集 encoded_test = encoder.transform(test_set) # 轉(zhuǎn)換測試集# handle_unknown 和 handle_missing 被設定為 'value' # 在目標編碼中,handle_unknown 和 handle_missing 僅接受 ‘error’, ‘return_nan’ 及 ‘value’ 設定 # 兩者的默認值均為 ‘value’, 即對未知類別或缺失值填充訓練集的因變量平均值encoded_test # 編碼后的變量數(shù)與原類別變量數(shù)一致

# 驗證一下計算的結(jié)果,在測試集中,‘male’類別的編碼值為 0.466667y_positive = 2 # 在訓練集中,共有兩個樣本有正的因變量標簽 n_positive = 1 # 在訓練集中,共有兩個樣本在變量‘Sex’中有‘male’標簽,在兩個樣本中僅有一個有正的因變量標簽 prior = train_y.mean() # 訓練集因變量先驗概率 m = 1.0 # 默認值 male_encode = (n_positive + prior * m)/(y_positive + m) male_encode # return 0.4666666666666666,與要驗證的值吻合

0.4666666666666666

encoded_train # 訓練集結(jié)果

1.2.8?James-Stein Encoder James-Stein 編碼

James-Stein編碼也是一種基于目標編碼的編碼方法。與M估計量編碼一樣,James-Stein編碼器也嘗試通過參數(shù)B來平衡先驗概率與觀測到的條件概率。但與目標編碼與M估計量編碼不同的是,James-Stein編碼器通過方差比而不是樣本大小來平衡兩個概率。

James-Stein編碼可使用獨立方法,合并方法等多種方法來估計參數(shù)B。有關(guān)更多信息,請參閱category_encoders官方網(wǎng)站:

http://contrib.scikit-learn.org/categorical-encoding/jamesstein.html

James-Stein編碼假定服從正態(tài)分布。因此為了滿足所需的假設,Category Encoders默認使用對數(shù)比來轉(zhuǎn)換二分類問題。

獨立方法的公式:

其中,
????′????是類別特征X中類別k的編碼值;
先驗概率:目標變量的先驗概率/期望值;
????+:在訓練集中,在類別特征X上的標簽為k且具有因變量正標簽的樣本數(shù);
????: 在訓練集中,在類別特征X上標簽為k的樣本數(shù);?

????????????(????????):訓練集中,在特征X上標簽為k的樣本因變量方差;?

????????????(????):總體因變量的方差;?

????????????(????????)和????????????(????)都應通過樣本統(tǒng)計數(shù)據(jù)進行估算。

從直覺的角度來講,B起到來平衡先驗概率與觀測到的條件概率的作用,若條件概率的均值不可靠(y_k具有高方差),則我們應當對先驗概率賦予更大的權(quán)重。

import numpy as np import pandas as pd from category_encoders.james_stein import JamesSteinEncoder # category_encoders 直接支持dataframe# 隨機生成一些訓練集 train_set = pd.DataFrame(np.array([['male',10],['female', 20], ['male',10], ['female',20],['female',15]]),columns = ['Sex','Type']) train_y = np.array([False, True, True, False, False])# 隨機生成一些測試集, 并有意讓其包含未在訓練集出現(xiàn)過的類別與缺失值 test_set = pd.DataFrame(np.array([['female',20],['male', 20], ['others',15], ['male',20],['female',40], ['male', 25]]),columns = ['Sex','Type']) test_set.loc[4,'Type'] = np.nan train_set # 原始訓練集

test_set # 原始測試集

encoder = JamesSteinEncoder(cols=['Sex','Type'], handle_unknown='value', model='independent', handle_missing='value').fit(train_set,train_y) # 在訓練集上訓練 encoded_train = encoder.transform(train_set) # 轉(zhuǎn)換訓練集 encoded_test = encoder.transform(test_set) # 轉(zhuǎn)換測試集# handle_unknown 和 handle_missing 被設定為 'value' # 在目標編碼中,handle_unknown 和 handle_missing 僅接受 ‘error’, ‘return_nan’ 及 ‘value’ 設定 # 兩者的默認值均為 ‘value’, 即對未知類別或缺失值填充訓練集的因變量平均值encoded_test # 編碼后的變量數(shù)與原類別變量數(shù)一致# 因為在category_encoders中,其對前文所述的公式做了一些修改,故此處不會進一步驗證結(jié)果

encoded_train # 訓練集結(jié)果

1.2.9?Weight of Evidence Encoder 證據(jù)權(quán)重編碼

與上述方法類似,證據(jù)權(quán)重編碼器也是根據(jù)類別變量與因變量的關(guān)系對分類變量進行編碼。

公式:

以上是WoE的原始定義,但在category_encoders中,它還增加了正則項以應對過擬合。帶正則項的 ????????????????????????????????????????????????_????????_???????????????????????????????? , ????????????????????????????????????????????????_????????_???????????????????????????????? 如下所示:

import numpy as np import pandas as pd from category_encoders.woe import WOEEncoder # category_encoders 直接支持dataframe# 隨機生成一些訓練集 train_set = pd.DataFrame(np.array([['male',10],['female', 20], ['male',10], ['female',20],['female',15]]),columns = ['Sex','Type']) train_y = np.array([False, True, True, False, False])# 隨機生成一些測試集, 并有意讓其包含未在訓練集出現(xiàn)過的類別與缺失值 test_set = pd.DataFrame(np.array([['female',20],['male', 20], ['others',15], ['male',20],['female',40], ['male', 25]]),columns = ['Sex','Type']) test_set.loc[4,'Type'] = np.nan train_set # 原始訓練集

test_set # 原始測試集

encoder = WOEEncoder(cols=['Sex','Type'], handle_unknown='value', handle_missing='value').fit(train_set,train_y) # 在訓練集上訓練 encoded_train = encoder.transform(train_set) # 轉(zhuǎn)換訓練集 encoded_test = encoder.transform(test_set) # 轉(zhuǎn)換測試集# handle_unknown 和 handle_missing 被設定為 'value' # 在目標編碼中,handle_unknown 和 handle_missing 僅接受 ‘error’, ‘return_nan’ 及 ‘value’ 設定 # 兩者的默認值均為 ‘value’, 即對未知類別或缺失值填充訓練集的因變量平均值encoded_test # 編碼后的變量數(shù)與原類別變量數(shù)一致

# 驗證一下計算的結(jié)果,在測試集中,‘male’類別的編碼值為 0.223144y = 5 # 訓練集中一共有5個樣本 y_positive = 2 # 訓練集中2個樣本有正標簽n = 2 # 訓練集中有2個樣本在Sex變量上有‘male’ 標簽 n_positive = 1 # 這兩個樣本中僅有一個有正標簽regularization = 1.0 # 默認值dis_postive = (n_positive + regularization) / (y_positive + 2 * regularization) dis_negative = (n - n_positive + regularization) / (y - y_positive + 2 * regularization) male_encode = np.log(dis_postive / dis_negative) male_encode # return 0.22314355131420976,與要驗證的值吻合

0.22314355131420976

encoded_train # 訓練集結(jié)果

1.2.10 Leave One Out Encoder 留一法編碼

留一法編碼器通過組因變量均值對每個組進行編碼。此處組指的是類別變量中的不同類別。

留一法同時考慮了過擬合問題,訓練集中的每一個樣本的編碼值是除去該樣本后的組因變量均值。因此,在訓練集中,其可以將處于相同組的每個樣本編碼為不同的值。

留一法以不同的方式對測試集進行編碼。測試集中的每個樣本均由訓練集中的組均值編碼,計算過程中沒有考慮去除該樣本。

公式:

此處,若樣本j擁有k標簽,則( ????????==???? )返回1,否則返回0?

???????????? 為樣本i的標簽為k情形下的編碼值

import numpy as np import pandas as pd from category_encoders.leave_one_out import LeaveOneOutEncoder # category_encoders 直接支持dataframe# 隨機生成一些訓練集 train_set = pd.DataFrame(np.array([['male',10],['female', 20], ['male',10], ['female',20],['female',15]]),columns = ['Sex','Type']) train_y = np.array([False, True, True, False, False])# 隨機生成一些測試集, 并有意讓其包含未在訓練集出現(xiàn)過的類別與缺失值 test_set = pd.DataFrame(np.array([['female',20],['male', 20], ['others',15], ['male',20],['female',40], ['male', 25]]),columns = ['Sex','Type']) test_set.loc[4,'Type'] = np.nan train_set # 原始訓練集

test_set # 原始測試集

encoder = LeaveOneOutEncoder(cols=['Sex','Type'], handle_unknown='value', handle_missing='value').fit(train_set,train_y) # 在訓練集上訓練 encoded_train = encoder.transform(train_set) # 轉(zhuǎn)換訓練集 encoded_test = encoder.transform(test_set) # 轉(zhuǎn)換測試集# handle_unknown 和 handle_missing 被設定為 'value' # 在目標編碼中,handle_unknown 和 handle_missing 僅接受 ‘error’, ‘return_nan’ 及 ‘value’ 設定 # 兩者的默認值均為 ‘value’, 即對未知類別或缺失值填充訓練集的因變量平均值encoded_test # 編碼后的變量數(shù)與原類別變量數(shù)一致 # 結(jié)果可見,所有類別值都被編碼為訓練集中的類別因變量均值

# 訓練集結(jié)果 LeaveOneOutEncoder(cols=['Sex','Type'],handle_unknown='value', handle_missing='value').fit_transform(train_set,train_y)# 進行小驗算: # 對第一個樣本而言,其在Sex變量上的標簽為‘male’ # 除去該樣本后,‘male’標簽樣本的因變量平均值為1.0 (僅剩樣本3有‘male’標簽,且其有正的因變量標簽) # 同理,對第三個同樣有‘male’標簽的樣本,除去它后標簽樣本的因變量平均值變?yōu)榱?.0

1.2.11 Catboost Encoder Catboost 編碼

CatBoost是一個基于樹的梯度提升模型。其在包含大量類別特征的數(shù)據(jù)集問題中具有出色的效果。該模型針對分類特征提出了一種基于“留一法編碼器”的新編碼系統(tǒng)。在使用Catboost編碼器之前,必須先對訓練數(shù)據(jù)隨機排列,因為在Catboost中,編碼是基于“時間”的概念,即數(shù)據(jù)集中觀測值的順序。

公式:

其中,若樣本j擁有k標簽,則( ????????==???? )返回1,否則返回0?

???????????? 為樣本i的標簽為k情形下的編碼值?

Prior 為因變量的先驗概率/期望值?

a為正則化系數(shù)

import numpy as np import pandas as pd from category_encoders.cat_boost import CatBoostEncoder # category_encoders 直接支持dataframe# 隨機生成一些訓練集 train_set = pd.DataFrame(np.array([['male',10],['female', 20], ['male',10], ['female',20],['female',15]]),columns = ['Sex','Type']) train_y = np.array([False, True, True, False, False])# 隨機生成一些測試集, 并有意讓其包含未在訓練集出現(xiàn)過的類別與缺失值 test_set = pd.DataFrame(np.array([['female',20],['male', 20], ['others',15], ['male',20],['female',40], ['male', 25]]),columns = ['Sex','Type']) test_set.loc[4,'Type'] = np.nan train_set # 原始訓練集

test_set # 原始測試集

# 事實上,在使用Catboost編碼前,我們本應先打亂數(shù)據(jù)順序 # 但由于我們的數(shù)據(jù)本身已經(jīng)是隨機生成的,故無需打亂encoder = CatBoostEncoder(cols=['Sex','Type'], handle_unknown='value', handle_missing='value').fit(train_set,train_y) # 在訓練集上訓練 encoded_train = encoder.transform(train_set) # 轉(zhuǎn)換訓練集 encoded_test = encoder.transform(test_set) # 轉(zhuǎn)換測試集# handle_unknown 和 handle_missing 被設定為 'value' # 在目標編碼中,handle_unknown 和 handle_missing 僅接受 ‘error’, ‘return_nan’ 及 ‘value’ 設定 # 兩者的默認值均為 ‘value’, 即對未知類別或缺失值填充訓練集的因變量平均值encoded_test # 編碼后的變量數(shù)與原類別變量數(shù)一致

# 驗證一下計算的結(jié)果,在測試集中,‘male’類別的編碼值為 0.466667Prior = train_y.mean() # 先驗概率 n = 2 # 在訓練集中,兩個樣本在Sex變量上具有‘male’標簽 n_positive = 1 # 這兩個樣本中,僅有一個擁有正標簽 a = 1 # 正則化系數(shù), 默認值為1encoded_male = (n_positive + a * prior) / (n + a) encoded_male # return 0.4666666666666666,與要驗證的值吻合

0.4666666666666666

# 驗證一下訓練集的結(jié)果 CatBoostEncoder(cols=['Sex','Type'],handle_unknown='value', handle_missing='value').fit_transform(train_set,train_y)

# 訓練集中第三個樣本在Sex這一變量上有‘male’標簽,其編碼值為0.2 Prior = train_y.mean() # 先驗概率 n = 1 # 在第三個樣本前僅有一個樣本有‘male’標簽 n_positive = 0 # 這僅有的一個樣本沒有正標簽 a = 1 # 正則化系數(shù)encoded_male = (n_positive + a * Prior) / (n + a) encoded_male # return 0.2

0.2

好了,以上就是關(guān)于靜態(tài)類別變量(下部分)的數(shù)據(jù)預處理介紹。建議讀者結(jié)合代碼,在 Jupyter 中實操一遍。

目前該項目完整中文版正在制作中,請持續(xù)關(guān)注哦~

中文版 Jupyter 地址:

https://github.com/YC-Coder-Chen/feature-engineering-handbook/blob/master/1.%20Data%20Preprocessing.ipynb


推薦閱讀

(點擊標題可跳轉(zhuǎn)閱讀)

干貨 | 公眾號歷史文章精選

我的深度學習入門路線

我的機器學習入門路線圖

重磅!

林軒田機器學習完整視頻和博主筆記來啦!

掃描下方二維碼,添加?AI有道小助手微信,可申請入群,并獲得林軒田機器學習完整視頻 + 博主紅色石頭的精煉筆記(一定要備注:入群?+ 地點 + 學校/公司。例如:入群+上海+復旦。?

長按掃碼,申請入群

(添加人數(shù)較多,請耐心等待)

?

最新 AI 干貨,我在看?

總結(jié)

以上是生活随笔為你收集整理的专栏 | 基于 Jupyter 的特征工程手册:数据预处理(三)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。