A,B是数值变量,仅从表中计算条件概率(将其视为总体)
让我们假设A,B只能有所提供表中的值,并以下面的概率表为例,再加几行(以便更好地理解):import pandas as pd
df = pd.read_csv('prob.txt', sep=' ') # let the dataframe df store the probability table
df
# the probability table
A B C
0 2.0 1.0 foo
1 2.2 1.2 bar
2 1.0 1.5 foo
3 2.0 3.0 bar
4 2.0 2.0 foo
5 3.2 1.2 foo
回想一下,两个条件事件的定义!=0:
因此,我们
^{pr2}$
同样,我们也可以计算其他条件概率。在将表作为样本训练数据集,使用a,B(连续)预测变量拟合分类器,以预测Pr(C | a,B)
现在让我们假设该表提供了总体中连续变量a,B的几个(随机)抽样值,并且您想要拟合一个分类器来预测类C('foo'或'bar')的概率,给定数据(变量a,B的可见/不可见值),在这种情况下,您可以从库中安装任何分类器scikit-learn,您不必自己实现。例如,在这种情况下,我们可以想到的最简单的一个是Naive Bayesian,尽管它假设了给定类(P(A,B | C)=P(A | C)P(B | C))的条件独立性。在
假设您有如下所示的数据集df(在这里我综合生成了数据集,您可以在这里使用自己的数据集)import pandas as pd
# load your data in dataframe df here
df.head()
# A B C
# 0.161729 0.814335 foo
# 0.862661 0.517964 foo
# 0.814303 0.337391 foo
# 1.898132 1.530963 bar
# 2.124829 0.289176 bar
from sklearn.naive_bayes import GaussianNB
clf = GaussianNB()
X, y = df[['A','B']], df['C']
# fit the classifier on the training dataset
clf.fit(X, y)
# predict the Pr(C = 'bar' | A, B) with predict_proba()
print(clf.predict_proba([[1,1]])[:,0]) # Pr(C='bar'|A=1.0, B=1.0)
# [ 0.86871233]
import matplotlib.pylab as plt
X1, X2 = np.meshgrid(np.linspace(X[['A']].min(), X[['A']].max(),10), np.linspace(X[['B']].min(), X[['B']].max(),10))
plt.figure(figsize=(10,6))
# plot the probability surface
plt.contourf(X1, X2, clf.predict_proba(np.c_[X1.ravel(), X2.ravel()])[:,0].reshape(X1.shape), cmap='jet', alpha=.8)
plt.colorbar()
cols = {'foo':'green', 'bar':'red'}
plt.scatter(X[['A']], X[['B']], c=[cols[c] for c in y.tolist()], s=50)
plt.show()
colorbar显示了给定A和B值(图中的x,y轴)的C='bar'的概率如何变化。原始数据点也用绿色和红色点绘制(分别使用'foo'和'bar'类)。在
如果条件独立性对你来说太强了,你可以试着去适应贝叶斯分类:线性/二次判别分析分类器(假设两个高斯函数一个用于Pr(A,B | C='foo'),另一个用于Pr(A,B | C='bar'),具有相同/不同协方差矩阵,并从MLE/MAP数据中学习类条件概率的高斯参数,然后计算后验概率P(C | A,B) 利用Bayes定理,对于一维高斯参数MLE计算this视频可能有用)。下图显示了用MLE拟合类条件分布的高斯分布和用LDA分类器拟合的决策面。在
clf.predict_proba([[1,1]])[:,0] # Pr(C='bar'|A=1.0, B=1.0)
# [ 0.67028318]SVM、RandomForest、NeuralNet用于更复杂的分类器,并使用拟合的分类器预测概率。下图显示了带有RandomForest classifier的决策面。在
clf.predict_proba([[1,1]])[:,0] # Pr(C='bar'|A=1.0, B=1.0)
# [ 1.0]
希望这个现在能正确回答你的问题。在