自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

利用Scikit Learn的Python數(shù)據(jù)預(yù)處理實戰(zhàn)指南

大數(shù)據(jù)
簡而言之,預(yù)處理是指在你將數(shù)據(jù)“喂給”算法之前進行的一系列轉(zhuǎn)換操作。在Python中,scikit-learn庫在sklearn.preprocessing下有預(yù)裝的功能。有更多的選擇來進行預(yù)處理,這將是我們要探索的。

本文主要關(guān)注在Python中進行數(shù)據(jù)預(yù)處理的技術(shù)。學(xué)習(xí)算法的出眾表現(xiàn)與特定的數(shù)據(jù)類型有密切關(guān)系。而對于沒有經(jīng)過縮放或非標(biāo)準(zhǔn)化的特征,學(xué)習(xí)算法則會給出魯莽的預(yù)測。像XGBoost這樣的算法明確要求虛擬編碼數(shù)據(jù),而決策樹算法在有些情況下好像完全不關(guān)心這些!

[[179353]]

簡而言之,預(yù)處理是指在你將數(shù)據(jù)“喂給”算法之前進行的一系列轉(zhuǎn)換操作。在Python中,scikit-learn庫在sklearn.preprocessing下有預(yù)裝的功能。有更多的選擇來進行預(yù)處理,這將是我們要探索的。

讀完本文,你將具備數(shù)據(jù)預(yù)處理的基本技能并對其有更深入的理解。為了方便起見,我附上了進一步學(xué)習(xí)機器學(xué)習(xí)算法的一些資源,并且為更好地掌握這些概念,設(shè)計了幾個小練習(xí)。

可用數(shù)據(jù)集

本文中,我使用了部分的貸款預(yù)測數(shù)據(jù),缺失觀測值的數(shù)據(jù)已被移除(需要數(shù)據(jù)的讀者朋友,請在評論區(qū)留下電郵地址,我們會把數(shù)據(jù)發(fā)給你——譯者注)。

備注:貸款預(yù)測問題中,測試集數(shù)據(jù)是訓(xùn)練集的子集。

現(xiàn)在,讓我們從導(dǎo)入重要的包和數(shù)據(jù)集開始。

利用 Scikit Learn的Python數(shù)據(jù)預(yù)處理實戰(zhàn)指南

對我們的數(shù)據(jù)集進行仔細(xì)觀察。

利用 Scikit Learn的Python數(shù)據(jù)預(yù)處理實戰(zhàn)指南

特征縮放

特征縮放是用來限制變量范圍的方法,以讓它們能在相同的尺度上進行比較。這是在連續(xù)變量上操作的。讓我們輸出數(shù)據(jù)集中所有連續(xù)變量的分布。

利用 Scikit Learn的Python數(shù)據(jù)預(yù)處理實戰(zhàn)指南

理解以上圖示后,我們推斷ApplicantIncome(申請人收入) 和CoapplicantIncome(共同申請人收入) 有相似的尺度范圍(0-50000$),LoanAmount(貸款額度) 以千為單位,范圍在0 到 600$之間,而Loan_Amount_Term(貸款周期)與其它變量完全不同,因為它的單位是月份,而其它變量單位是美元。

如果我們嘗試應(yīng)用基于距離的算法,如KNN,在這些特征上,范圍***的特征會決定最終的輸出結(jié)果,那么我們將得到較低的預(yù)測精度。我們可通過特征縮放解決這個問題。讓我們實踐一下。

資料:閱讀這篇關(guān)于KNN的文章獲得更好的理解。(https://www.analyticsvidhya.com/blog/2014/10/introduction-k-neighbours-algorithm-clustering/)

讓我們在我們的數(shù)據(jù)集中試試KNN,看看它表現(xiàn)如何。

利用 Scikit Learn的Python數(shù)據(jù)預(yù)處理實戰(zhàn)指南

我們得到了大約61%的正確預(yù)測,這不算糟糕,但在真正實踐中,這是否足夠?我們能否將該模型部署于實際問題中?為回答該問題,讓我們看看在訓(xùn)練集中關(guān)于Loan_Status(貸款狀態(tài)) 的分布。

利用 Scikit Learn的Python數(shù)據(jù)預(yù)處理實戰(zhàn)指南

大約有70%貸款會被批準(zhǔn),因為有較高的貸款批準(zhǔn)率,我們就建立一個所有貸款都通過的預(yù)測模型,繼續(xù)操作并檢測我們的預(yù)測精度。

利用 Scikit Learn的Python數(shù)據(jù)預(yù)處理實戰(zhàn)指南

哇!通過猜測,我們獲得63%的精度。這意味著,該模型比我們的預(yù)測模型得到更高的精度?

這可能是因為某些具有較大范圍的無關(guān)緊要的變量主導(dǎo)了目標(biāo)函數(shù)。我們可以通過縮小所有特征到同樣的范圍來消除該問題。Sklearn提供了MinMaxScaler 工具將所有特征的范圍縮小到0-1之間,MinMaxScaler 的數(shù)學(xué)表達式如下所示:

利用 Scikit Learn的Python數(shù)據(jù)預(yù)處理實戰(zhàn)指南

讓我們在我們的問題中試試該工具。

利用 Scikit Learn的Python數(shù)據(jù)預(yù)處理實戰(zhàn)指南

現(xiàn)在,我們已經(jīng)完成縮放操作,讓我們在縮放后的數(shù)據(jù)上應(yīng)用KNN并檢測其精度。

利用 Scikit Learn的Python數(shù)據(jù)預(yù)處理實戰(zhàn)指南

太好了!我們的精度從61%提升到了75%。這意味在基于距離的方法中(如:KNN),一些大范圍的特征對預(yù)測結(jié)果有決定性作用。

應(yīng)當(dāng)牢記,當(dāng)使用基于距離的算法時,我們必須嘗試將數(shù)據(jù)縮放,這樣較不重要的特征不會因為自身較大的范圍而主導(dǎo)目標(biāo)函數(shù)。此外,具有不同度量單位的特征也應(yīng)該進行縮放,這樣給每個特征具有相同的初始權(quán)重,最終我們會得到更好的預(yù)測模型。

練習(xí)1

嘗試?yán)眠壿嫽貧w模型做相同的練習(xí)(參數(shù): penalty=’l2′,C=0.01), 并請在評論區(qū)留下縮放前后的精度。

特征標(biāo)準(zhǔn)化

在進入這部分內(nèi)容前,我建議你先完成練習(xí)1。

在之前的章節(jié),我們在貸款預(yù)測數(shù)據(jù)集之上操作,并在其上擬合出一個KNN學(xué)習(xí)模型。通過縮小數(shù)據(jù),我們得到了75%的精度,這看起來十分不錯。我在邏輯回歸模型上嘗試了同樣的練習(xí), 并得到如下結(jié)果:

縮放前:61%

縮放后:63%

縮放后的精度與我們憑猜測得到的預(yù)測精度相近,這并不是很了不起的成就。那么,這是怎么回事呢?在精度上,為什么不像用KNN一樣有令人滿意的提升?

資料:https://www.analyticsvidhya.com/blog/2015/08/comprehensive-guide-regression/獲得對邏輯回歸更好的理解。

答案在此:

在邏輯回歸中,每個特征都被分配了權(quán)重或系數(shù)(Wi)。如果某個特征有相對來說比較大的范圍,而且其在目標(biāo)函數(shù)中無關(guān)緊要,那么邏輯回歸模型自己就會分配一個非常小的值給它的系數(shù),從而中和該特定特征的影響優(yōu)勢,而基于距離的方法,如KNN,沒有這樣的內(nèi)置策略,因此需要縮放。

我們是否忘了什么?我們的邏輯模型的預(yù)測精度和猜測的幾乎接近。

現(xiàn)在,我將在此介紹一個新概念,叫作標(biāo)準(zhǔn)化。很多Sklearn中的機器學(xué)習(xí)算法都需要標(biāo)準(zhǔn)化后的數(shù)據(jù),這意味數(shù)據(jù)應(yīng)具有零均值和單位方差。

標(biāo)準(zhǔn)化(或Z-score正則化)是對特征進行重新調(diào)整,讓數(shù)據(jù)服從基于 μ=0 和 σ=1的標(biāo)準(zhǔn)正態(tài)分布,其中μ是均值(平均值)而σ是關(guān)于均值的標(biāo)準(zhǔn)偏差。樣本的標(biāo)準(zhǔn)分?jǐn)?shù)(也稱為z-scores)按如下所示的方法計算:

利用 Scikit Learn的Python數(shù)據(jù)預(yù)處理實戰(zhàn)指南

線性模型中因子如l1,l2正則化和學(xué)習(xí)器的目標(biāo)函數(shù)中的SVM中的RBF核心假設(shè)所有的特征都集中在0周圍并且有著相同順序的偏差。

有更大順序的方差的特征將在目標(biāo)函數(shù)上起決定作用,因為前面的章節(jié)中,有著更大范圍的特征產(chǎn)生過此情形。 正如我們在練習(xí)1中看到的,沒進行任何預(yù)處理的數(shù)據(jù)之上的精度是61%,讓我們標(biāo)準(zhǔn)化我們的數(shù)據(jù),在其上應(yīng)用邏輯回歸。Sklearn提供了尺度范圍用于標(biāo)準(zhǔn)化數(shù)據(jù)。

利用 Scikit Learn的Python數(shù)據(jù)預(yù)處理實戰(zhàn)指南

我們再次達到縮放后利用KNN所能達到的我們***的精度。這意味著,當(dāng)使用l1或l2正則化估計時,標(biāo)準(zhǔn)化數(shù)據(jù)幫助我們提高預(yù)測模型的精度。其它學(xué)習(xí)模型,如有歐幾里得距離測量的KNN、k-均值、SVM、感知器、神經(jīng)網(wǎng)絡(luò)、線性判別分析、主成分分析對于標(biāo)準(zhǔn)化數(shù)據(jù)可能會表現(xiàn)更好。

盡管如此,我還是建議你要理解你的數(shù)據(jù)和對其將要使用的算法類型。過一段時間后,你會有能力判斷出是否要對數(shù)據(jù)進行標(biāo)準(zhǔn)化操作。

備注:在縮放和標(biāo)準(zhǔn)化中二選一是個令人困惑的選擇,你必須對數(shù)據(jù)和要使用的學(xué)習(xí)模型有更深入的理解,才能做出決定。對于初學(xué)者,你可以兩種方法都嘗試下并通過交叉驗證精度來做出選擇。

資料: https://www.analyticsvidhya.com/blog/2015/11/improve-model-performance-cross-validation-in-python-r/ 會對交叉驗證有更好的理解。

練習(xí)2

嘗試?yán)肧VM模型做相同的練習(xí),并請在評論區(qū)留下標(biāo)準(zhǔn)化前后的精度。

資料: https://www.analyticsvidhya.com/blog/2015/10/understaing-support-vector-machine-example-code/ 會對SVM有更好的理解。

標(biāo)簽編碼

在前面的章節(jié)里,我們對連續(xù)數(shù)字特征做了預(yù)處理。但是,我們的數(shù)據(jù)集還有其它特征,如性別(Gender)、婚否(Married)、供養(yǎng)人(Dependents)、自雇與否(Self-Employed)和教育程度(Education)。所有這些類別特征的值是字符型的。例如,性別(Gender)有兩個層次,或者是男性(Male),或者是女性(Female)。讓我們把這些特征放進我們的邏輯回歸模型中。

利用 Scikit Learn的Python數(shù)據(jù)預(yù)處理實戰(zhàn)指南

我們得到一個錯誤信息:不能把字符型轉(zhuǎn)換成浮點型。因此,這里真正在發(fā)生的事是像邏輯回歸和基于距離的學(xué)習(xí)模式,如KNN、SVM、基于樹的方法等等,在Sklearn中需要數(shù)字型數(shù)組。擁有字符型值的特征不能由這些學(xué)習(xí)模式來處理。

Sklearn提供了一個非常有效的工具把類別特征層級編碼成數(shù)值。LabelEncoder用0到n_classes-1之間的值對標(biāo)簽進行編碼。

讓我們對所有的類別特征進行編碼。

利用 Scikit Learn的Python數(shù)據(jù)預(yù)處理實戰(zhàn)指南

我們所有的類別特征都已編碼。用X_train.head()可以查看更新了的數(shù)據(jù)集。我們將看下性別(Gender)在編碼前后的頻率分布。

利用 Scikit Learn的Python數(shù)據(jù)預(yù)處理實戰(zhàn)指南

現(xiàn)在我們已經(jīng)完成了標(biāo)簽編碼,讓我們在同時有著類別和連續(xù)特征的數(shù)據(jù)集上運行邏輯回歸模型。

利用 Scikit Learn的Python數(shù)據(jù)預(yù)處理實戰(zhàn)指南

現(xiàn)在可以用了。但是,精度仍然和我們從數(shù)字特征標(biāo)準(zhǔn)化之后用邏輯回歸得到的一樣。這意味著我們加入的類別特征在我們的目標(biāo)函數(shù)中不是非常顯著。

練習(xí)3

試試用所有的特征作為非獨立變量進行決策樹分類,并評論一下你得到的精度。

資料:瀏https://www.analyticsvidhya.com/blog/2016/04/complete-tutorial-tree-based-modeling-scratch-in-python/ 中關(guān)于決策樹的內(nèi)容以更好地理解。

一位有效編碼(One-Hot-Encoding,主要是采用位狀態(tài)寄存器來對某個狀態(tài)進行編碼,每個狀態(tài)都有自己獨立的寄存器位,并且在任意時候只有一位有效——譯者注)。

一位有效編碼把每個帶有n個可能值的類別特征轉(zhuǎn)換成n個二進制特征,只有一個是有效的。

大多數(shù)機器學(xué)習(xí)算法不是為每個特征設(shè)置單個權(quán)重就是計算樣本之間的距離。如線性模型算法(例如:邏輯回歸)屬于***類。

讓我們看一看一個來自loan_prediction數(shù)據(jù)集的例子。特征從屬(Feature Dependents)有4個可能的值:0、1、2和3+,這些是編過碼的,沒有丟掉0、1、2和3的一般性。

在線性分類器中,我們就分配一個權(quán)重“W”給這個特征,這將在W*Dependents+K>0或相當(dāng)于W*Dependents

Let f(w)= W*Dependents

讓f(w)=W*Dependents

由方程獲得的可能值是0、W、2W和3W。這個方程的一個問題是權(quán)重W不能在4個選擇的基礎(chǔ)上得到。它可以用下面的方法來決定:

  •  所有導(dǎo)致同樣的決定(所有的值
  • 3:2的層級分配(當(dāng)f(w)>2W時的決策區(qū)間)
  •  2:2的層級分配(當(dāng)f(w)>W時的決策區(qū)間)

這里我們可以看到丟失了許多不同的可能決策,比如:“0”和“2W”應(yīng)該給予相同的標(biāo)簽,“3W”和“W”是額外的。

這個問題可以通過一位有效編碼來解決,因為它有效地把特征“從屬”的維度從1變成4,這樣特征“從屬”的每個值將有自己的權(quán)重。更新了的決策方程將是f'(w) < K。

這里,f'(w) = W1*D_0 + W2*D_1 + W3*D_2 + W4*D_3

所有4個新變量有布爾型值(0或1)。

同樣的事發(fā)生在基于距離的方法中,如KNN。沒有編碼,“0”和“1”從屬值之間的距離是1,在“0”和“3+”之間的距離是3,這不是所期望的,因為這兩個距離應(yīng)該類似。在編碼后,值將有新特征(列序列是0,1,2,3+):[1,0,0,0]和[0,0,0,1](最初我們找到的在“0”和“3+”之間的距離),現(xiàn)在這個距離將會是√2。

對于基于樹的方法,同樣的情況(在一個特征中有2個以上的值)可能在一定程度上影響輸出,但是如果像隨機森林的方法,若有足夠深的深度,無需一位有效編碼就能夠處理類別變量。

現(xiàn)在,讓我們看下不同算法中的一位有效編碼的實現(xiàn)。

讓我們創(chuàng)建一個邏輯回歸模型用于分類,而不使用一位有效編碼。

利用 Scikit Learn的Python數(shù)據(jù)預(yù)處理實戰(zhàn)指南

現(xiàn)在,我們對數(shù)據(jù)進行編碼。

利用 Scikit Learn的Python數(shù)據(jù)預(yù)處理實戰(zhàn)指南

現(xiàn)在,讓我們在一位有效編碼了的數(shù)據(jù)上應(yīng)用邏輯回歸模型

利用 Scikit Learn的Python數(shù)據(jù)預(yù)處理實戰(zhàn)指南

到此,我們再次得到***的精度是0.75,這是我們迄今所能得到的。在這個例子中,邏輯回歸正則(C)參數(shù)是1,早前我們用的是C=0.01。

結(jié)語

本文的目的是讓你熟悉基本的數(shù)據(jù)預(yù)處理技術(shù)并對其適用性有更深入的理解。

這些方法有用是因為算法的基本假設(shè)。這絕不是一些方法的詳盡列表的堆砌。我鼓勵你用這些方法嘗試一下,因為它們能根據(jù)手頭的問題進行大量的修改。

在我的下一篇博文中,我計劃提供更好的數(shù)據(jù)預(yù)處理技術(shù),像管道和減噪,敬請關(guān)注關(guān)于數(shù)據(jù)預(yù)處理更深入的探討。

你喜歡本文嗎?你是否采用其它不同的方式、包或庫來執(zhí)行這些任務(wù)?

責(zé)任編輯:未麗燕 來源: 網(wǎng)絡(luò)大數(shù)據(jù)
相關(guān)推薦

2016-12-18 15:03:57

Python Scikit Lea數(shù)據(jù)

2024-05-15 15:27:39

2024-01-03 16:01:23

2015-07-22 16:16:47

PythonScikit-Lear機器學(xué)習(xí)

2019-02-22 08:25:19

數(shù)據(jù)清洗預(yù)處理機器學(xué)習(xí)

2018-10-15 09:10:09

Python編程語言數(shù)據(jù)科學(xué)

2018-09-06 08:00:00

深度學(xué)習(xí)TensorFlowPython

2021-03-28 08:57:57

Python 文本數(shù)據(jù)

2021-05-12 09:58:09

PythonXGBoostscikit-lear

2019-01-28 17:42:33

Python數(shù)據(jù)預(yù)處理數(shù)據(jù)標(biāo)準(zhǔn)化

2018-04-06 05:10:04

K-NN數(shù)據(jù)集算法

2017-11-03 12:57:06

機器學(xué)習(xí)文本數(shù)據(jù)Python

2023-05-26 12:45:22

predict?方法數(shù)據(jù)

2021-07-17 22:41:53

Python數(shù)據(jù)技術(shù)

2020-07-08 13:46:25

Python數(shù)據(jù)分析預(yù)處理

2025-03-07 08:00:00

數(shù)據(jù)數(shù)據(jù)集集神經(jīng)網(wǎng)絡(luò)數(shù)據(jù)預(yù)處理

2024-07-17 14:16:40

XMLPythonWeb開發(fā)

2021-10-18 06:54:47

數(shù)據(jù)源數(shù)據(jù)預(yù)處理

2024-05-06 08:41:05

Spring應(yīng)用大數(shù)據(jù)

2023-11-27 13:58:00

數(shù)據(jù)預(yù)處理數(shù)據(jù)標(biāo)準(zhǔn)化
點贊
收藏

51CTO技術(shù)棧公眾號