逻辑斯谛回归(Logistic回归)最详解
Logistic回归学习思路
一.逻辑回归模型的原理与定义(主要思想)
逻辑斯谛回归是经典的分类方法,它属于对数线性模型,原理是根据现有的数据对分类边界线建立回归公式,以此进行分类。(主要思想)
定义:
在线性回归模型的基础上,使用Sigmoid函数,将线性模型的结果压缩到[0,1]之间,使其拥有概率意义,它可以将任意输入映射到[0,1]区间,实现值到概率转换。
- 属于概率性判别式模型
- 线性分类算法
在学习逻辑回归模型之前,先来看一下逻辑斯谛分布,因为我们的逻辑斯蒂模型就是根据逻辑斯蒂分布得到的;通过参数估计方法直接估计出参数,从而得到P(Y|X)。
下面给出《统计学习方法》上逻辑斯蒂分布的定义:
二.逻辑回归的推导过程
为了实现根据所有输入预测出类别,为此引入了sigmoid函数p=1/(1+exp(-z)),sigmoid函数刚好也有二分类的功能。
1. 为什么要使用sigmoid函数作为假设?
因为线性回归模型的预测值为一般为大于1的实数,而样本的类标签为(0,1),我们需要将分类任务的真实标记y与线性回归模型的预测值联系起来,也就是找到广义线性模型中的联系函数。如果选择单位阶跃函数的话,它是不连续的不可微。而如果选择sigmoid函数,它是连续的,而且能够将z转化为一个接近0或1的值。
当z=0时,p=0.5
当z>0时,p>0.5 归为1类
当z<0时,p<0.5 归为0类
确定了分类器的函数形式,最佳回归系数是多少,如何确定?
sigmoid函数的输入记为z,将线性模型结果赋值到z,即:
z=w0x0+w1x1+w2x2+w3x3...wnxn
如果采用向量的写法,
上述公式写成z=WT*X,
其中向量X是分类器的输入数据,即为特征值;向量W就是我们要找到的最佳参数,从而使得分类器尽可能精确。
为了找出最佳的回归系数,所以我们可以对两种损失函数进行优化算法
①均方差 (后面会介绍舍弃使用这种作为损失函数)
②对数极大似然估计法
三.数学模型
二项逻辑斯蒂回归模型
知道分布的定义和推导过程之后,就是给出我们的逻辑斯蒂模型了:
引用了李航的《统计学习方法》书中如下
注意:(1)最终的结果是通过比较P(Y=1|X)和P(Y=0|X)的大小来确定类别的(类似于朴素贝叶斯);
(2)b在这里其实可以看做是w0x0,其中x0 = 1;
(3)其实本质上这个就是一个二项分布,所以遵循二项分布的分布律。
事件的对数几率(log odds)
也就是说,如果我的模型是逻辑回归模型,那么事件{Y=1|X}发生的对数几率就是输入X的线性函数(模型),反之,知道了这个推论,我们是可以反推出逻辑斯蒂模型的形式的
四.目标函数
求目标参数,常用目标函数的选取:
①损失函数:均方差(标准值-预测值)
②对数似然函数
首先极大似然函数是一种确定模型参数的方法,它确定参数值的方法是通过找到最大化模型产生真实数据的那一组参数。
最大似然估计就是通过已知结果去反推最大概率导致该结果的参数。
极大似然估计是概率论在统计学中的应用,它提供了一种给定观察数据来评估模型参数的方法,即 “模型已定,参数未知”,通过若干次试验,观察其结果,利用实验结果得到某个参数值能够使样本出现的概率为最大,则称为极大似然估计。逻辑回归是一种监督式学习,是有训练标签的,就是有已知结果的,从这个已知结果入手,去推导能获得最大概率的结果参数,只要我们得出了这个参数,那我们的模型就自然可以很准确的预测未知的数据了。(对极大似然函数的详细理解可以参考:https://blog.csdn.net/qq_44543774/article/details/109735754)
通过极大似然推导得出逻辑回归的目标函数,这里我给出手写的推导:
极大似然函数是概率论在统计学中的应用,它提供了一种给定观察数据来评估模型参数的方法,即 “模型已定,参数未知”,通过若干次试验,观察其结果,利用实验结果得到某个参数值能够使样本出现的概率为最大,则称为极大似然估计。通过求极大似然函数来得到参数w的估计值。
以上就是通过极大似然函数作为目标函数,得出了参数向量w值
综上logistic回归模型的目标函数是极大似然函数
五.算法源码
源码:
from sklearn.linear_model import LogisticRegression
from math import exp
from math import *
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from numpy import *
import numpy as npclass LogisticRegressionClassifier(object):def __init__(self,eta=0.1,loop=30):self.eta=etaself.loop=loopdef sigmoid(self,x):return 1.0/(1+exp(-x))def data_tranforce(self,x_train):data=[]d=[]for x in x_train: #x因为是数组类型data.append([1.0,*x]) #将每一行数组增加一个1.0数值,*x是去掉[]符号,形成一行数值#c=list(x) #将一维数组变成列表#c.insert(0, 1.0) #这种insert()方法必须是列表#print(list(x).insert(0,1.0))#d.append(c) #类似d=[[1.0,2,3],[1.0,3,4.8]]return datadef fit(self,x_train,y_train):data_mat=self.data_tranforce(x_train) #处理每个样本的特征值n=shape(data_mat)[1] #求出data_mat对应参数的个数self.weight=ones((n,1)) #初始化参数w数组cls=self.loopfor k in range(cls): #循环多少次for i in range(len(x_train)): #遍历每一个样本h=self.sigmoid(np.dot(data_mat[i],self.weight))err=(y_train[i]-h)#随着每次更新err下面就会更新self.weight的向量self.weight+=self.eta*err*np.transpose([data_mat[i]]) #[data_mat[i]]变成1*4的数组,一维数组转置必须加一个[]#测试训练模型的准确性def test(self,x_test,y_test):numbers=0x_test = self.data_tranforce(x_test) # 处理每个样本的特征值加一个1.0for x,y in zip(x_test,y_test):result=np.dot(x,self.weight)if(result>0 and y==1)or(result<0 and y==0):numbers+=1return float(numbers)/float(len(x_test))
def main():load=load_iris()x=load.data[:100,:2]y=load.target[:100]y=np.where(y==1,1,0)x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=0.3)my_l=LogisticRegressionClassifier()my_l.fit(x_train,y_train)print("准确率:",my_l.test(x_test,y_test))if __name__== "__main__":main()
运行结果:
用示例来解释代码的执行过程:
六.优缺点
优点:计算代价不高,易于理解和实现
缺点:容易欠拟合,分类精度不高
七.应用场景
逻辑回归主要是解决二分类问题
使用逻辑回归判断年收入
项目描述
二元分类是机器学习中最基础的问题之一,在这份教学中,你将学会如何实作一个线性二元分类器,来根据人们的个人资料,判断其年收入是否高于 50,000 美元。我们将用 logistic regression 来达成以上目的,你可以尝试了解、分析两者的设计理念及差别。 实现二分类任务:
- 个人收入是否超过50000元?
数据集介绍
这个资料集是由UCI Machine Learning Repository 的Census-Income (KDD) Data Set 经过一些处理而得来。为了方便训练,我们移除了一些不必要的资讯,并且稍微平衡了正负两种标记的比例。事实上在训练过程中,只有 X_train、Y_train 和 X_test 这三个经过处理的档案会被使用到,train.csv 和 test.csv 这两个原始资料档则可以提供你一些额外的资讯。
- 已经去除不必要的属性。
- 已经平衡正标和负标数据之间的比例。
特征格式
- train.csv,test_no_label.csv。
- 基于文本的原始数据
- 去掉不必要的属性,平衡正负比例。
- X_train, Y_train, X_test(测试)
- train.csv中的离散特征=>在X_train中onehot编码(学历、状态...)
- train.csv中的连续特征 => 在X_train中保持不变(年龄、资本损失...)。
- X_train, X_test : 每一行包含一个510-dim的特征,代表一个样本。
- Y_train: label = 0 表示 "<=50K" 、 label = 1 表示 " >50K " 。
项目要求
请动手编写 gradient descent 实现 logistic regression
- 请动手实现概率生成模型。
- 单个代码块运行时长应低于五分钟。
- 禁止使用任何开源的代码(例如,你在GitHub上找到的决策树的实现)。
数据准备
项目数据集以及源码:https://e.coding.net/xucancan1/logistic/logistic.git。
源码:
# 下面该你动手啦!
import pandas as pd
import numpy as np
from math import exp
from math import *
df=pd.read_csv("work/data/X_train",encoding="big5")
#print(df)
train_label=pd.read_csv("work/data/Y_train",encoding="big5")
train_label=train_label.iloc[:700,1:] #处理标签
train_label=np.array(train_label) #处理标签
print(train_label.shape)
#print(train_label) #打印标签
df=df.iloc[:700,1:] #处理特征
print(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>")
df=np.array(df)
df=df.astype("float") #训练集特征的处理
#print(df.shape)
#print(df)w=np.ones((511,1)) #初始化w
eta=0.00000008
loop= 100 #循环次数
m=len(train_label)
data=[]
def sigmoid(x):return 1.0/(1+exp(-x))
for k in df:data.append([1.0,*k]) #每一个特征数据样本添加一个1.0
#print(np.shape(data))
data=np.array(data) #特征数据
#print(data)w=np.mat(w)
data=np.mat(data)for i in range(1000): #梯度下降,第一种:根据矩阵乘法直接计算wh1=[]for k in range(m):h=sigmoid(np.dot(data[k],w))h1.append(h)h2=np.array(h1)h2=h2.reshape(700,1) #变成列向量#print(h2.shape)err=train_label-h2w+=eta*data.transpose()*err #用矩阵梯度下降,下面也是
#print(w.shape)打印参数w
#print(w)
'''
for i in range(100): #梯度下降,第二种:一个一个的下降,训练模型参数wfor k in range(m):h=sigmoid(np.dot(data[k],w))err=train_label[k]-h#print(err)d=data[k].reshape(511,1)d=np.array(d)w+=eta*err*d #梯度下降print(w)
'''test=pd.read_csv("work/data/X_test",encoding="big5") #处理测试集
test=test.iloc[:,1:] #处理数据集
test=np.array(test)
print(test.shape)
#print(test)
true=1
false=0
for t in test: #在每个测试样本增加一个1.0的特征值,并预测年收入dt=[1.0,*t]h=np.dot(dt,w)if h>0:print(true) #输出为1,大于5000else:print(false) #输出为0,小于等于5000
逻辑回归也可以做以下的二分类问题:
1.区分是否是垃圾邮件
2.银行判断是否给用户办信用卡
3.从氙气病症预测病马的死亡率
逻辑斯谛回归(Logistic回归)最详解相关推荐
- kmeans python interation flag_机器学习经典算法-logistic回归代码详解
一.算法简要 我们希望有这么一种函数:接受输入然后预测出类别,这样用于分类.这里,用到了数学中的sigmoid函数,sigmoid函数的具体表达式和函数图象如下: 可以较为清楚的看到,当输入的x小于0 ...
- Logistic Regression (LR) 详解
Logistic Regression (LR) 详解 最近忙着准备面试,偶然发现同学Q君在很认真地看LR(Logistics Regression),不由得心生蔑视,这么简单的模型有什么好研究的?结 ...
- 逻辑回归原理详解(附手写推导)
目录 一.逻辑推导 二.手写推算逻辑回归运算步骤 1.梯度下降法 2.最大似然估计法 三.用梯度下降法求损失函数最小值 四.代码部分 一.逻辑推导 因部分内容与作者之前所发布的文章有所重复,故只对新的 ...
- 逻辑回归模型详解(Logistic Regression)
目录 广义线性模型 极大似然法 逻辑回归的假设函数 逻辑回归的损失函数 交叉熵损失函数 为什么LR模型损失函数使用交叉熵不用均方差 交叉熵损失函数的数学原理 交叉熵损失函数的直观理解 交叉熵简介 对数 ...
- 【机器学习】逻辑斯蒂回归(Logistic Regression)详解
引言 LR回归,虽然这个算法从名字上来看,是回归算法,但其实际上是一个分类算法,学术界也叫它logit regression, maximum-entropy classification (MaxE ...
- 逻辑回归(Logistic regression)详解-并用scikit-learn训练逻辑回归拟合Iris数据集
这篇文章主要介绍逻辑回归背后的一些概率概念,给你一些直观感觉关于它的代价函数的由来.并且我也介绍了关于最大似然估计(maximum likelihood)的概念,用这个强大的工具来导出逻辑回归的cos ...
- ESL3.5 学习笔记(主成分回归,偏最小二乘回归步骤详解)
3.5 运用派生输入方向的方法 这是一篇有关<统计学习基础>,原书名The Elements of Statistical Learning的学习笔记,该书学习难度较高,有很棒的学者将其翻 ...
- Stata 回归结果详解
目录 一.数据信息 二.指标 1.上半部分 2.下半部分 三.详细解释 SSM - 模型平方和 SSR - 残差平方和 SST - 总平方和 R-squared - R方 - 拟合系数 Adj R-s ...
- 逻辑斯蒂回归算法详解
逻辑斯蒂回归算法可用于分类问题,其本质是在线性回归的算法上用sigmoid函数进行模型变换,使得目标值介于0-1之间.本文用于对逻辑斯蒂回归算法(Logistics Regression)进行详细讲述 ...
- python 决策树回归参数_python决策树之CART分类回归树详解
{"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],&q ...
最新文章
- Numpy入门教程:06. 排序,搜索和计数
- vs2015 x86 opencv3.3(编译)
- pythonunbuffered_python所遇到的坑
- 【Python学习系列十七】基于scikit-learn库逻辑回归训练模型(delta比赛代码2)
- 11行代码AC——习题2-4 子序列的和(subsequence)——解题报告
- Python面试总结(四)ip正则与三次握手四次挥手
- python输入的字符串转换为对应的数字类型_Python合集之Python运算符(四)
- drcom linux怎么运行,linux下使用drcom登录认证
- 如何在今日头条上持续生产优质内容
- 英文字母对应的Unicode编码
- 靠谱,这个低代码平台贼好用
- python抓取图片数字_从opencv python图像中提取数字
- python模拟实现QQ邮箱登录
- Spring中循环依赖的解决办法
- Android端记录跑步运动轨迹数据的App
- 程序员应该如何写好自己的简历
- python scipy.stats.norm.cdf_python scipy stats.norm用法及代码示例
- Netgear R6220桥接组网设置
- 重大疾病保险都包含哪些疾病?
- 微信机器人java-wechaty
热门文章
- boost::mpi模块实现scan集合的测试
- boost::hana::zero用法的测试程序
- boost::gil模块数字扩展中的 resample_pixels() 示例
- Boost.Function 库示例
- Boost:双图bimap与Boost xpressive的测试程序
- ITK:将图像传递给函数
- VTK:IO之ImageWriter
- Qt Creator设置3D组件属性
- OpenGL RGTC Compressor压缩实例
- C++的#include_next