用分类朴素贝叶斯替换空值

问题描述

我第一次尝试运行朴素贝叶斯,我需要运行二进制和多类。我正在使用分类数据,虚拟编码。为了处理逻辑回归的空值,我用 -1 填充了我的值。在尝试运行 CatNB 时,我第一次(意外地)使用空值运行了我的二进制训练集,并得到了以下错误

[IN]: train_set,test_set = train_test_split(allyrs,test_size = 0.2,random_state = 42)

# Set up predictors,X is used for both Binary and Multi
[In]  X = train_set.iloc[:,31 : 175]

# Set up binary y value
[IN]: y=train_set.iloc[:,29]

# Set up multi y value
 [IN]: ym=train_set.iloc[:,30]

# first attempt to Feed through is says :
[IN]:from sklearn.naive_bayes import CategoricalNB

cat_NB = CategoricalNB()

cat_NB.fit(X,y)

CategoricalNB()
print(cat_NB.predict(X))

[OUT]: ValueError: Input contains NaN,infinity or a value too large for 'int'.

在这一点上,我一直回到我的标准化文件,在那里我虚拟编码并读取标准化我的数据,在编码之前我填充了我的空值。将我的数据集推回并重新导入并再次运行上面的代码并得到相同的消息:

[OUT]: ValueError: Input contains NaN,infinity or a value too large for 'int'.

感到困惑,因为我以为我已经填充了我的空值,我检查了我的 X 以查看是否有任何空值”

[IN}: X.isnull().sum()

[OUT]: BMI_C_-1.0    33
BMI_C_1.0     33
BMI_C_2.0     33
BMI_C_3.0     33
BMI_C_4.0     33
              ..
Vet_-1.0      33
Vet_1.0       33
Vet_2.0       33
Vet_7.0       33
Vet_9.0       33
Length: 144,dtype: int64

So I filled my "nulls" again

[IN]: X = X.fillna(value = -1)





#Go back an fill null with -1 because thats what worked for LR.
[IN]: X = X.fillna(value = -1)

[IN}: X.isnull().sum()

[OUT]: False

[IN]:cat_NB = CategoricalNB()

cat_NB.fit(X,y)

CategoricalNB()
print(cat_NB.predict(X))
[OUT]:
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-121-a682b6ccaf81> in <module>
      1 cat_NB = CategoricalNB()
      2 
----> 3 cat_NB.fit(X,y)
      4 
      5 CategoricalNB()

~\anaconda3\lib\site-packages\sklearn\naive_bayes.py in fit(self,X,y,sample_weight)
   1112         self : object
   1113         """
-> 1114         return super().fit(X,sample_weight=sample_weight)
   1115 
   1116     def partial_fit(self,classes=None,sample_weight=None):

~\anaconda3\lib\site-packages\sklearn\naive_bayes.py in fit(self,sample_weight)
    613         self : object
    614         """
--> 615         X,y = self._check_X_y(X,y)
    616         _,n_features = X.shape
    617         self.n_features_ = n_features

~\anaconda3\lib\site-packages\sklearn\naive_bayes.py in _check_X_y(self,y)
   1170         X,y = self._validate_data(X,dtype='int',accept_sparse=False,1171                                    force_all_finite=True)
-> 1172         check_non_negative(X,"CategoricalNB (input X)")
   1173         return X,y
   1174 

~\anaconda3\lib\site-packages\sklearn\utils\validation.py in check_non_negative(X,whom)
   1044 
   1045     if X_min < 0:
-> 1046         raise ValueError("Negative values in data passed to %s" % whom)
   1047 
   1048 

ValueError: Negative values in data passed to CategoricalNB (input X)

我很困惑,因为当我开始这个时,我在运行 Binary LogR/ 和 softmax 回归后立即拉了这个训练集,它没有抱怨空值......

在这里看到一些帖子说,如果您有负值或空值,则不应使用多项式。我还看到可以使用高斯贝叶斯做贝叶斯。这是我最好的选择吗?或者我在这里做错了什么?与我一起工作的其中一个人对她填充 -1 的 NaN 值没有错误。有人可以在这里帮助我吗。

谢谢!

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)