python - 仅使用系数和截距模拟 sklearn 逻辑回归 predict_proba
问题描述
我将创建虚拟数据并在其上训练 sklearn 逻辑回归。然后我想得到的输出,predict_proba
但只有自己coef_
和intercept_
计算,但结果不同。设置如下:
X = [[0,0,0], [0,1,0], [0,2,0], [1,1,1], [0,1,0], [0,2,0]]
y = [0,0,0,1,1,2]
# Fit the classifier
clf = linear_model.LogisticRegression(C=1e5, multi_class="ovr", class_weight="balanced")
clf.fit(X, y)
那我就简单的利用sigmoid和softmax的知识来获取输出:
softmax([
expit(np.dot([[0,2,0]], clf.coef_[0]) + clf.intercept_[0]),
expit(np.dot([[0,2,0]], clf.coef_[1]) + clf.intercept_[1]),
expit(np.dot([[0,2,0]], clf.coef_[2]) + clf.intercept_[2])
])
但它会返回不同的值
clf.predict_proba([[0,2,0]])
array([[0.281399 , 0.15997556, 0.55862544]])
与array([[0.29882052], [0.24931448], [0.451865 ]])
解决方案
您可以使用估计的参数复制预测概率的计算,如下所示:
from sklearn import linear_model
from scipy.special import expit, softmax
import numpy as np
# Data
X = [[0,0,0], [0,1,0], [0,2,0], [1,1,1], [0,1,0], [0,2,0]]
y = [0,0,0,1,1,2]
# Classifier
clf = linear_model.LogisticRegression(C=1e5, multi_class="ovr", class_weight="balanced")
clf.fit(X, y)
# Predicted probabilities
print(clf.predict_proba([[0,2,0]]))
#[[0.281399 0.15997556 0.55862544]]
# Recalculated predicted probabilities without softmax
prob1 = np.array([expit(np.dot([[0,2,0]], clf.coef_[0]) + clf.intercept_[0]),
expit(np.dot([[0,2,0]], clf.coef_[1]) + clf.intercept_[1]),
expit(np.dot([[0,2,0]], clf.coef_[2]) + clf.intercept_[2])]).reshape(1, -1)
print(prob1 / np.sum(prob1))
#[[0.281399 0.15997556 0.55862544]]
# Recalculated predicted probabilities with softmax
prob2 = np.log(prob1)
print(softmax(prob2))
#[[0.281399 0.15997556 0.55862544]]
推荐阅读
- solr - DSE 6.7 solr 搜索总是返回空
- powershell - PowerShell 访问按枚举逐项列出的多维数组
- office-js - Mac 上的 Outlook 2019 中缺少 SeriesId
- wordpress - 为什么将 SSL 域添加到 WordPress 多站点会导致:“潜在的安全风险”警告
- java - 根据集合中的值过滤列表中的值
- c - C如何跨平台?
- couchbase - 与沙发底座的连接正在挂起
- c++ - C++ Win10以编程方式确定手动锁和OS锁?
- javascript - 如何在特定上下文中使用 querySelectorAll
- typescript - IE 上的 HierarchyRequestError 4 和 DOM 操作上的 Edge