求助,關於數據清洗中的缺失值(NaN)處理?
在分析房價問題中,有些很重要的變數,比如『年份『』,有超過20%的缺失值,而且有些值還不準確(比如年份200,一般都是1900以上的)。但是年份這個變數對分析很重要不想刪除。請問有什麼比較好的方法么?也不太想用眾數去填補,而且沒有其他變數可以推導出來。
17/12/18:有同學問我有沒有現成的包,答案是有的。
from imblearn.over_sampling import SMOTE
另外,我自己也寫了一個方法,速度和官方的比不起來,不過可以幫助大家理解smote思路,Smote。
______________________________________________________________________________________________
個人不建議填充缺失值,建議設置啞變數或者剔除該變數,填充成本較高
常見填充缺失值的方法:
1.均值、眾數填充,填充結果粗糙對模型訓練甚至有負面影響
2.直接根據沒有缺失的數據線性回歸填充,這樣填充的好會共線性,填充的不好就沒價值,很矛盾
3.剔除或者設置啞變數
個人給出一個第二個方法的優化思路,供參考:
假設存在val1~val10的自變數,其中val1存在20%以上的缺失,現在用val2-val10的變數去填充val1,這邊參考了兩個模型的設計思路,一個是bagging演算法的隨機抽取避免過擬合,另一個是Tomek+Somte的填充方法
大概思路是:
1.隨機選取val1裡面的n/N個case(包括缺失case及非缺失case)作為樣本,隨機選取val2-val10內的m個衡量特徵
2.然後根據選擇的具體的m個數據的衡量特徵選擇相似度計算方式(常見的直接算距離、餘弦相似度之類),找出3-5個最臨近的非缺失case或者最遠的非缺失case(這裡涉及全局或者局部最優)
3.構造新的val1填充缺失的val1,新val1計算方式可以為3-5個非缺失的眾數、重心、隨機遊走、加權填充等
4.重複若干次,填充完所有缺失val1的點,當前的val1有非缺失case+填充case組成
5.這樣填充的方式存在填充case過擬合或者額外產生異常點的風險,所以需要做「新點檢測」,存在兩個邏輯:
5.1假設存在新填充點x,x附近最近的3-5點均為新填充點,及該點為危險點
5.2假設存在新填出點x,x距離最近的非缺失case距離大於預先設置的閥值(一般為離群處理後,所有非缺失case到缺失case距離的平均),及該點為危險點
6.危險點可以重新進行1-5,也可以剔除,視情況而定
在預處理後均衡樣本上填充,基於租車行業偷車用戶的年齡段填充,而後判斷某出行平台用戶是否存在偷車可能,實際上做下來的ROC效果對比如下圖(數據有所隱逸,不代表官方數據):
實際業務使用收益還可以,可以嘗試一下,祝好運
看你說NaN。。我暫且認為你是用R。。
NAN和一般NA也是有區別的。。
caret裡面preprocess可以用median,也可以用knnImpute。
mice, Amelia 幾個package都是專門用來做NA值的。。
用xgboost這類Tree Based model啦
題主也是在做kaggle的俄羅斯房地產題吧
按照我做這個題的經驗,任何企圖填充NaN和outlier的行為都會使xgboost的score下降...
Here"s a simple solution using python and pandas package. The main idea is replacing the missing values with mean values.
First we need collect more variables.We could use multiple variables to calculate the mean of year before imputing. For example, let"s suppose we want to fill the missing values in Year using the mean year grouped by variable 1 and variable 2. We can get the mean values of these categories by using:
df.groupby(["Variable 1", "Variable 2"])["Year"].mean()
Now, instead of using the mean function directly, we will use the transform (ref) function first with the fillna and mean functions:
df["Year"] = df.groupby(["Variable 1", "Variable 2"])["Year"].transform(lambda x: x.fillna(x.mean()))
This will obtain the means for each group and then will fill the missing values. I recommend this tutorial for a good explanation of the transform method.
You could use the median instead of mean since it is less affected by outliers.
This and this resources shows some other methods on how to handle missing values.
有些變數,如果與其相關聯的其他變數較為完整,可以試著對相關變數用RandomForest來擬合缺失變數。
不過在這之前,需要通過可視化 / 相關係數進行大量驗證,尋找相關變數,還要保證相關變數完整。
如果缺失的不多,均值,中位數,眾數都可以填充。也可以轉化成布爾型,缺失值為0非缺失值為1.缺失的太多的話,就刪除這個變數。上面的都是常規的缺失值填充方法。也可以建模,將缺失值作為預測變數。已有的的值作為訓練集,訓練出一個模型後然後將缺失值預測出來,這樣就將缺失值填充好了。
我處理K線的時候,用上一周期的值填補
基於粗糙集理論的缺失值處理
可以認為這個數據是MAR的,試試多重插補,符合你說的基於已經觀測到變數的值,估計出來。
R的mice包就可以。
這種么沒有特別好的辦法,要麼捨棄這些數據,要麼用一些平均值,眾數代替缺失值,要麼通過其他的數據去補充這些缺失值
如果是中間數據缺失,可以用backward填充,跟前一年數據相等;如果是起始數據缺失,可以用forward填充。在量化中常用這種方法,能夠避免look ahead偏差。
沒實踐過,但按課上教的,可以KNN找幾個相似的,然後取平均。
推薦閱讀:
※大數據與媒體的具體關係在哪方面,僅僅作為一個記者的話大數據有用嗎?
※在大數據分析/挖掘領域,哪些編程語言應用最多?
※為什麼大數據在公路交通領域的實際應用進展如此慢?