逻辑斯谛回归(Logistic回归)最详解 | 您所在的位置:网站首页 › logistic回归分析对变量的要求 › 逻辑斯谛回归(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 在X_train中保持不变(年龄、资本损失...)。X_train, X_test : 每一行包含一个510-dim的特征,代表一个样本。Y_train: label = 0 表示 "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): #梯度下降,第一种:根据矩阵乘法直接计算w h1=[] 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-h2 w+=eta*data.transpose()*err #用矩阵梯度下降,下面也是 #print(w.shape)打印参数w #print(w) ''' for i in range(100): #梯度下降,第二种:一个一个的下降,训练模型参数w for 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,大于5000 else: print(false) #输出为0,小于等于5000逻辑回归也可以做以下的二分类问题: 1.区分是否是垃圾邮件 2.银行判断是否给用户办信用卡 3.从氙气病症预测病马的死亡率
|
CopyRight 2018-2019 实验室设备网 版权所有 |