Python sklearn';s predict_proba返回无限概率

Python sklearn';s predict_proba返回无限概率,python,error-handling,scikit-learn,naivebayes,Python,Error Handling,Scikit Learn,Naivebayes,我正在使用scikit learn的CalibredClassifiedRCV和GaussianNB()对一些数据运行二进制分类。 我已经验证了.fit(X\u-train,y\u-train)中的输入,它们具有匹配的尺寸,并且都通过了np.isfinite测试 我的问题是当我运行.predict\u proba(X\u test)时。 对于一些示例,返回的概率是数组([-inf,inf]),我真的不明白为什么 当我尝试对结果预测运行brier\u score\u loss时,我发现了这一点,它

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

我的问题是当我运行
.predict\u proba(X\u test)
时。 对于一些示例,返回的概率是
数组([-inf,inf])
,我真的不明白为什么

当我尝试对结果预测运行
brier\u score\u loss
时,我发现了这一点,它抛出了一个
ValueError:输入包含NaN、无穷大或一个对于dtype('float64')来说太大的值。

我已经添加了一些数据。 它比我想要的要大,但我无法用更小的数据集进行一致的复制。 复制代码如下。 代码有一些随机性,因此如果没有找到无穷大,请尝试再次运行它,但从我的实验来看,它应该在第一次尝试时找到它们

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))]

似乎等渗回归(由校准分类RCV使用)提供了
inf
值。 更准确地说,它来自于等渗的线性回归:

  • 在此宣布—
  • 这里叫-
对非常小的值(低于某个阈值但高于0)调用的回归给出了
inf

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