在数据框中查找BernoulliNB概率

时间:2019-03-15 17:03:32

标签: pandas lookup naivebayes bernoulli-probability

我有一些训练数据(TRAIN)和一些测试数据(TEST)。 每个数据框的每一行都包含一个观察到的类(X)和一些二进制列(Y)。 BernoulliNB根据训练数据预测测试数据中给定Y的X的概率。我正在尝试在测试数据(Pr)中查找观察到的每一行类别的概率。

编辑:我使用了Antoine Zambelli的建议来修复代码:

from sklearn.naive_bayes import BernoulliNB
BNB = BernoulliNB()

# Training Data
TRAIN = pd.DataFrame({'X' : [1,2,3,9],
                      'Y1': [1,1,0,0],
                      'Y4': [1,0,0,0]})

# Test Data
TEST  = pd.DataFrame({'X' : [5,0,1,1,1,2,2,2,2],
                      'Y1': [1,1,0,1,0,1,0,0,0],
                      'Y2': [1,0,1,0,1,0,1,0,1],
                      'Y3': [1,1,0,1,1,0,0,0,0],
                      'Y4': [1,1,0,1,1,0,0,0,0]})

# Add the information that TRAIN has none of the missing items
diff_cols = set(TEST.columns)-set(TRAIN.columns)
for i in diff_cols:
    TRAIN[i] = 0

# Split the data
Se_Tr_X = TRAIN['X']
Se_Te_X = TEST ['X']
df_Tr_Y = TRAIN .drop('X', axis=1)
df_Te_Y = TEST  .drop('X', axis=1)

# Train: Bernoulli Naive Bayes Classifier
A_F = BNB.fit(df_Tr_Y, Se_Tr_X)

# Test: Predict Probability
Ar_R = BNB.predict_proba(df_Te_Y)
df_R = pd.DataFrame(Ar_R)

# Rename the columns after the classes of X
df_R.columns = BNB.classes_

df_S = df_R .join(TEST)

# Look up the predicted probability of the observed X
# Skip X's that are not in the training data
def get_lu(df):
  def lu(i, j):
    return df.get(j, {}).get(i, np.nan)
  return lu
df_S['Pr'] = [*map(get_lu(df_R), df_S .T, df_S .X)]

这似乎有效,给了我结果(df_S):

enter image description here

这正确地为前两行给出了“ NaN”,因为训练数据不包含有关类X = 5或X = 0的信息。

1 个答案:

答案 0 :(得分:1)

好的,这里有几个问题。我在下面有一个完整的工作示例,但首先要解决这些问题。主要是断言“这正确地为前两行给出了“ NaN””。

这与分类算法的使用方式及其作用有关。训练数据包含您希望算法知道并能够采取行动的所有信息。考虑到该信息,仅将处理测试数据。即使您(那个人)知道测试标签是5并且没有包含在训练数据中,算法也不知道。它只会查看要素数据,然后尝试从中预测标签。因此它无法返回nan(或5或训练集中未包含的任何内容)-nan来自您的工作,从df_R到{{1 }}。

这导致第二个问题,即行df_S,该行应为df_Te_Y = TEST .iloc[ : , 1 : ],因此它不包括标签数据。标签数据仅出现在训练集中。预测的标签只会从训练数据中出现的一组标签中提取。

注意:我将类标签更改为df_Te_Y = TEST .iloc[ : , 2 : ],将要素数据更改为Y,因为这在文献中是标准的。

X

如果阅读代码后没有意义,我建议复习一些有关聚类算法的教程或其他材料。