用于創(chuàng)建新特征,檢測異常值,處理不平衡數(shù)據(jù)和估算缺失值的技術(shù)可以說,開發(fā)機(jī)器學(xué)習(xí)模型的兩個最重要的步驟是特征工程和預(yù)處理。特征工程包括特征的創(chuàng)建,而預(yù)處理涉及清理數(shù)據(jù)。 我們經(jīng)常花費大量時間將數(shù)據(jù)精煉成對于建模有用的東西。為了使這項工作更有效,我想分享四個技巧,可以幫助你進(jìn)行特征工程和預(yù)處理。用于創(chuàng)建新特征,檢測異常值,處理不平衡數(shù)據(jù)和估算缺失值的技術(shù)可以說,開發(fā)機(jī)器學(xué)習(xí)模型的兩個最重要的步驟是特征工程和預(yù)處理。特征工程包括特征的創(chuàng)建,而預(yù)處理涉及清理數(shù)據(jù)。 要注意到,領(lǐng)域知識是特征工程時最重要的事情之一(陳詞濫調(diào))。更好地了解你使用的特征可以幫助防止陷入欠擬合和過擬合的情況 本鏈接(https://github.com/MaartenGr/feature-engineering)是特征工程分析的筆記。 1. 重新采樣不平衡數(shù)據(jù)實際上,我們經(jīng)常會遇到不平衡的數(shù)據(jù)。如果目標(biāo)數(shù)據(jù)只有輕微的不平衡,這并不一定是一個問題。可以通過對數(shù)據(jù)使用適當(dāng)?shù)尿炞C措施來解決這個問題,比如平衡精度(Balanced Accuracy)、精確召回曲線(Precision-Recall Curves)或F1分?jǐn)?shù)(F1-score)。 不幸的是,情況并非總是如此,目標(biāo)變量可能非常不平衡(例如,10:1)。這種情況下,我們可以對該少數(shù)類(即樣本數(shù)少的類別)進(jìn)行過采樣,以便使用一種稱為SMOTE的技術(shù)來引入平衡。 SMOTESMOTE^SMOTE是合成少數(shù)類過采樣技術(shù) (Synthetic Minority Oversampling Technique)的縮寫,是一種用于增加少數(shù)類樣本的過采樣技術(shù)。 它通過觀察目標(biāo)的特征空間和檢測最近鄰來生成新的樣本。然后,在相鄰樣本的特征空間內(nèi),簡單地選擇相似的樣本,每次隨機(jī)地改變一列。 要實現(xiàn)SMOTE的模塊可以在imbalanced-learn包^imbalanced-learn中找到。導(dǎo)入該包并使用fit_transform方法: import pandas as pd 正如你所看到的,模型成功地對目標(biāo)變量進(jìn)行了過采樣。當(dāng)使用SMOTE進(jìn)行過采樣時,可以采用以下幾種策略:
我選擇使用字典來指定我想要在多大程度上過采樣數(shù)據(jù)。 附加提示1:如果數(shù)據(jù)集中有分類變量,那么可能會為那些不能發(fā)生的變量創(chuàng)建值。例如,如果有一個名為isMale的變量,它只能是0或1,SMOTE可能會創(chuàng)建0.365作為值。 這種情況下,可以使用SMOTENC,它考慮到了分類變量的性質(zhì)。這個版本也可以在imbalanced-learn^imbalanced-learn包中找到。 附加提示2:確保在訓(xùn)練集與測試集分割之后進(jìn)行過采樣,并且只對訓(xùn)練數(shù)據(jù)進(jìn)行過采樣。因為通常不在合成數(shù)據(jù)上測試模型的性能。 2. 創(chuàng)建新的特征為了提高模型的質(zhì)量和預(yù)測能力,經(jīng)常從現(xiàn)有變量中創(chuàng)建新特征。我們可以在每對變量之間創(chuàng)建一些交互(例如,乘法或除法),希望找到一個有趣的新特征。然而,這是一個漫長的過程,需要大量的編碼。幸運的是,這可以使用深度特征綜合(Deep Feature Synthesis)自動完成。 深度特征綜合深度特征綜合(DFS)是一種能夠快速創(chuàng)建具有不同深度的新變量的算法。例如,不僅可以對列進(jìn)行相乘,你也可以選擇先將列A與列B相乘,然后再添加列C。 首先,讓我介紹將用于示例的數(shù)據(jù)。我選擇使用人力資源分析數(shù)據(jù)^人力資源分析數(shù)據(jù),因為這些特征很容易解釋: 簡單地根據(jù)我們的直覺,我們可以將 average_monthly_hours 除以number_project的值添加為一個新變量。然而,如果我們只跟著直覺,我們可能會錯過很多的關(guān)系。 如果你的數(shù)據(jù)如果是一個簡單的表格,你可以簡單地按照下面的代碼:
第一步是創(chuàng)建一個實體(entity),如果需要,可以從這個實體與其他表創(chuàng)建關(guān)系。接下來,我們可以簡單地運行ft.dfs來創(chuàng)建新變量。我們指定參數(shù)trans_primitives來表示以什么方式創(chuàng)建變量。這里我們選擇將數(shù)值變量相加或相乘。 正如你在上面的圖中所看到的,我們僅使用幾行代碼就創(chuàng)建了另外668個特征。創(chuàng)建的一些特征示例:
附加技巧1:注意這里的實現(xiàn)是比較簡單基礎(chǔ)的。DFS最大的優(yōu)點是它可以進(jìn)行表之間的聚合中創(chuàng)建新的變量。有關(guān)示例,請參見此鏈接^鏈接。 附加技巧2:運行ft.list_primitives(),以查看可以執(zhí)行的聚合的完整列表。它甚至處理時間戳(timestamps)、空值(null values)和經(jīng)緯度信息(long/lat information)。 3. 處理缺失值像往常一樣,沒有一種處理缺失值的最佳方法。根據(jù)你的數(shù)據(jù),只需用特定組的平均值或模式填充它們就足夠了。然而,有一些高級技術(shù)使用數(shù)據(jù)的已知部分來估算(impute)缺失的值。 Iterative Imputer(迭代輸入器)雖然python是開發(fā)機(jī)器學(xué)習(xí)模型的一種很好的語言,但是仍然有很多方法在R中工作得更好。 Iterative Imputer是由Scikit-Learn開發(fā)的,它將每個缺失值的特征作為其他特征的函數(shù)來建模。它使用該函數(shù)的值作為估算。在每個步驟中,選擇一個特征作為輸出y,其他所有特征作為輸入的X。然后在X和y上訓(xùn)練一個回歸器,用來預(yù)測y的缺失值。 讓我們看一個例子。我使用的數(shù)據(jù)是著名的titanic數(shù)據(jù)集。在這個數(shù)據(jù)集中,Age列缺少我們希望填充的值。代碼總是很簡單: # 顯示的導(dǎo)入enable_iterative_imputer后 這種方法的優(yōu)點是它允許使用你所選擇的估計器(estimator)。我使用隨機(jī)森林作為估計器來模擬在R中經(jīng)常使用的missForest。 附加提示1:如果你有足夠的數(shù)據(jù),那么簡單地刪除缺少數(shù)據(jù)的示例可能是一個有吸引力的選項。但是,請記住,它可能會在你的數(shù)據(jù)中產(chǎn)生誤差,因為丟失的數(shù)據(jù)可能遵循了你錯過的模式。 附加提示2:Iterative Imputer允許使用不同的估計器。經(jīng)過一些測試,我發(fā)現(xiàn)甚至可以使用Catboost作為估計器!不幸的是,LightGBM和XGBoost不能工作,因為它們的隨機(jī)狀態(tài)名(random state name)不同。 4. 異常值檢測如果不能很好地理解數(shù)據(jù),就很難檢測出異常值。如果你很了解數(shù)據(jù),那么你可以很容易地指定數(shù)據(jù)還具有意義的閾值。 有時這是不可能的,因為很難完全理解數(shù)據(jù)。這種情況下,你可以使用離群點檢測算法,比如流行的Isolation Forest。 Isolation Forest在Isolation Forest算法中,關(guān)鍵字是Isolation(孤立)。從本質(zhì)上說,該算法檢查了樣本是否容易被分離。這樣樣本就產(chǎn)生了一個孤立編號,這個孤立編號由隨機(jī)決策樹中孤立該樣本所需的分割數(shù)來計算。這個孤立編號在所有生成的樹上進(jìn)行平均。 如果算法只需要做幾次分割就能找到一個樣本,那么該樣本更有可能是一個異常樣本。分割本身也是隨機(jī)劃分的,這樣異常樣本在樹中往往很淺(節(jié)點到根節(jié)點的路徑長度短)。因此,當(dāng)孤立編號在所有樹中都很小時,該樣本很可能是異常的。 為了展示一個例子,我再次使用了我們之前使用的信用卡數(shù)據(jù)集:
附加提示1:有一個擴(kuò)展版的IsolationForest可用,它改進(jìn)了一些缺點。然而,評論褒貶不一。 結(jié)論希望本文中的技巧能夠幫助你設(shè)計和預(yù)處理這些特征,Jupyter寫的筆記在本鏈接: https://github.com/MaartenGr/feature-engineering/blob/master/Engineering%20Tips.ipynb |
|