原文:miceforest: fast imputation with random forests in python
鏈式方程的多重插補(mice,multiple imputation by chained equations)通過一系列迭代的**模型來「填充」(插補)資料集中的缺失資料。在每次迭代中,將使用資料集中的其他變數來估算資料集中的每個指定的變數,這些迭代持續執行,直到滿足收斂為止。
mice的演算法如下圖所示,這個過程會持續執行,直到所有指定的變數都被插補為止。如果出現插補的均值沒有收斂的情況,那麼將會執行更多的迭代,儘管通常不需要超過5次迭代。
mice適用的場景:
資料洩露(data leakage):如果缺失值與目標變數直接相關聯,從而導致洩漏,則mice尤其有用。 例如,假設您要對客戶保留率進行建模,在客戶註冊時或註冊後1個月通過特定變數手機客戶的登入資訊,如果該變數的值缺失,這將導致資料洩漏,因為它告訴您「客戶留存的時間沒有超過1個月」。
data leakage定義:漏斗分析(funnel analysis):資訊通常是在「漏斗」的不同階段收集的,mice可用於對漏斗中不同階段的實體特徵進行有根據的猜測。存在和利用這種倒『因』為『果』的feature的現象,叫資料競賽中的data leakage。 這裡的data leakage 跟其他場合說的資料安全資料洩漏完全不一樣。從字面上理解,我們說的data leakage不是資料洩漏,而是因果關係的紕漏,是由於資料準備過程**現的失誤,使模型沿著有紕漏的,甚至是顛倒的因果關係進行**,但得到極好的**結果。
舉個例子,chris老師在處理電信使用者流失的時候,用原有的資料集輕輕鬆鬆就可以把auc達到0.99以上。這讓人非常警惕。於是chris老師仔細檢視了一下模型和資料,原來資料中有乙個權重極高的feature是「3個月內的繳費紀錄」。很多流失使用者的賬戶內,這個feature的值是0。再進一步,他跟會計核實了一下,在會計記賬中,這個feature 代表的是使用者已經流失後的三個月的繳費紀錄,那肯定就是0了。這是典型的因果關係顛倒。
置信區間(confidence intervals):mice可用於插補(估算)缺失值,但是請務必記住,這些估算值是一種**,建立具有不同估算值的多個資料集可以執行兩種型別的推斷:
miceforest可以利用稱為**均值匹配(predictive mean matching,pmm)的過程來選擇要估算的值。 pmm包含從原始的、完整的資料中選擇乙個資料點,該資料點的**值接近缺失樣本的**值。選擇最接近的n個(mean_match_candidates引數)值作為候選值,從候選值中隨機選擇乙個值,這個過程可以逐列指定。
mice在實踐中的工作原理如下圖所示:
對於乙個需要插補(估算)的變數,如果該變數具有以下任意特徵,那麼此方法非常有用:
randst = np.random.randomstate(
1991
)# random uniform variable
nrws =
1000
uniform_vec = randst.uniform(size=nrws)
defmake_bimodal
(mean1,mean2,size)
: bimodal_1 = randst.normal(size=nrws, loc=mean1)
bimodal_2 = randst.normal(size=nrws, loc=mean2)
bimdvec =
for i in
range
(size)
:[bimodal_1[i]
, bimodal_2[i]])
)return np.array(bimdvec)
# make 2 bimodal variables
close_bimodal_vec = make_bimodal(2,
-2,nrws)
far_bimodal_vec = make_bimodal(3,
-3,nrws)
# highly skewed variable correlated with uniform_variable
skewed_vec = np.exp(uniform_vec*randst.uniform(size=nrws)*3
)+ randst.uniform(size=nrws)*3
# integer variable correlated with close_bimodal_variable and uniform_variable
integer_vec = np.
round
(uniform_vec + close_bimodal_vec/
3+ randst.uniform(size=nrws)*2
)# make a dataframe
dat = pd.dataframe(
)# plot the original data
import seaborn as sns
import matplotlib.pyplot as plt
g = sns.pairgrid(dat)
g.map
(plt.scatter,s=
5)
二模態資料傾向於資料分為兩個簇,偏斜分布說明資料的分布不是均勻的。
上圖中顯示了變數的分布和相關性,讓我們執行兩次插補過程,一次使用均值匹配,一次使用模型**,通過比較兩次插補的結果來比較均值匹配的效果。
# ampute the data.
ampdat = mf.ampute_data(dat,perc=
0.25
,random_state=randst)
# create kernel
kernelmeanmatch <
- mf.multipleimputedkernel(ampdat,mean_match_candidates=5)
kernelmodeloutput <
- mf.multipleimputedkernel(ampdat,mean_match_candidates=0)
kernelmeanmatch.mice(5)
kernelmodeloutput.mice(
5)
案例1,使用均值匹配
案例2,不適用均值匹配
注:紅線是原始資料,黑線是每個資料集的插補(估算)值。從案例1和2中,可以看到均值匹配的效果更好,具體情況取決於資料的分布。從直觀上來看,簡單地從模型**中返回值,雖然可能會提供更好的「擬合」,但是並不能為插補值提供跟原始值相似的分布。這可能是有益的,具體取決於您的目標。
暴雪的hash演算法 翻譯
促進歷史進步的大多數契機都是在解決特定問題的過程中產生的,本文討論一下mpq格式的合適解決方案。mpq是暴雪的一種文字壓縮格式,可以壓縮包括座標 演算法 聲音 動畫 字串等。hashs 問題 你可能有乙個非常長的字串陣列,現在有乙個新字串,想要判斷該字串是否在陣列中,簡單粗暴的方法是挨個比較,但最大...
翻譯 11 3 泛型演算法
泛型演算法 標頭檔案宣告了一組全域性模板函式,這些函式實現了作用在容器上的基本演算法。這些函式中的多數使用stl風格迭代器。stl標頭檔案提供更完整的泛型演算法集合。這些演算法可以被用在qt容器上以及stl容器上。如果在你的所有平台上stl實現可用,當qt缺少乙個相同的演算法的時候,那麼可能沒有理由...
R 5)用mice對缺失資料進行填補
用mice包對缺失資料進行多重填補,首先要安裝mice包,安裝的時候可以直接在命令列輸入 install.packages mice data airquality 讀入r語言自帶的函式 sum is.na data 檢視缺失個數 library mice md.pattern data 檢視dat...