python 拟合sigmoid曲线_使用python+sklearn实现概率校准曲线
注意:單擊此處https://urlify.cn/muQBjy下載完整的示例代碼,或通過Binder在瀏覽器中運行此示例
在進行分類時,人們經常不僅要預測分類標簽,還要預測相關的概率。預測概率可以讓人們對預測分類標簽具有信心。本示例演示了如何顯示預測概率的校準程度以及如何校準未校準的分類器。
該實驗是在具有100,000個樣本(其中1,000個用于模型訓練)和20個特征的二分類的人工數據集上進行的。在這20個特征中,只有2個具有信息性,而10個是冗余的。第一張圖顯示了邏輯回歸,高斯樸素貝葉斯和有等滲校準(isotonic calibration)和sigmoid校準(sigmoid calibration)高斯樸素貝葉斯獲得的預測概率。校準性能通過圖例中記錄的Brier得分進行評估(越小越好)。在這里可以觀察到邏輯回歸得到了很好的校準,而原始的高斯樸素貝葉斯則表現很差。這是因為多余的特征違反了特征獨立性的假設,并導致分類器過分自信,這就是典型的轉置sigmoid型曲線。
帶有等滲回歸(isotonic regression)的高斯樸素貝葉斯概率的校準可以解決此問題,如可以從近對角線的校準曲線中看出。sigmoid校準還可以稍微改善brier得分,盡管不如非參數等滲回歸那么強。這可以歸因于以下事實:我們擁有大量的校準數據,因此利用非參數模型具有更大靈活性。
第二張圖顯示了線性支持向量分類器(LinearSVC)的校準曲線。線性支持向量分類器(LinearSVC)表現出與高斯樸素貝葉斯相反的行為:校準曲線是具有sigmoid形的曲線,這對于置信度低的分類器來說是典型的曲線。在線性支持向量分類器(LinearSVC)的情況下,這是由合頁損失(hinge loss)的margin屬性引起的,該屬性使合頁損失(hinge loss)可以集中關注于那些靠近決策邊界(支持向量)的硬樣本(hard samples)。
兩種校準均可解決此問題,并產生幾乎相同的結果。這表明sigmoid校準可以處理基本分類器的校準曲線是sigmoid的情況(例如,線性支持向量分類器(LinearSVC)),但不可以處理轉置sigmoid形(例如,高斯樸素貝葉斯)的情況。
輸出:Logistic:Brier: 0.099Precision: 0.872Recall: 0.851F1: 0.862Naive Bayes:Brier: 0.118Precision: 0.857Recall: 0.876F1: 0.867Naive Bayes + Isotonic:Brier: 0.098Precision: 0.883Recall: 0.836F1: 0.859Naive Bayes + Sigmoid:Brier: 0.109Precision: 0.861Recall: 0.871F1: 0.866Logistic:Brier: 0.099Precision: 0.872Recall: 0.851F1: 0.862SVC:Brier: 0.163Precision: 0.872Recall: 0.852F1: 0.862SVC + Isotonic:Brier: 0.100Precision: 0.853Recall: 0.878F1: 0.865SVC + Sigmoid:Brier: 0.099Precision: 0.874Recall: 0.849F1: 0.861print(__doc__)# 作者: Alexandre Gramfort # Jan Hendrik Metzen # 許可證: BSD Style.import matplotlib.pyplot as pltfrom sklearn import datasetsfrom sklearn.naive_bayes import GaussianNBfrom sklearn.svm import LinearSVCfrom sklearn.linear_model import LogisticRegressionfrom sklearn.metrics import (brier_score_loss, precision_score, recall_score,f1_score)from sklearn.calibration import CalibratedClassifierCV, calibration_curvefrom sklearn.model_selection import train_test_split# 創建分類任務的數據集,其中有很多冗余的特征而有很少# 具有信息性的特征X, y = datasets.make_classification(n_samples=100000, n_features=20,n_informative=2, n_redundant=10,random_state=42)X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.99,random_state=42)def plot_calibration_curve(est, name, fig_index):"""Plot calibration curve for est w/o and with calibration. """# 等滲校準isotonic = CalibratedClassifierCV(est, cv=2, method="isotonic")# sigmoid校準sigmoid = CalibratedClassifierCV(est, cv=2, method="sigmoid")# 做為基準的沒有校準的邏輯回歸lr = LogisticRegression(C=1.)fig = plt.figure(fig_index, figsize=(10, 10))ax1 = plt.subplot2grid((3, 1), (0, 0), rowspan=2)ax2 = plt.subplot2grid((3, 1), (2, 0))ax1.plot([0, 1], [0, 1], "k:", label="Perfectly calibrated")for clf, name in [(lr, "Logistic"),(est, name),(isotonic, name + " + Isotonic"),(sigmoid, name + " + Sigmoid")]:clf.fit(X_train, y_train)y_pred = clf.predict(X_test)if hasattr(clf, "predict_proba"):prob_pos = clf.predict_proba(X_test)[:, 1]else: # 使用決策函數prob_pos = clf.decision_function(X_test)prob_pos = \(prob_pos - prob_pos.min()) / (prob_pos.max() - prob_pos.min())clf_score = brier_score_loss(y_test, prob_pos, pos_label=y.max())print("%s:" % name)print("\tBrier: %1.3f" % (clf_score))print("\tPrecision: %1.3f" % precision_score(y_test, y_pred))print("\tRecall: %1.3f" % recall_score(y_test, y_pred))print("\tF1: %1.3f\n" % f1_score(y_test, y_pred))fraction_of_positives, mean_predicted_value = \calibration_curve(y_test, prob_pos, n_bins=10)ax1.plot(mean_predicted_value, fraction_of_positives, "s-",label="%s (%1.3f)" % (name, clf_score))ax2.hist(prob_pos, range=(0, 1), bins=10, label=name,histtype="step", lw=2)ax1.set_ylabel("Fraction of positives")ax1.set_ylim([-0.05, 1.05])ax1.legend(loc="lower right")ax1.set_title("Calibration plots (reliability curve)")ax2.set_xlabel("Mean predicted value")ax2.set_ylabel("Count")ax2.legend(loc="upper center", ncol=2)plt.tight_layout()# 繪制高斯樸素貝葉斯的校準曲線plot_calibration_curve(GaussianNB(), "Naive Bayes", 1)# 繪制線性支持向量分類器(Linear SVC)的校準曲線plot_calibration_curve(LinearSVC(max_iter=10000), "SVC", 2)plt.show()
腳本的總運行時間:(0分鐘2.474秒)
估計的內存使用量: 28 MB
下載Python源代碼: plot_calibration_curve.py下載Jupyter notebook源代碼: plot_calibration_curve.ipynb由Sphinx-Gallery生成的畫廊
文壹由“伴編輯器”提供技術支持☆☆☆為方便大家查閱,小編已將scikit-learn學習路線專欄文章統一整理到公眾號底部菜單欄,同步更新中,關注公眾號,點擊左下方“系列文章”,如圖:
歡迎大家和我一起沿著scikit-learn文檔這條路線,一起鞏固機器學習算法基礎。(添加微信:mthler,備注:sklearn學習,一起進【sklearn機器學習進步群】開啟打怪升級的學習之旅。)
總結
以上是生活随笔為你收集整理的python 拟合sigmoid曲线_使用python+sklearn实现概率校准曲线的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 端午节已过两天
- 下一篇: 游戏辅助教程-地址篇 CE找地址技巧