簡體   English   中英

ValueError:輸入包含 NaN、無窮大或對於 scikit-learn 的 dtype('float64') 來說太大的值

[英]ValueError: Input contains NaN, infinity or a value too large for dtype('float64') with scikit-learn

from sklearn.cluster.bicluster import SpectralCoclustering
from sklearn.feature_extraction.text import TfidfVectorizer
def number_normalizer(tokens):
    """ Map all numeric tokens to a placeholder.
    For many applications, tokens that begin with a number are not directly
    useful, but the fact that such a token exists can be relevant.  By applying
    this form of dimensionality reduction, some methods may perform better.
    """
    return ("#NUMBER" if token[0].isdigit() else token for token in tokens)


class NumberNormalizingVectorizer(TfidfVectorizer):

    def build_tokenizer(self):
        tokenize = super(NumberNormalizingVectorizer, self).build_tokenizer()
        return lambda doc: list(number_normalizer(tokenize(doc)))

vectorizer = NumberNormalizingVectorizer(stop_words='english', min_df=5)
cocluster = SpectralCoclustering(n_clusters=5, svd_method='arpack', random_state=0)
X = vectorizer.fit_transform(data)

cocluster.fit(X)

我選擇 SpectralCoclustering 對大約 30k 條推文進行聚類,在將數據 X 放入“cocluster”之前一切都很順利。

它引發錯誤如下所示。

.env/lib/python3.5/site-packages/sklearn/utils/validation.py", line 43, in _assert_all_finite
    " or a value too large for %r." % X.dtype)
ValueError: Input contains NaN, infinity or a value too large for dtype('float64').

當我輸入代碼作為錯誤報告時,但它是“錯誤”。 發生錯誤時它應該是 True ,對嗎?

那么還有什么可以找到錯誤的嗎? 謝謝!

https://github.com/scikit-learn/scikit-learn/blob/main/sklearn/utils/validation.py#L43

X.dtype.char in np.typecodes['AllFloat'] and not np.isfinite(X.sum()) and not np.isfinite(X).all()

錯誤的

當我今天遇到另一個sklearn -module 的類似問題時,以下故障排除幫助了我:

  • 當您的輸入數據不有趣時,嘗試重現錯誤。 用 0 到 10 之間的 30 個整數替換 30k 個大數字。
    (就我而言,我無法以這種方式重現錯誤。)
  • 檢查數據中的inf / NaN值。 如果有的話,用常量替換它們。 例如,將inf替換為LARGE_NUMBER
    (就我而言,錯誤仍然沒有消失。)
  • 使您的常量LARGE_NUMBER更小。 如果您的實際數據范圍在 -100 和 100 之間,則 10^100 和 10^10 之間的差異可能不太重要。
    (在我的例子中,錯誤信息改變了(第一次成功)。所以我把LARGE_NUMBER小,然后錯誤就消失了。)

我想這種行為(在我的情況下)是因為sklearn模塊有時使用指數函數。 因此,您的方法可能會調用另一個函數,其中一個參數是inf ,盡管您的輸入不包含此類值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM