算法应用
1.sklearn与逻辑回归-应用
2.sklearn与决策树-应用
sklearn提取逻辑回归原始数据的模型系数
作者 : 老饼 日期 : 2022-07-05 01:08:08 更新 : 2023-02-07 20:12:58
本站原创文章,转载请说明来自《老饼讲解-机器学习》ml.bbbdata.com


本文讲解在逻辑回归做了归一化的情况下,

如何提取对应原始数据的模型表达式,

通过该方法,就可以在预测的时候,不用再对数据进行归一化,

同时,也可以看到对应原始数据的权重阈值,方便我们分析问题



  01. 什么是逻辑回归原始数据模型系数  



    问题背景   


在《sklearn提取逻辑回归模型系数》一文中
我们已经讲解如何得到模型的权重和阈值
然而,
如果数据在建模之前做了归一化处理
那么从模型中提取到的系数
是对应归一化数据的,
在预测时,需要先对X作归一化,再用提取到的公式进行预测

  原始数据   -->    归一化    -->    模  型    -->   模型预测值  
    

这样显然不够优雅



     逻辑回归原始数据模型系数    


基于上述问题
我们希望直接提取对应原始数据的模型表达式,
省去模型使用时归一化的步骤:

  原始数据   -->    模  型    -->   模型预测值  


那如何得到对应原始数据的逻辑回归模型表达式呢?





  02.  关键公式推导   


本节介绍如何合并归一化公式到逻辑回归模型表达式,

并给出对应原始数据的逻辑回归模型的系数计算公式


    思路介绍    


要获取对应原始数据的模型表达式
只需要把归一化部分的公式与模型的表达式揉合在一起即可
由于逻辑回归模型内部是线性函数,归一化也是线性函数
因此揉合后并不会改变逻辑回归模型本身,而只是改变了模型系数




   公式推导   


逻辑回归模型表达式及归一化公式
由于已经知道对应归一化数据的权重 w 和阈值 b,
则模型的预测值为
            (1)式
 
 
而由归一化公式,
可知归一化数据与原数据x的关系如下:
                       (2)式

揉合模型表达式及归一化公式
 
(2)式代入(1)式即可得:
 

 结果整理
由上可知
对应原始数据的权重为:                   

对应原始数据的阈值为: 
  注意,上式中,除号和乘法的记法不是非常严谨,除号是对应相除,乘号是矩阵乘法
✍️补充:整体思路梳理
 
 





  03. 实例讲解  


本节展示一个实际例子,

讲解如何提取出逻辑回归原始数据的模型表达式


    提取逻辑回归原始数据的模型系数-Demo代码    


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



   最终的模型表达式   


将结果中的
  模型系数(对应原始数据) : [1.69574943  -3.4199075   -8.51508037 -35.13282533]      
  模型阈值(对应原始数据) : [3.25662451]                                                                        


代入逻辑回归模型表达式:

 

可得到对应原始数据的模型为:

 
  
 







 End 










联系老饼