【问题标题】:sklearn's predict_proba returns infinite probabiltiessklearn predict_proba 返回无穷大概率
【发布时间】:2018-09-06 14:44:20
【问题描述】:

我正在使用 scikit-learn 的 CalibratedClassifierCVGaussianNB() 对一些数据进行二进制分类。 我已经验证了.fit(X_train, y_train) 中的输入,它们具有匹配的尺寸并且都通过了np.isfinite 测试。

我的问题是当我运行.predict_proba(X_test) 时。 对于一些样本,返回的概率是array([-inf, inf]),我真的不明白为什么。

当我尝试在结果预测上运行 brier_score_loss 时,这一点就曝光了,它抛出了 ValueError: Input contains NaN, infinity or a value too large for dtype('float64')

我已经向这个Google drive link 添加了一些数据。 它比我想要的要大,但我无法使用较小的数据集进行一致的复制。 复制代码如下。 代码有一些随机性,所以如果没有找到无限,请尝试再次运行它,但根据我的实验,它应该在第一次尝试时找到它们。

from sklearn.naive_bayes import GaussianNB
from sklearn.calibration import CalibratedClassifierCV
from sklearn.model_selection import StratifiedShuffleSplit
import numpy as np

loaded = np.load('data.npz')
X = loaded['X']
y = loaded['y']

num = 2*10**4
sss = StratifiedShuffleSplit(n_splits = 10, test_size = 0.2)
cal_classifier = CalibratedClassifierCV(GaussianNB(), method = 'isotonic', cv = sss)

classifier_fit = cal_classifier.fit(X[:num], y[:num])
predicted_probabilities = classifier_fit.predict_proba(X[num:num+num//4])[:,1]

predicted_probabilities[np.argwhere(~np.isfinite(predicted_probabilities))]

【问题讨论】:

    标签: python error-handling scikit-learn naivebayes


    【解决方案1】:

    似乎等渗回归(CalibratedClassifierCV 使用)提供了inf 值。 更准确地说,它来自 Isotonic 中的线性回归:

    对非常小的值(低于某个阈值但高于 0)调用的回归得到inf

    在调试模式下self.f_([0, 3.2392382784e-313]) 返回[0.10430463576158941, inf],这是一种奇怪的行为。 interpolate.interp1d 的实现可能无法处理这种“超小”值。希望对您有所帮助。

    【讨论】:

      猜你喜欢
      • 2017-04-06
      • 2014-04-24
      • 1970-01-01
      • 2022-11-23
      • 2015-05-04
      • 2012-02-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多