逻辑回归可以看做是被sigmoid进行归一化的线性函数。

这里首先规定,向量x是分类器的输入数据,向量

就是我们要找到的最佳参数。
  • sigmoid函数的输入:
  • 预测函数(其实就是概率值):(sigmoid函数)

注意:多分类的预测函数为:(softmax函数)

  • 二分类任务: 分类对应的概率为

损失函数为:

利用极大似然函数进行求解,对应似然函数为:

对数似然函数为:

下面参数更新的求解就是在原有的对数似然函数上乘上了-1/m,由于是负数,所以也由梯度上升转换到了梯度下降),对数似然函数乘上了-1/m之后,对这个新的式子求偏导。

  • 参数更新:

计算过程:

y=1的概率为:

这里θ是模型参数,也就是回归系数,σ是sigmoid函数。实际上这个函数是由下面的对数几率(也就是x属于正类的可能性和负类的可能性的比值的对数)变换得到的:

所以说上面的logistic回归就是一个线性分类模型,它与线性回归的不同点在于:为了将线性回归输出的很大范围的数,例如从负无穷到正无穷,压缩到0和1之间。

似然函数:

对数似然函数:

对对数似然函数进行求导,看导数为0的时候可不可以解出来,也就是有没有解析解

然后我们令该导数为0,你会很失望的发现,它无法解析求解。借助迭代进行求最优解。

梯度下降(gradient descent)

Gradient descent 又叫 steepest descent,是利用一阶的梯度信息找到函数局部最优解的一种方法,也是机器学习里面最简单最常用的一种优化方法。它的思想很简单,和我开篇说的那样,要找最小值,只需要每一步都往下走(也就是每一步都可以让代价函数小一点),然后不断的走,那肯定能走到最小值的地方。

而这个下坡最快的方向,就是梯度的负方向了。

利用梯度下降法求参数

  • 在开始梯度下降之前,sigmoid function有一个很好的性质,

梯度的负方向就是代价函数下降最快的方向,借助泰勒展开,可以得到(函数可微,可导)

其中,f'(x) 和δ为向量,那么这两者的内积就等于

当θ=π时,也就是在δ与f'(x)的方向相反时,取得最小值, 也就是下降的最快的方向了

这里也就是: f(x+δ) - f(x) = - ||δ||·||f'(x)||。

其中,wj表示第j个特征的权重,η为学习率,用来控制步长。

对损失函数J(θ)中的θ的第j个权重求偏导。

所以,在使用梯度下降法更新权重时,根据以下公式进行参数更新:

梯度下降算法的伪代码如下:

################################################

初始化回归系数为1

重复下面步骤直到收敛{

计算整个数据集的梯度

使用alpha x gradient来更新回归系数

}

返回回归系数值

################################################

2.2、随机梯度下降SGD (stochastic gradient descent)

梯度下降算法在每次更新回归系数的时候都需要遍历整个数据集(计算整个数据集的回归误差),该方法对小数据集尚可。但当遇到有数十亿样本和成千上万的特征时,就有点力不从心了,它的计算复杂度太高。改进的方法是一次仅用一个样本点(的回归误差)来更新回归系数。这个方法叫随机梯度下降算法。由于可以在新的样本到来的时候对分类器进行增量的更新(假设我们已经在数据库A上训练好一个分类器h了,那新来一个样本x。对非增量学习算法来说,我们需要把x和数据库A混在一起,组成新的数据库B,再重新训练新的分类器。但对增量学习算法,我们只需要用新样本x来更新已有分类器h的参数即可),所以它属于在线学习算法。与在线学习相对应,一次处理整个数据集的叫“批处理”。

随机梯度下降算法的伪代码如下:

################################################

初始化回归系数为1

重复下面步骤直到收敛{

对数据集中每个样本

计算该样本的梯度

使用alpha x gradient来更新回归系数

}

返回回归系数值

################################################

2.3、改进的随机梯度下降

对随机梯度下降算法,我们做两处改进来避免上述的波动问题:

1)在每次迭代时,调整更新步长alpha的值。随着迭代的进行,alpha越来越小,这会缓解系数的高频波动(也就是每次迭代系数改变得太大,跳的跨度太大)。当然了,为了避免alpha随着迭代不断减小到接近于0(这时候,系数几乎没有调整,那么迭代也没有意义了),我们约束alpha一定大于一个稍微大点的常数项。

2)每次迭代,改变样本的优化顺序。也就是随机选择样本来更新回归系数。这样做可以减少周期性的波动,因为样本顺序的改变,使得每次迭代不再形成周期性。

改进的随机梯度下降算法的伪代码如下:

################################################

初始化回归系数为1

重复下面步骤直到收敛{

对随机遍历的数据集中的每个样本

随着迭代的逐渐进行,减小alpha的值

计算该样本的梯度

使用alpha x gradient来更新回归系数

}

返回回归系数值

################################################

3. 优缺点

(1)、优点

1. 形式简单,模型的可解释性非常好。从特征的权重可以看到不同的特征对最后结果的影响,某个特征的权重值比较高,那么这个特征最后对结果的影响会比较大;

2. 模型效果不错。在工程上是可以接受的(作为baseline),如果特征工程做的好,效果不会太差,并且特征工程可以大家并行开发,大大加快开发的速度;

3. 训练速度较快。分类的时候,计算量仅仅只和特征的数目相关。并且逻辑回归的分布式优化sgd发展比较成熟,训练的速度可以通过堆机器进一步提高,这样我们可以在短时间内迭代好几个版本的模型;

4. 资源占用小,尤其是内存。因为只需要存储各个维度的特征值;

5. 方便输出结果调整。逻辑回归可以很方便的得到最后的分类结果,因为输出的是每个样本的概率分数,我们可以很容易的对这些概率分数进行cutoff,也就是划分阈值(大于某个阈值的是一类,小于某个阈值的是一类)。

(2)、缺点

1. 准确率并不是很高。因为形式非常的简单(非常类似线性模型),很难去拟合数据的真实分布;

2. 很难处理数据不平衡的问题。举个例子:如果我们对于一个正负样本非常不平衡的问题比如正负样本比 10000:1.我们把所有样本都预测为正也能使损失函数的值比较小。但是作为一个分类器,它对正负样本的区分能力不会很好;

3. 处理非线性数据较麻烦。逻辑回归在不引入其他方法的情况下,只能处理线性可分的数据,或者进一步说,处理二分类的问题;

4. 逻辑回归本身无法筛选特征。有时候,我们会用gbdt来筛选特征,然后再上逻辑回归。

4. 实例

(1)导入数据

import numpy as np
import pandas as pd
from sklearn import preprocessing
import matplotlib.pyplot as plt
plt.rc("font",size=14)
import seaborn as sns
sns.set(style="white")
sns.set(style="whitegrid",color_codes=True)
df=pd.read_csv("D:/Users/jl.qiao/Desktop/网上数据文件夹/titanic/titanic(1).csv")
print(df.head())
print("数据集包含的数据个数%d"%df.shape[0])

得到:

前5行数据:
pclass survived ... cabin embarked
0 1 1 ... B5 S
1 1 1 ... C22 C26 S
2 1 0 ... C22 C26 S
3 1 0 ... C22 C26 S
4 1 0 ... C22 C26 S
数据的行数:
数据集包含的数据个数1309

(2)数据分析

1.查看数据的确实情况

print(df.isnull().sum())

得到:

pclass 0
survived 0
name 0
sex 0
age 263
sibsp 0
parch 0
ticket 0
fare 1
cabin 1014
embarked 2
dtype: int64

可以看出在总数据1309中,age、fare、cabin 、embarked 4个特征存在缺失情况。

2. 特征age的数据分布

#年龄数据缺失的百分比
print('"age" 缺失的百分比  %.2f%%' %((df['age'].isnull().sum()/df.shape[0])*100))

得到:

"age" 缺失的百分比 20.09%

#通过直方图看不同年龄的分布情况
ax=df['age'].hist(bins=15,color='teal',alpha=0.6)
ax.set(xlabel='age')
ax.set(ylabel='number')
ax.set(title='age_number hist')
plt.xlim(-10,85)  #限定x轴的取值范围
plt.show()

得到:

#年龄的均值和中位数
print('The mean of Age is %.2f'%(df['age'].mean(skipna=True)))
print('The median of Age is %.2f'%(df['age'].median(skipna=True)))
#skipna=False表示有缺失值不可加总,=True表示可以存在缺失值

得到:

The mean of Age is 29.88
The median of Age is 28.00

结论:由于“年龄”的偏度不为0,即数据是有偏的, 使用均值替代缺失值不是最佳选择, 这里可以选择使用中位数替代缺失值。

3. 仓位

#缺失的百分比
print('"cabin"缺失的百分比 %.2f%%'%((df['cabin'].isnull().sum()/df.shape[0])*100))

结论:约 77% 的乘客的仓位都是缺失的, 最佳的选择是不使用这个特征的值.

4. 登船地点

#缺失百分比
print('"embarked"缺失的百分比 %.2f%%'%((df['embarked'].isnull().sum()/df.shape[0])*100))
print('按照登船地点分组(C=Cherbourg,Q=Queenstown,S=Southampton)')
print(df['embarked'].value_counts()) #类别计数

得到:

"embarked"缺失的百分比 0.15%
按照登船地点分组(C=Cherbourg,Q=Queenstown,S=Southampton:
S 914
C 270
Q 123

sns.countplot(x='embarked',data=df,palette='Set2')
#条形图,palette是调色板
plt.show()

得到:

乘客登船最多的港口位于:

print('乘客登船地点的众数为%s'%df['embarked'].value_counts().idxmax())

得到:

乘客登船地点的众数为:S

结论:由于登船地点数据缺失较少,且大多数人是在南安普顿(Southhampton)登船, 故可以使用“S”替代缺失的数据值。

5. 船票的费用

from scipy import stats
print('"fare"缺失的百分比 %.2f%%'%((df['fare'].isnull().sum()/df.shape[0])*100))
print(df['fare'].min(),df['fare'].max())  #船票费用的最大值和最小值

得到:

"fare"缺失的百分比 0.08%
0.0 512.3292

#分布直方图
ax=df['fare'].hist(bins=15, color='yellow', alpha=0.5)
ax.set(xlabel='fare')
plt.xlim(-10,600)
plt.show()

得到:

#船票费用的均值和中位数
print('The mean of fare is %.2f'%(df['fare'].mean(skipna=True)))
print('The median of fare is %.2f'%(df['fare'].median(skipna=True)))
print('The mode of fare is %.2f'%(stats.mode(df['fare'])[0][0]))

得到:
The mean of fare is 33.30
The median of fare is 14.45
The mode of fare is 8.05

结论:从数据可以看出,船票费用呈长尾分布,且数据缺失个数仅为1个,故可以用众数进行替代

(3)根据缺失情况调整数据

根据以上分析的情况,对缺失数据进行填充或删除

data=df.copy()
data['age'].fillna(df['age'].median(skipna=True),inplace=True)
data['embarked'].fillna(df['embarked'].value_counts().idxmax(),inplace=True)
data.drop('cabin',axis=1,inplace=True)
data['fare'].fillna(stats.mode(df['fare'])[0][0],inplace=True)
print(data.isnull().sum())
print(data.head())

得到:
pclass 0
survived 0
name 0
sex 0
age 0
sibsp 0
parch 0
ticket 0
fare 0
embarked 0
dtype: int64
pclass survived ... fare embarked
0 1 1 ... 211.3375 S
1 1 1 ... 151.5500 S
2 1 0 ... 151.5500 S
3 1 0 ... 151.5500 S
4 1 0 ... 151.5500 S

可以看到,经过处理后的数据已经没有缺失值出现。

(4) 特征处理

#数据中的两个特征 “sibsp” (一同登船的兄弟姐妹或者配偶数量)与“parch”(一同登船的父母或子女数量)都是代表是否有同伴同行. 为了预防这两个逼啊了可能的多重共线性, 我们可以将这两个变量转为一个变量 “TravelAlone” (是否独自一人成行)
data['TravelAlone']=np.where((data['sibsp']+data['parch'])>0,0,1)
data.drop('sibsp',axis=1,inplace=True)
data.drop('parch',axis=1,inplace=True)
print(data.head())# 对 "embarked","sex"进行独热编码, 丢弃 'name', 'ticket'
final=pd.get_dummies(data,columns=['embarked','sex'])
final.drop('name',axis=1,inplace=True)
final.drop('ticket',axis=1,inplace=True)
print(final.head())
print(final.columns.values.tolist())  #获取dataframe的列名

得到:

pclass survived age ... embarked_S sex_female sex_male
0 1 1 29.0000 ... 1 1 0
1 1 1 0.9167 ... 1 0 1
2 1 0 2.0000 ... 1 1 0
3 1 0 30.0000 ... 1 0 1
4 1 0 25.0000 ... 1 1 0
['pclass', 'survived', 'age', 'fare', 'TravelAlone', 'embarked_C', 'embarked_Q', 'embarked_S', 'sex_female', 'sex_male']

(5)各特征的数据分析

1.年龄

plt.figure(figsize=(15,8))
ax=sns.kdeplot(final['age'][final.survived==1],color='darkturquoise',shade=True)
sns.kdeplot(final['age'][final.survived==0],color='lightcoral',shade=True)
plt.legend(['Survived','Died'])
plt.title('Density Plot of age for surviving population and deceased population')
ax.set(xlabel='Age')
plt.xlim(-10,85)
plt.show()

得到:

结论:生还与遇难群体的分布相似, 唯一大的区别是生还群体中有一部分低年龄的乘客. 说明当时的人预先保留了孩子的生还机会.

2.票价

plt.figure(figsize=(15,8))
#核密度估计图
ax=sns.kdeplot(final['fare'][final.survived==1],color='darkturquoise',shade=True)
sns.kdeplot(final['fare'][final.survived==0],color='lightcoral',shade=True)
plt.legend(['Survived','Died'])
plt.title('Density Plot of fare for surviving population and deceased population')
ax.set(xlabel='Fare')
plt.xlim(-20,200)
plt.show()

得到:

结论:生还与遇难群体的票价分布差异比较大, 说明这个特征对预测乘客是否生还非常重要. 票价和仓位相关, 也许是仓位影响了逃生的效果, 我们接下来看仓位的分析.

3.仓位

sns.barplot(x='pclass',y='survived',data=df,color='darkturquoise')   #箱形图
plt.show()

得到:

结论:一等舱的乘客生还几率最高。

4. 登船地点

sns.barplot('embarked', 'survived', data=df, color="teal")
plt.show() 

得到:

结论:法国 Cherbourge 登录的乘客生还率最高。

5.是否独立旅行

sns.barplot('TravelAlone', 'survived', data=final, color="mediumturquoise")
plt.show()

得到:

结论:女性的生还率比较高。

(6)利用logistic进行预测

from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
from sklearn.metrics import recall_score,precision_score,f1_score
from sklearn.metrics import roc_auc_score
#使用一下特征进行预测
col=['age','fare','TravelAlone','pclass','embarked_C','embarked_S','sex_male']
#创建x和y
x=final[col]
y=final['survived']
#划分训练集和测试集
x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=0.2,random_state=40)
#利用logistic回归进行训练
logi=LinearRegression()
logi.fit(x_train,y_train)
#利用训练模型进行预测
y_pred=logi.predict(x_test)
#y_pred为预测概率,需要转换成类别,一般>0.5为1
y_pred=np.where(y_pred>0.5,1,0)
print('准确率为 %2.3f'%accuracy_score(y_test,y_pred))
print('auc为 %2.3f'%roc_auc_score(y_test,y_pred))
#准确率、召回率和F1score
print(recall_score(y_test,y_pred),precision_score(y_test,y_pred),f1_score(y_test,y_pred))

得到:

准确率为 0.760
auc为 0.743
以下分别是召回率、查准率和f1score
0.6571428571428571 0.71875 0.6865671641791045

多项logistic回归系数解释_逻辑回归logistic(含python代码)相关推荐

  1. 多项logistic回归系数解释_深入解读Logistic回归结果(一):回归系数,OR

    深入解读Logistic回归结果(一):回归系数,OR 关键词:Logistic回归分析.lasso回归系数解读.回归系数解读 Logistic回归虽然名字叫"回归" ,但却是一种 ...

  2. python实现逻辑回归的流程_逻辑回归原理及其python实现

    September 28, 2018 7 min to read 逻辑回归原理及其python实现 原理 逻辑回归模型: $h_{\theta}(x)=\frac{1}{1+e^{-{\theta}^ ...

  3. 多项logistic回归系数解释_多元回归系数:我们都解释错了?

    作者:金钊 (中山大学) E-Mail: Note: 助教招聘信息请进入「课程主页」查看.因果推断-内生性 专题 ⌚ 2020.11.12-15 主讲:王存同 (中央财经大学):司继春(上海对外经贸大 ...

  4. logistic回归分析优点_逻辑回归的简单介绍

    一.逻辑回归的概念 逻辑回归又称logistic回归分析,是一种广义的线性回归分析模型,常用于数据挖掘,疾病自动诊断,经济预测等领域. 二.逻辑回归不是回归 从名字来理解逻辑回归.在逻辑回归中,逻辑( ...

  5. 交叉熵损失函数分类_逻辑回归(Logistic Regression)二分类原理,交叉熵损失函数及python numpy实现...

    本文目录: 1. sigmoid function (logistic function) 2. 逻辑回归二分类模型 3. 神经网络做二分类问题 4. python实现神经网络做二分类问题 ----- ...

  6. python逻辑回归_逻辑回归:使用Python的简化方法

    逻辑回归的目标是什么? 在逻辑回归中,我们希望根据一个或多个自变量(X)对因变量(Y)进行建模.这是一种分类方法.此算法用于分类的因变量.Y使用一个函数建模,该函数为X的所有值提供0到1之间的输出.在 ...

  7. 逻辑回归原理(python代码实现)

    原文: https://blog.csdn.net/csqazwsxedc/article/details/69690655 Logistic Regression Classifier逻辑回归主要思 ...

  8. 吴恩达《机器学习》课后测试Ex2:逻辑回归(详细Python代码注解)

    基于吴恩达<机器学习>课程 参考黄海广的笔记 import numpy as np import pandas as pd import matplotlib.pyplot as plt ...

  9. 算法笔记(11)逻辑回归算法及Python代码实现

    逻辑回归算法是一种被广泛使用的分类算法,通过训练数据中的正负样本,学习样本特征到样本标签之间的假设函数.逻辑回归假设因变量 y 服从伯努利分布,而线性回归假设因变量 y 服从高斯分布. 因此与线性回归 ...

  10. 多项logistic回归系数解释_因变量无序多分类资料的logistic回归

    转自个人微信公众号[Memo_Cleon]的统计学习笔记:因变量无序多分类资料的logistic回归. 因变量为无序多分类资料,或者因变量虽为有序多分类但不满足比例优势假定(平行性检验P>0.0 ...

最新文章

  1. 正确删除ORACLE归档日志文件
  2. 阿里云系列——3.企业网站备案步骤---2018-1-4
  3. 网络营销外包专员浅析定制网站更容易在网络营销外包中获取稳定排名
  4. 在ASP.NET中UrlRewrite的实现(能隐藏扩展名)之一
  5. 接口中可以有静态方法吗?
  6. Android中Bitmap和Drawable
  7. win7系统服务器环境配置,windows7系统安装与配置Tomcat服务器环境
  8. Windows 8系统平台上应用软件安装心得
  9. 真是的= =还是对linux不太了解啊
  10. java写一个外网访问的接口_Java程序员如何入门?教你写第一个程序
  11. mysql 主从 日志_mysql主从复制基于日志复制
  12. Centos7搭建openV pn服务器
  13. Android(Linux) led子系统分析
  14. 苹果怎么付费购买内存_苹果怎么清理隐藏内存?手机恢复如初都靠它了
  15. 如何查看电脑的上一次开机时间
  16. 直播软件app开发:如何开发一个可以免费打扑克的直播应用?
  17. iOS应用中crash 奔溃解析
  18. 强叔侃墙 NAT篇 NAT Server 三十二字真言(上篇)_实验一正一反,出入自如去反存正,自断出路
  19. 软件工程职业方向有哪些
  20. Linux下execl函数与execlp函数的具体详细用法

热门文章

  1. python cookbook 2字符串(2)
  2. 来自糯大米童鞋的 纯 golang 的 mp4 读写库。
  3. 2、使用Keras构建回归模型
  4. java严格模式_es严格模式、对象和扩展。
  5. 【转】python eval
  6. 微信中直接打开手机系统浏览器的实现
  7. 只知道人工智能远远不够 下一件大事将是边缘计算!
  8. nginx + lua 构建网站防护waf(一)
  9. 深入理解React、Redux
  10. oracle11g服务项及其启动顺序