Python sklearn';s predict_proba返回无限概率
我正在使用scikit learn的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时,我发现了这一点,它
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
值。
更准确地说,它来自于等渗的线性回归:
- 在此宣布—
- 这里叫-
inf
在调试模式下,self.f_([0,3.2392382784e-313])
返回[0.10430463576158941,inf]
,这是一种奇怪的行为。interpolate.interp1d
的实现可能无法处理这种“超小”值。希望能有帮助