2017-06-23 55 views
0

應用KernelPCA我的數據,並將其傳遞到分類(SVC)我收到以下錯誤後:KernelPCA產生NaN的

ValueError: Input contains NaN, infinity or a value too large for dtype('float64').

和此警告在執行KernelPCA

RuntimeWarning: invalid value encountered in sqrt X_transformed = self.alphas_ * np.sqrt(self.lambdas_)

看看轉換後的數據,我發現了幾個nan值。

這沒有什麼區別,我用這kernel。我試過cosine,rbflinear

但有趣:

  • 我的原始數據只包含0和1之間的值(無infnan),它的規模與MinMaxScaler

  • 應用標準PCA工作,我被認爲與KernelPCA相同linearkernel

一些更多的事實:

  • 我的數據是高維(> 8000層的功能),而且大多稀疏。
  • 我使用的scikit學習的最新版本,18.2

任何想法如何克服這一點,可能是什麼原因?

+0

在kernelPCA適配或轉換過程中是否收到任何警告?也許[這是相關的](https://github.com/scikit-learn/scikit-learn/pull/8531)。 –

+0

@VivekKumar:你說得對,有個警告:''RuntimeWarning:在sqrt中遇到無效值 X_transformed = self.alphas_ * np.sqrt(self.lambdas_)'' – ScientiaEtVeritas

+0

你應該試着找出一個更小的子集的數據,發生此警告並將其與代碼一起發佈到此處。另外,請嘗試更新您的scikit-learn版本,使其與之前評論中提供鏈接的主分支相同,以查看錯誤是否仍存在。 –

回答

1

NaNs產生,因爲輸入矩陣的特徵值(self.lambdas_)是負的,其挑起ValueError異常作爲平方根不與負值操作。

的問題可能通過設置KernelPCA(remove_zero_eig=True, ...)來克服,但這樣的行動將不保留數據的原始維度。使用此參數是最後的手段,因爲模型的結果可能會出現偏差。

事實上,它已經指出負本徵值表示的模型假設錯誤,這顯然是不好的。爲迴避該事實而不與remove_zero_eig參數可能會降低的原始特徵,這些都極大地相關聯的量的腐蝕數據的維數可能的解決方案。嘗試構建相關矩陣並查看這些值是什麼。然後,嘗試省略多餘的功能並重新安裝KernelPCA()

+0

謝謝你的回答:)你說得對,''remove_zero_eig = True''使得預測分數變差,但是建立一個相關矩陣對於超過8000個特徵來說似乎是不切實際的。我打算使用''KernelPCA''就是你所描述的,以減少功能並結合高度相關的功能。有沒有其他的選擇,可以用''sklearn''或''pandas''來實現這個步驟的自動化?我的數據集傾向於在所有行上具有相同值的特徵... – ScientiaEtVeritas

+0

哇,這很不舒服。你可以檢查[這裏](https://stackoverflow.com/questions/29294983/how-to-calculate-correlation-between-all-columns-and-remove-highly-correlated-on)關於如何操作相關列* Pandas DataFrame *或使用'DataFrame.drop_duplicates'。您應首先使用絕對相同的行(如果有)與閾值等於1一起操作。 –