【发布时间】:2019-08-06 19:45:39
【问题描述】:
我有一些训练数据 (TRAIN) 和一些测试数据 (TEST)。 每个数据帧的每一行都包含一个观察到的类 (X) 和一些二进制 (Y) 列。 BernoulliNB 根据训练数据预测测试数据中 X 给定 Y 的概率。我正在尝试查找测试数据(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):
这正确地给出了前 2 行的“NaN”,因为训练数据不包含关于 X=5 或 X=0 类的信息。
【问题讨论】:
-
你能添加
predict_proba()的输出吗?至少在第一种情况和其中一个问题情况下?我想排除df_S的构造中发生了一些事情。请打印Ar_R或pd.DataFrame(Ar_R):) -
没关系,我得到了它的工作 - 我会发布一个答案,只是试图以一种有意义的方式框架它。
标签: pandas lookup naivebayes bernoulli-probability