2萬字闡述-Python 用 XGBoost 進(jìn)行梯度提升的數(shù)據(jù)準(zhǔn)備(收藏)

XGBoost 是一種流行的梯度提升實(shí)現(xiàn),因?yàn)樗乃俣群托阅堋?/p>
在內(nèi)部,XGBoost 模型將所有問題表示為僅將數(shù)值作為輸入的回歸預(yù)測(cè)建模問題。如果您的數(shù)據(jù)采用不同的形式,則必須將其準(zhǔn)備為預(yù)期的格式。
今天講解如何使用 Python 中的 XGBoost 庫準(zhǔn)備用于梯度提升的數(shù)據(jù)。
看完這篇文章你們會(huì)學(xué)習(xí):
如何編碼字符串輸出變量以進(jìn)行分類。
如何使用一種熱編碼準(zhǔn)備分類輸入變量。
如何使用 XGBoost 自動(dòng)處理缺失數(shù)據(jù)。

標(biāo)簽編碼字符串類值
鳶尾花分類問題是具有字符串類值的問題的一個(gè)示例。
這是一個(gè)預(yù)測(cè)問題,其中給定鳶尾花的厘米測(cè)量值,任務(wù)是預(yù)測(cè)給定的花屬于哪個(gè)物種。
下載數(shù)據(jù)集并將其放置在您當(dāng)前的工作目錄中,文件名為“?iris.csv?”。
鳶尾花數(shù)據(jù)集
鳶尾花數(shù)據(jù)集描述
XGBoost 不能按原樣本對(duì)這個(gè)問題進(jìn)行建模,因?yàn)樗筝敵鲎兞渴菙?shù)字變量。
我們可以使用LabelEncoder輕松地將字符串值轉(zhuǎn)換為整數(shù)值。三個(gè)類值(Iris-setosa、Iris-versicolor、Iris-virginica)被映射到整數(shù)值(0、1、2)。
我們將標(biāo)簽編碼器保存為一個(gè)單獨(dú)的對(duì)象,以便我們可以使用相同的編碼方案轉(zhuǎn)換訓(xùn)練數(shù)據(jù)集以及隨后的測(cè)試和驗(yàn)證數(shù)據(jù)集。
下面是一個(gè)完整的示例,演示如何加載 iris 數(shù)據(jù)集。請(qǐng)注意,Pandas 用于加載數(shù)據(jù)以處理字符串類值。
注意:計(jì)算機(jī)運(yùn)行結(jié)果可能會(huì)因算法或評(píng)估程序的隨機(jī)性或數(shù)值精度的差異而有所不同??紤]多次運(yùn)行該示例并比較平均結(jié)果。
運(yùn)行該示例會(huì)產(chǎn)生以下輸出
請(qǐng)注意 XGBoost 模型如何配置為使用multi:softprob目標(biāo)自動(dòng)對(duì)多類分類問題進(jìn)行建模,該目標(biāo)是對(duì)類概率建模的 softmax 損失函數(shù)的變體。這表明在內(nèi)部,輸出類會(huì)自動(dòng)轉(zhuǎn)換為單熱類型編碼。
一種熱編碼分類數(shù)據(jù)
某些數(shù)據(jù)集僅包含分類數(shù)據(jù),例如乳腺癌數(shù)據(jù)集。
該數(shù)據(jù)集描述了乳腺癌活檢的技術(shù)細(xì)節(jié),預(yù)測(cè)任務(wù)是預(yù)測(cè)患者是否有癌癥復(fù)發(fā)。
下載數(shù)據(jù)集并將其放置在您當(dāng)前的工作目錄中,文件名為“?breast-cancer.csv?”。
乳腺癌數(shù)據(jù)集
乳腺癌數(shù)據(jù)集描述
以下是原始數(shù)據(jù)集的示例。

我們可以看到所有 9 個(gè)輸入變量都是分類的并以字符串格式描述。該問題是一個(gè)二元分類預(yù)測(cè)問題,輸出類值也以字符串格式描述。
我們可以重用上一節(jié)中的相同方法,并將字符串類值轉(zhuǎn)換為整數(shù)值,以使用 LabelEncoder 對(duì)預(yù)測(cè)進(jìn)行建模。例如:
我們可以對(duì) X 中的每個(gè)輸入特征使用相同的方法,但這只是一個(gè)起點(diǎn)。
XGBoost 可以假設(shè)每個(gè)輸入變量的編碼整數(shù)值具有序數(shù)關(guān)系。例如,對(duì)于乳房四邊形變量,編碼為 0 的 'left-up' 和編碼為 1 的 'left-low' 具有作為整數(shù)的有意義的關(guān)系。在這種情況下,這個(gè)假設(shè)是不正確的。
相反,我們必須將這些整數(shù)值映射到新的二進(jìn)制變量上,每個(gè)分類值對(duì)應(yīng)一個(gè)新變量。
例如,乳房四邊形變量具有以下值:
我們可以將其建模為 5 個(gè)二元變量,如下所示:
這稱為一種熱編碼。我們可以使用scikit-learn 中的OneHotEncoder類對(duì)所有分類輸入變量進(jìn)行熱編碼。
我們可以在對(duì)每個(gè)特征進(jìn)行標(biāo)簽編碼后對(duì)其進(jìn)行熱編碼。首先,我們必須將特征數(shù)組轉(zhuǎn)換為二維 NumPy 數(shù)組,其中每個(gè)整數(shù)值都是一個(gè)長(zhǎng)度為 1 的特征向量。
然后我們可以創(chuàng)建 OneHotEncoder 并對(duì)特征數(shù)組進(jìn)行編碼
最后,我們可以通過將一個(gè)熱編碼特征一個(gè)一個(gè)地連接起來,將它們添加為新列(軸 = 2)來構(gòu)建輸入數(shù)據(jù)集。我們最終得到一個(gè)由 43 個(gè)二進(jìn)制輸入變量組成的輸入向量
理想情況下,我們可以嘗試不對(duì)某些輸入屬性進(jìn)行熱編碼,因?yàn)槲覀兛梢允褂妹鞔_的序數(shù)關(guān)系對(duì)它們進(jìn)行編碼,例如,第一列年齡的值類似于 '40-49' 和 '50-59'。如果您有興趣擴(kuò)展此示例,則將其留作練習(xí)。
下面是帶有標(biāo)簽和一個(gè)熱編碼輸入變量和標(biāo)簽編碼輸出變量的完整示例。
注意:您的結(jié)果可能會(huì)因算法或評(píng)估程序的隨機(jī)性或數(shù)值精度的差異而有所不同。考慮多次運(yùn)行該示例并比較平均結(jié)果。
運(yùn)行這個(gè)例子,我們得到以下輸出。
我們?cè)俅慰梢钥吹?XGBoost 框架自動(dòng)選擇了 '?binary:logistic?' 目標(biāo),這是這個(gè)二元分類問題的正確目標(biāo)。
支持缺失數(shù)據(jù)
XGBoost 可以自動(dòng)學(xué)習(xí)如何最好地處理丟失的數(shù)據(jù)。
事實(shí)上,XGBoost 旨在處理稀疏數(shù)據(jù),就像上一節(jié)中的一個(gè)熱編碼數(shù)據(jù)一樣,通過最小化損失函數(shù),處理缺失數(shù)據(jù)的方式與處理稀疏或零值的方式相同。
有關(guān)如何在 XGBoost 中處理缺失值的技術(shù)細(xì)節(jié)的更多信息,請(qǐng)參閱論文XGBoost:A Scalable Tree Boosting System 中的第 3.4 節(jié)“稀疏感知拆分查找” 。
Horse Colic 數(shù)據(jù)集是展示這種能力的一個(gè)很好的例子,因?yàn)樗艽蟊壤娜笔?shù)據(jù),大約 30%。
下載數(shù)據(jù)集并將其放置在您當(dāng)前的工作目錄中,文件名為“?horse-colic.csv?”。
馬絞痛數(shù)據(jù)集
馬絞痛數(shù)據(jù)集描述
以下是原始數(shù)據(jù)集的示例。
這些值由空格分隔,我們可以使用 Pandas 函數(shù)read_csv輕松加載它。
加載后,我們可以看到缺失的數(shù)據(jù)用問號(hào)字符 ('?') 標(biāo)記。我們可以將這些缺失值更改為 XGBoost 期望的稀疏值,即值零 (0)。
因?yàn)槿笔?shù)據(jù)被標(biāo)記為字符串,所以那些缺失數(shù)據(jù)的列都被加載為字符串?dāng)?shù)據(jù)類型。我們現(xiàn)在可以將整個(gè)輸入數(shù)據(jù)集轉(zhuǎn)換為數(shù)值。
最后,盡管類值用整數(shù) 1 和 2 標(biāo)記,但這是一個(gè)二元分類問題。我們?cè)?XGBoost 中將二元分類問題建模為邏輯 0 和 1 值。我們可以使用 LabelEncoder 輕松地將 Y 數(shù)據(jù)集轉(zhuǎn)換為 0 和 1 整數(shù),就像我們?cè)邙S尾花示例中所做的那樣。
為了完整起見,下面提供了完整的代碼清單。
注意:您的結(jié)果可能會(huì)因算法或評(píng)估程序的隨機(jī)性或數(shù)值精度的差異而有所不同。考慮多次運(yùn)行該示例并比較平均結(jié)果。
運(yùn)行此示例會(huì)產(chǎn)生以下輸出。
我們可以通過將缺失值標(biāo)記為非零值(例如 1)來梳理 XGBoost 自動(dòng)處理缺失值的效果。
注意:您的結(jié)果可能會(huì)因算法或評(píng)估程序的隨機(jī)性或數(shù)值精度的差異而有所不同??紤]多次運(yùn)行該示例并比較平均結(jié)果。
重新運(yùn)行示例表明模型的準(zhǔn)確度下降。
我們也可以用一個(gè)特定的值來估算缺失的數(shù)據(jù)。
通常對(duì)列使用平均值或中位數(shù)。我們可以使用 scikit-learn SimpleImputer 類輕松估算缺失的數(shù)據(jù)。
下面是完整示例,其中缺失數(shù)據(jù)使用每列的平均值進(jìn)行插補(bǔ)。
注意:計(jì)算機(jī)運(yùn)行結(jié)果可能會(huì)因算法或評(píng)估程序的隨機(jī)性或數(shù)值精度的差異而有所不同??紤]多次運(yùn)行該示例并比較平均結(jié)果。
運(yùn)行此示例,我們看到的結(jié)果相當(dāng)于將值固定為一 (1)。這表明,至少在這種情況下,我們最好用零 (0) 的不同值而不是有效值 (1) 或估算值標(biāo)記缺失值。
當(dāng)您有缺失值時(shí),對(duì)您的數(shù)據(jù)嘗試這兩種方法(自動(dòng)處理和插補(bǔ))是一個(gè)很好的教訓(xùn)。
概括
在這篇博文中,您了解了如何使用 Python 中的 XGBoost 準(zhǔn)備用于梯度提升的機(jī)器學(xué)習(xí)數(shù)據(jù)。
具體來說,你學(xué)到了:
如何使用標(biāo)簽編碼為二進(jìn)制分類準(zhǔn)備字符串類值。
如何使用單熱編碼準(zhǔn)備分類輸入變量以將它們建模為二進(jìn)制變量。
XGBoost 如何自動(dòng)處理缺失數(shù)據(jù)以及如何標(biāo)記和估算缺失值。
Python 用 XGBoost 進(jìn)行梯度提升的數(shù)據(jù)準(zhǔn)備就為大家介紹到這里了,歡迎各位同學(xué)報(bào)名<python數(shù)據(jù)分析和機(jī)器學(xué)習(xí)項(xiàng)目實(shí)戰(zhàn)>微專業(yè)課,學(xué)習(xí)更多相關(guān)知識(shí)
