<p>在<a href="https://stackoverflow.com/a/57281462/2886575">@ApproachingDarknessFish's answer</a>的基础上,您可以为得到的直方图拟合各种分布,而不是所有分布都在[0,1]之外。例如,beta分布可以很好地捕捉[0,1]上的大多数单峰分布,至少为了可视化起见:</p>
<pre><code>import numpy as np
import matplotlib.pyplot as plt
import scipy.stats
test_y = np.array([0]*100 + [1]*100)
predicted_y_probs = np.concatenate((np.random.beta(2,5,100), np.random.beta(8,3,100)))
def estimate_beta(X):
xbar = np.mean(X)
vbar = np.var(X,ddof=1)
alphahat = xbar*(xbar*(1-xbar)/vbar - 1)
betahat = (1-xbar)*(xbar*(1-xbar)/vbar - 1)
return alphahat, betahat
positive_beta_estimates = estimate_beta(predicted_y_probs[test_y == 1])
negative_beta_estimates = estimate_beta(predicted_y_probs[test_y == 0])
unit_interval = np.linspace(0,1,100)
plt.plot(unit_interval, scipy.stats.beta.pdf(unit_interval, *positive_beta_estimates), c='r', label="positive")
plt.plot(unit_interval, scipy.stats.beta.pdf(unit_interval, *negative_beta_estimates), c='g', label="negative")
# Show the threshold.
plt.axvline(0.5, c='black', ls='dashed')
plt.xlim(0,1)
# Add labels
plt.legend()
</code></pre>
<p><a href="https://i.stack.imgur.com/NQt3z.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/NQt3z.png" alt="fitted beta distribution"/></a></p>