特征工程之数据预处理(下)
機器學習入門系列(2)–如何構建一個完整的機器學習項目,第四篇!
該系列的前三篇文章:
- 機器學習入門系列(2)–如何構建一個完整的機器學習項目(一)
- 機器學習數據集的獲取和測試集的構建方法
- 特征工程之數據預處理(上)
上篇文章介紹了如何處理缺失值和圖片數據擴充的問題,這篇文章會介紹另外兩種情況,處理異常值和類別不平衡的問題。
3.1.3 處理異常值
異常值分析是檢驗數據是否有錄入錯誤以及含有不合常理的數據。忽視異常值的存在是十分危險的,不加剔除地把異常值包括進數據的計算分析過程中,對結果會產生不良影響。
異常值是指樣本中的個別值,其數值明顯偏離其余的觀測值。異常值也稱為離群點,異常值分析也稱為離群點分析。
異常值檢測
這種方法是利用箱型圖的四分位距(IQR)對異常值進行檢測,也叫Tukey‘s test。箱型圖的定義如下:
四分位距(IQR)就是上四分位與下四分位的差值。而我們通過IQR的1.5倍為標準,規定:超過上四分位+1.5倍IQR距離,或者下四分位-1.5倍IQR距離的點為異常值。下面是Python中的代碼實現,主要使用了numpy的percentile方法。
Percentile = np.percentile(df['length'],[0,25,50,75,100]) IQR = Percentile[3] - Percentile[1] UpLimit = Percentile[3]+ageIQR*1.5 DownLimit = Percentile[1]-ageIQR*1.5也可以使用seaborn的可視化方法boxplot來實現:
f,ax=plt.subplots(figsize=(10,8)) sns.boxplot(y='length',data=df,ax=ax) plt.show()如下圖所示:
上面三種方法是比較簡單的異常值檢測方法,接下來是一些較復雜的異常值檢測方法,因此這里簡單介紹下這些方法的基本概念。
顧名思義,該方法會構建一個概率分布模型,并計算對象符合該模型的概率,將低概率的對象視為異常點。
如果模型是簇的組合,則異常點是不在任何簇的對象;如果模型是回歸,異常點是遠離預測值的對象(就是第一個方法的圖示例子)。
優缺點:
- 有堅實的統計學理論基礎,當存在充分的數據和所用的檢驗類型的知識時,這些檢驗可能非常有效;
- 對于多元數據,可用的選擇少一些,并且對于高維數據,這些檢測可能性很差。
一個對象的離群點得分由到它的 k-最近鄰(KNN)的距離給定。
這里需要注意 k 值的取值會影響離群點得分,如果 k 太小,則少量的鄰近離群點可能會導致較低的離群點得分;如果 k 太大,則點數少于 k 的簇中所有的對象可能都成了離群點。為了增強魯棒性,可以采用 k 個最近鄰的平均距離。
優缺點:
- 簡單;
- 基于鄰近度的方法需要 O(m2) 時間,大數據集不適用;
- k 值的取值導致該方法對參數的選擇也是敏感的;
- 不能處理具有不同密度區域的數據集,因為它使用全局閾值,不能考慮這種密度的變化。
一種常用的定義密度的方法是,定義密度為到k個最近鄰的平均距離的倒數。如果該距離小,則密度高,反之亦然。
另一種密度定義是使用 DBSCAN 聚類算法使用的密度定義,即一個對象周圍的密度等于該對象指定距離 d 內對象的個數。
優缺點:
- 給出了對象是離群點的定量度量,并且即使數據具有不同的區域也能夠很好的處理;
- 與基于距離的方法一樣,這些方法必然具有 O(m2) 的時間復雜度。對于低維數據使用特定的數據結構可以達到 O(mlogm) ;
- 參數選擇是困難的。雖然 LOF 算法通過觀察不同的 k 值,然后取得最大離群點得分來處理該問題,但是,仍然需要選擇這些值的上下界。
一個對象是基于聚類的離群點,如果該對象不強屬于任何簇,那么該對象屬于離群點。
離群點對初始聚類的影響:如果通過聚類檢測離群點,則由于離群點影響聚類,存在一個問題:結構是否有效。這也是 k-means 算法的缺點,對離群點敏感。
為了處理該問題,可以使用如下方法:對象聚類,刪除離群點,對象再次聚類(這個不能保證產生最優結果)。
優缺點:
- 基于線性和接近線性復雜度(k均值)的聚類技術來發現離群點可能是高度有效的;
- 簇的定義通常是離群點的補集,因此可能同時發現簇和離群點;
- 產生的離群點集和它們的得分可能非常依賴所用的簇的個數和數據中離群點的存在性;
- 聚類算法產生的簇的質量對該算法產生的離群點的質量影響非常大。
除了以上提及的方法,還有兩個專門用于檢測異常點的方法比較常用:One Class SVM和Isolation Forest,
異常值處理
- 刪除含有異常值的記錄:直接將含有異常值的記錄刪除;
- 視為缺失值:將異常值視為缺失值,利用缺失值處理的方法進行處理;
- 平均值修正:可用前后兩個觀測值的平均值修正該異常值;
- 不處理:直接在具有異常值的數據集上進行數據挖掘;
將含有異常值的記錄直接刪除的方法簡單易行,但缺點也很明顯,在觀測值很少的情況下,這種刪除會造成樣本量不足,可能會改變變量的原有分布,從而造成分析結果的不準確。視為缺失值處理的好處是可以利用現有變量的信息,對異常值(缺失值)進行填補。
在很多情況下,要先分析異常值出現的可能原因,在判斷異常值是否應該舍棄,如果是正確的數據,可以直接在具有異常值的數據集上進行挖掘建模。
3.1.4 處理類別不平衡問題
什么是類別不平衡呢?它是指分類任務中存在某個或者某些類別的樣本數量遠多于其他類別的樣本數量的情況。
比如,一個十分類問題,總共有 10000 個樣本,但是類別 1 到 4 分別包含 2000 個樣本,剩余 6 個類別的樣本數量加起來剛剛 2000 個,即這六個類別各自包含的樣本平均數量大約是 333 個,相比前四個類別是相差了 6 倍左右的數量。這種情況就是類別不平衡了。
那么如何解決類別不平衡問題呢?
這里介紹八大解決辦法。
首先應該考慮數據集的擴充,在剛剛圖片數據集擴充一節介紹了多種數據擴充的辦法,而且數據越多,給模型提供的信息也越大,更有利于訓練出一個性能更好的模型。
如果在增加小類樣本數量的同時,又增加了大類樣本數據,可以考慮放棄部分大類數據(通過對其進行欠采樣方法)。
一般分類任務最常使用的評價指標就是準確度了,但它在類別不平衡的分類任務中并不能反映實際情況,原因就是即便分類器將所有類別都分為大類,準確度也不會差,因為大類包含的數量遠遠多于小類的數量,所以這個評價指標會偏向于大類類別的數據。
其他可以推薦的評價指標有以下幾種
- 混淆矩陣:實際上這個也是在分類任務會采用的一個指標,可以查看分類器對每個類別預測的情況,其對角線數值表示預測正確的數量;
- 精確度(Precision):表示實際預測正確的結果占所有被預測正確的結果的比例,P=TP / (TP+FP)
- 召回率(Recall):表示實際預測正確的結果占所有真正正確的結果的比例,R = TP / (TP+FN)
- F1 得分(F1 Score):精確度和召回率的加權平均,F1=2PR / (P+R)
- Kappa (Cohen kappa)
- ROC 曲線(ROC Curves):常被用于評價一個二值分類器的優劣,而且對于正負樣本分布變化的時候,ROC 曲線可以保持不變,即不受類別不平衡的影響。
其中 TP、FP、TN、FN 分別表示正確預測的正類、錯誤預測的正類、預測正確的負類以及錯誤預測的負類。圖例如下:
可以使用一些策略該減輕數據的不平衡程度。該策略便是采樣(sampling),主要有兩種采樣方法來降低數據的不平衡性。
- 對小類的數據樣本進行采樣來增加小類的數據樣本個數,即過采樣(over-sampling ,采樣的個數大于該類樣本的個數)。
- 對大類的數據樣本進行采樣來減少該類數據樣本的個數,即欠采樣(under-sampling,采樣的次數少于該類樣本的個素)。
采樣算法往往很容易實現,并且其運行速度快,并且效果也不錯。 一些經驗法則:
- 考慮對大類下的樣本(超過 1 萬、十萬甚至更多)進行欠采樣,即刪除部分樣本;
- 考慮對小類下的樣本(不足 1萬甚至更少)進行過采樣,即添加部分樣本的副本;
- 考慮嘗試隨機采樣與非隨機采樣兩種采樣方法;
- 考慮對各類別嘗試不同的采樣比例,比一定是 1:1,有時候 1:1 反而不好,因為與現實情況相差甚遠;
- 考慮同時使用過采樣與欠采樣。
一種簡單的人工樣本數據產生的方法便是,對該類下的所有樣本每個屬性特征的取值空間中隨機選取一個組成新的樣本,即屬性值隨機采樣。
你可以使用基于經驗對屬性值進行隨機采樣而構造新的人工樣本,或者使用類似樸素貝葉斯方法假設各屬性之間互相獨立進行采樣,這樣便可得到更多的數據,但是無法保證屬性之前的線性關系(如果本身是存在的)。
有一個系統的構造人工數據樣本的方法 SMOTE(Synthetic Minority Over-sampling Technique)。SMOTE 是一種過采樣算法,它構造新的小類樣本而不是產生小類中已有的樣本的副本,即該算法構造的數據是新樣本,原數據集中不存在的。
它基于距離度量選擇小類別下兩個或者更多的相似樣本,然后選擇其中一個樣本,并隨機選擇一定數量的鄰居樣本,然后對選擇的那個樣本的一個屬性增加噪聲,每次處理一個屬性。這樣就構造了更多的新生數據。
python 實現的 SMOTE 算法代碼地址如下,它提供了多種不同實現版本,以及多個重采樣算法。
https://github.com/scikit-learn-contrib/imbalanced-learn
強烈建議不要對待每一個分類都使用自己喜歡而熟悉的分類算法。應該使用不同的算法對其進行比較,因為不同的算法適用于不同的任務與數據。
決策樹往往在類別不均衡數據上表現不錯。它使用基于類變量的劃分規則去創建分類樹,因此可以強制地將不同類別的樣本分開。目前流行的決策樹算法有:C4.5、C5.0、CART和Random Forest等。
你可以使用相同的分類算法,但使用一個不同的角度,比如你的分類任務是識別那些小類,那么可以對分類器的小類樣本數據增加權值,降低大類樣本的權值(這種方法其實是產生了新的數據分布,即產生了新的數據集),從而使得分類器將重點集中在小類樣本身上。
一個具體做法就是,在訓練分類器時,若分類器將小類樣本分錯時額外增加分類器一個小類樣本分錯代價,這個額外的代價可以使得分類器更加“關心”小類樣本。如 penalized-SVM 和 penalized-LDA 算法。
如果你鎖定一個具體的算法時,并且無法通過使用重采樣來解決不均衡性問題而得到較差的分類結果。這樣你便可以使用懲罰模型來解決不平衡性問題。但是,設置懲罰矩陣是一個復雜的事,因此你需要根據你的任務嘗試不同的懲罰矩陣,并選取一個較好的懲罰矩陣。
從一個新的角度來理解問題,比如我們可以將小類的樣本作為異常點,那么問題就變成異常點檢測與變化趨勢檢測問題。
- 異常點檢測:即是對那些罕見事件進行識別。如通過機器的部件的振動識別機器故障,又如通過系統調用序列識別惡意程序。這些事件相對于正常情況是很少見的。
- 變化趨勢檢測:類似于異常點檢測,不同在于其通過檢測不尋常的變化趨勢來識別。如通過觀察用戶模式或銀行交易來檢測用戶行為的不尋常改變。
將小類樣本作為異常點這種思維的轉變,可以幫助考慮新的方法去分離或分類樣本。這兩種方法從不同的角度去思考,讓你嘗試新的方法去解決問題。
仔細對問題進行分析和挖掘,是否可以將問題劃分為多個更小的問題,可以嘗試如下方法:
- 將你的大類壓縮成小類;
- 使用 One Class 分類器(將小類作為異常點);
- 使用集成方式,訓練多個分類器,然后聯合這些分類器進行分類;
對于類別不平衡問題,還是需要具體問題具體分析,如果有先驗知識可以快速挑選合適的方法來解決,否則最好就是逐一測試每一種方法,然后挑選最好的算法。最重要的還是多做項目,多積累經驗,這樣遇到一個新的問題,也可以快速找到合適的解決方法。
小結
本篇文章介紹了如何檢測和處理缺失值,以及解決類別不平衡的問題,結合上一篇文章,基本就是常見的數據預處理內容。
參考:
- 《百面機器學習》第一章 特征工程
- https://blog.csdn.net/dream_angel_z/article/details/49388733#commentBox
- https://www.cnblogs.com/sherial/archive/2018/03/07/8522405.html
- https://gofisher.github.io/2018/06/22/數據預處理/
- https://gofisher.github.io/2018/06/20/數據探索/
- https://juejin.im/post/5b6a44f55188251aa8294b8c
- https://www.zhihu.com/question/47716840
- http://www.huaxiaozhuan.com/統計學習/chapters/8_feature_selection.html
歡迎關注我的微信公眾號–機器學習與計算機視覺,或者掃描下方的二維碼,大家一起交流,學習和進步!
往期精彩推薦
機器學習系列
- 機器學習入門系列(1)–機器學習概覽
- 機器學習入門系列(2)–如何構建一個完整的機器學習項目(一)
- 機器學習數據集的獲取和測試集的構建方法
- 特征工程之數據預處理(上)
數學學習筆記
- 程序員的數學筆記1–進制轉換
- 程序員的數學筆記2–余數
- 程序員的數學筆記3–迭代法
Github項目 & 資源教程推薦
- [Github 項目推薦] 一個更好閱讀和查找論文的網站
- [資源分享] TensorFlow 官方中文版教程來了
- 必讀的AI和深度學習博客
- [教程]一份簡單易懂的 TensorFlow 教程
- [資源]推薦一些Python書籍和教程,入門和進階的都有!
總結
以上是生活随笔為你收集整理的特征工程之数据预处理(下)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 盘点程序猿经常说的那些行话,你了解吗?
- 下一篇: 中文文本拼写检查错误纠正方案整理