1

我有一個數據框data包含真實值和一些NaN值。我正在嘗試使用隨機投影來執行局部敏感哈希以將維度減少到25個組件,特別是類別sklearn.random_projection.GaussianRandomProjection。然而,當我運行:使用包含NaN值的數據幀的Python熊貓的隨機投影

tx = random_projection.GaussianRandomProjection(n_components = 25) data25 = tx.fit_transform(data)

我得到Input contains NaN, infinity or a value too large for dtype('float64')。有沒有解決這個問題的方法?我嘗試將所有NaN值更改爲從未出現在我的數據集中的值,例如-1。我的輸出在這種情況下有多有效?我不是局部敏感哈希/隨機投影理論背後的專家,所以任何見解都會有幫助。謝謝。

回答

0

我發現,NA/NaN值(不可用/不可數)是非常麻煩的。

你不想只用一個像-1這樣的隨機值。如果您傾向於這樣做,請使用Imputer classes之一。否則,你可能會非常大幅度地改變點之間的距離。你可能會想,如果你正在使用random projection保持距離儘可能:

尺寸和隨機投影矩陣控制,以保持數據集的任何兩個樣本之間的成對距離的分佈。

但是,這可能會或可能不會產生合理的學習價值。據我所知,填補是一個開放的研究領域,(例如)this gentlemen專門研究。

如果您有足夠的示例,請考慮刪除包含NaN值的行或列。另一種可能性是培養像Restricted Boltzman Machine生成模型,並用它來填補缺失值:

rbm = sklearn.neural_network.BernoulliRBM().fit(data_with_no_nans) 
mean_imputed_data = sklearn.preprocessing.Imputer().fit_transform(all_data) 
rbm_imputation = rbm.gibbs(mean_imputed_data) 
nan_mask = np.isnan(all_data) 
all_data[ nan_mask ] = rbm_imputation[ nan_mask ] 

最後,你可能會考慮使用最近的鄰居歸咎於。對於給定的列,在所有變量上訓練最近的鄰居模型,除了該列使用所有完整的行。然後,對於缺少該列的行,找到k個最近鄰居並使用其中的平均值。 (這會非常昂貴,尤其是如果您的行有多個缺失值,因爲您將不得不爲每個缺失列組合訓練一個模型)。