《老饼讲解机器学习》https://www.bbbdata.com/ml/text/48
目录
在建好模型后,我们需要提取出逻辑回归模型的表达式。
本文讲解
1.无归一化时,直接提取。
2.数据作归一化后,对应原始数据的模型系数。
一.无归一化情况
直接 使用 clf.coef_[0] 和 clf.intercept_提取 即可。
代码:
from sklearn.datasets import load_breast_cancer
from sklearn.linear_model import LogisticRegression
import numpy as np
#----数据加载------
data = load_breast_cancer()
X = data.data[:,4:8]
y = data.target
#-----训练模型--------------------
clf = LogisticRegression(random_state=0)
clf.fit(X,y)
#------模型预测-------------------------------
pred_y = clf.predict(X)
pred_prob_y = clf.predict_proba(X)[:,1]
#------------提取系数w与阈值b-----------------------
w = clf.coef_[0] # 模型系数(对应归一化数据)
b = clf.intercept_ # 模型阈值(对应归一化数据)
self_prob_y = 1/(1+np.exp(-(X.dot(w)+ b) )) # 用公式预测
#------------打印信息--------------------------
print("\n------模型参数-------")
print( "模型系数:",w)
print( "模型阈值:",b)
print("提取公式计算的概率与sklearn自带预测概率的最大误差", abs(pred_prob_y-self_prob_y).max())
运行结果:
------模型参数-------
模型系数: [-0.53024026 -3.48636783 -6.89132654 -4.37965412]
模型阈值: [1.80112869]
提取公式计算的概率与sklearn自带预测概率的最大误差 5.551115123125783e-17
结果解读:
将结果中的模型系数代入逻辑回归模型:
可得
二. 数据归一化时情况
在数据做了归一化处理后,从模型中提取到的系数,是对应归一化数据的,
可以在预测时,先对X作归一化,再用提取到的公式预测。
但这样不够优雅。我们希望一式提取对应原始数据的模型系数。
(一) 公式推导
则由归一化公式:与模型线性部分:可得:
= =
(注意,上式中,除号是对应相除,乘号是矩阵乘法)
(二) 例子说明
代码:
from sklearn.datasets import load_breast_cancer
from sklearn.linear_model import LogisticRegression
import numpy as np
#----数据加载------
data = load_breast_cancer()
X = data.data[:,4:8]
y = data.target
#----数据归一化------
xmin=X.min(axis=0)
xmax=X.max(axis=0)
X_norm=(X-xmin)/(xmax-xmin)
#-----训练模型--------------------
clf = LogisticRegression(random_state=0)
clf.fit(X_norm,y)
#------模型预测-------------------------------
pred_y = clf.predict(X_norm)
pred_prob_y = clf.predict_proba(X_norm)[:,1]
#------------提取系数w与阈值b-----------------------
w_norm = clf.coef_[0] # 模型系数(对应归一化数据)
b_norm = clf.intercept_ # 模型阈值(对应归一化数据)
w = w_norm/(xmax-xmin) # 模型系数(对应原始数据)
b = b_norm - (w_norm/(xmax - xmin)).dot(xmin) # 模型阈值(对应原始数据)
self_prob_y = 1/(1+np.exp(-(X.dot(w)+ b) )) # 用公式预测
#------------打印信息--------------------------
print("\n------对应归一化数据的模型参数-------")
print( "模型系数(对应归一化数据):",clf.coef_[0])
print( "模型阈值(对应归一化数据):",clf.intercept_)
print("\n------对应原始数据的模型参数-------")
print("模型系数(对应原始数据):",w)
print("模型阈值(对应原始数据):",b)
print("提取公式计算的概率与模型概率的最大误差", abs(pred_prob_y-self_prob_y).max())
运行结果:
------对应归一化数据的模型参数-------
模型系数(对应归一化数据): [ 0.18783816 -1.11495824 -3.6342363 -7.06872446]
模型阈值(对应归一化数据): [3.27959399]
------对应原始数据的模型参数-------
模型系数(对应原始数据): [ 1.69574943 -3.4199075 -8.51508037 -35.13282533]
模型阈值(对应原始数据): [3.25662451]
提取公式计算的概率与模型概率的最大误差 3.885780586188048e-16
结果解读:
将结果中的模型系数代入逻辑回归模型:
可得
对应原始数据的模型为:
相关文章