逻辑回归(神经网络Sigmod激活函数,计量logit模型)

逻辑回归(Logistic Regression)

逻辑回归(Logistic Regression)是通过回归来解决分类问题,为监督学习方法,比较线性回归与逻辑回归,线性回归当变量有较好的线性关系时,比如收入与消费等,通过拟合样本点,来预测模型的未来区域,而逻辑回归主要解决当因变量为分类变量,比如类别为患病与不患病,手机偏好喜欢iPhone、三星或者小米等,如图显示仅有两个类别的时,这个时候传统线性回归无法解决问题,从图可以直观感觉出,逻辑回归通过将线性回归做了一次函数变换,来重新构造函数,拟合并解释模型,如何将线性回归转换为非线性函数?

逻辑回归推导如下

几率表示某件事情发生的概率§与不发生概率(1-p)之间的比率,在几率的基础上取(自然底数)对数,则构成该事件的对数几率(logit),经过转换,两边取自然底数 ,逻辑回归基本模型方程形成,这样就y取值由原来的的(-∞,+∞)映射为(0,1)区间,如图最后逻辑回归图形取值为(0,1)之间。(逻辑回归模型和逻辑这个词语本身没有任何关系,类似还有鲁棒性这种翻译,从图示推导中看出两边取了对数,与概率相关,正确应该称为对数几率模型)

Sigmod激活函数与逻辑回归

Sigmod函数表示的S型曲线的总称,在神经网络里实际可以看成为逻辑回归,将变量映射到0-1之间,Sigmod函数作用是将是将输入的数据通过非线性映射,使得神经网络逼近任何非线性函数。
如图,红色的曲线是需要拟合的曲线,红色的曲线可以表示为一堆函数的集合+常数项,在红色的曲线不断取点,这样可以把红色曲线拟合出来,这样的红色曲线就可以表示出来。为什么不用线性激活函数去拟合这条曲线?线性激活函数通过不断叠加,最后本质还是线性回归,导致神经网络隐藏层消失了,失去神经网络多层的意义,非线性函数更加具有拓展性。

在这里插入图片描述

逻辑回归损失函数(极大似然估计,交叉熵)

极大似然函数估计,根据伯努利分布通过极大似然估计来推导损失函数,假设预测的表现ŷ=1的概率为P,ŷ=0的概率就是1-P,假设预测标签结果Y={Y0,Y1,……,Yn},根据伯努利实验得出每次实验的概率质量函数PMF:P(yi)=pyi(1-p)1-yi 通过连乘,通过极大似然函数参数估计推导损失函数如下:

交叉熵,根据交叉熵的公式,P,Q代表时观察和预测两个标签集合,交叉熵反映的是宏观两个集合的接近程度,通过不断将所有样本点交叉熵取均值

在这里插入图片描述

这里发现极大似然函数估计与交叉熵构造的损失函数式一样的,不同学科之间很多方法时相通的,可能只是表述不一样

机器学习逻辑回归与计量经济学logit模型

机器学习中的逻辑回归与计量经济学logit模型,构造损失函数是一样的,如图,根据伍德里奇书给出的表述,这段文字描述与随机变量都是满足伯努利分布介绍相似,通过极大似然函数构造损失函数,来求解参数,不过计量经济学的参数结合理论,侧重对参数进行解释,会对参数的会做各种假设,并对参数及模型本身进行各种检验。

在这里插入图片描述

logit模型解释,如图,采用美国劳动市场数据,进行logit回归处理的数据如下,明显可以看出,LR检验结果表示,各变量参数拒绝了各变量0假设,教育等变量通过了5%显著性性水平,进一步对模型结果截图,从教育水平来看,每增加1年教育,就业市场增加4.2%的就业机会(实际得出这些结论没有这么简单,此外,还需对变量进行一系列的深度处理,还需引入probit模型进行对比分析,当然现实大部分时候运用的时候都不太严谨,呵呵,懂王)

在这里插入图片描述

逻辑回归优点 1.不需要太多的计算资源,易于实现 2.因为输出的概率,通常不需要对特征进行标准化处理
逻辑回归缺点 1.无法处理大量的特征变量,容易过拟合 2.对于特征与目标变量不相关或者特征之间高度相似,逻辑回归效果不是很好
采用数据集为心脏病数据集,数据本身经过已经处理过,直接上模型,超参数为默认(因为模型训练结果还可以,不再进一步结合网格搜索进行调参处理)
import pandas as pd
import numpy as np
from sklearn import metrics
from sklearn.metrics import classification_report
from sklearn.model_selection import train_test_split
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.family'] = 'SimHei'
import seaborn as sns
df = pd.read_csv("heart.csv")
X = df.drop(['target'],axis=1)
y = df.target.values
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=16)
logreg = LogisticRegression()
logreg.fit(X_train, y_train)
y_pred = logreg.predict(X_test)
cnf_matrix = metrics.confusion_matrix(y_test, y_pred)
class_names=[0,1] 
fig, ax = plt.subplots()
tick_marks = np.arange(len(class_names))
plt.xticks(tick_marks, class_names)
plt.yticks(tick_marks, class_names)
sns.heatmap(pd.DataFrame(cnf_matrix), annot=True, cmap="YlGnBu" ,fmt='g')
ax.xaxis.set_label_position("top")
plt.tight_layout()
plt.title('混淆矩阵', y=1.1)
plt.ylabel('真实标签')
plt.xlabel('预测标签')

在这里插入图片描述

#进一步分析其指标
target_names = ['without heart disease ', 'heart disease']
print(classification_report(y_test, y_pred, target_names=target_names))
模型准确率80%,recall等各指标表现还可以,进一步通过ROC曲线表示真阳性与假阳性关系图

y_pred_proba = logreg.predict_proba(X_test)[::,1]
fpr, tpr, _ = metrics.roc_curve(y_test,  y_pred_proba)
auc = metrics.roc_auc_score(y_test, y_pred_proba)
plt.plot(fpr,tpr,label="data, auc="+str(auc))
plt.legend(loc=4)
plt.show()
ROC曲线表示真阳性与假阳性关系图,AUC取值在0~1之间,这里为0.9,综合说明模型泛化性能还是比较好的

在这里插入图片描述

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值