首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

遇见YI算法之逻辑回归

Hi,手机边的你们还好吗?好久不见,最近好多朋友在问怎么好久不更文了,在这里小哪吒要和大家说声抱歉,由于个人一些原因把这块给忽略了,废话不多说,希望以后会坚持继续推文,感谢大家对遇见YI算法的关注和支持!

今天在这里就给大家介绍下逻辑回归以及梯度下降。

1、线性回归

首先给大家介绍下我们所熟悉的线性回归,给定n个属性描述的示例,其中是X在第i个的属性值,而各属性值在X中影响重要性不同,故有其权重),因此我们可以得到一个预测函数:

即 :

其中为的转置,b为误差服从均值为0的正态分布。

2、逻辑回归

逻辑回归(Logistic Regression, LR)模型其实仅在线性回归的基础上,套用了一个逻辑函数,面对一个回归或者分类问题,建立代价函数,然后通过优化方法迭代求解出最优的模型参数,然后测试验证我们这个求解的模型的好坏。其实逻辑回归的本质就是极大似然估计。周志华老师《机器学习》一书中又称对数几率回归。

根据Andrew NG的讲义,若用线性回归做分类预测,如果由于线性回归在整个实数域内敏感度一致,而分类范围,需要在[0,1],而线性回归会存在一些误差干扰项b,使得线性回归的鲁棒性很差。所以对于分类问题,我们只需找一个单调可微函数将分类任务的真实标记y与线性回归模型的预测值联系起来。

(1)逻辑回归模型

假设有一个二分类问题,输出为y∈,而线性回归模型产生的预测值

是实数值,我们希望有一个理想的阶跃函数来帮我们实现z值到0/1值的转化,得到单位阶跃函数:

然而该函数不连续,我们需要找一个单调可微的函数,于是便找到了Sigmoid函数(这里周志华《机器学习》书中称为对数几率函数,原因可参考P58页)来替代:

两者的图像如下图所示:

将z带入替代函数,得到:。

下面看看如何确定和b,若y=为分类结果,将y视为类1的后验概率估计,则:

构建逻辑回归模型f(θ),最典型的构建方法便是应用极大似然估计。首先,对于单个样本,其后验概率为:

极大似然函数为:

log似然是:

(2)梯度下降

逻辑回归模型f(θ),等价于(可参考周志华《机器学习》P59页):

采用梯度下降法:

从而迭代θ至收敛即可:

(3)模型评估

对于LR分类模型的评估,常用AUC来评估,关于AUC的更多定义与介绍可参考http://www.cnblogs.com/guolei/archive/2013/05/23/3095747.html

以上就是逻辑回归的一些基础原理,有讲的不明白的可以参考:

[1] 周志华. 机器学习 : Machinelearning[M]. 清华大学出版社, 2016.

[2]Andrew NG. Logistic Regression Classification

[3]Peter.机器学习实战[M]. 人民邮电出版社

[5]https://www.cnblogs.com/sparkwen/p/3441197.html

3、python实现模型

下面根据实例给出python代码:(这个例子是《机器学习实战》逻辑回归的一个实例:从疝气病症预测病马的死亡率。)

1、依据原理公式,直接python实现

from numpy import *

importmatplotlib.pyplot as plt

##做归一化处理

def loadData(filename):

data = loadtxt(filename)

m,n = data.shape

print ('the number of examples:',m)

print ('the number of features:',n-1)

x = data[:,0:n-1]

max = x.max(0)

min = x.min(0)

x = (x - min)/((max-min)*1.0) #scaling

y = data[:,n-1:n]

return x,y

#定义替代函数thesigmoid function

def sigmoid(z):

return 1.0 / (1 + exp(-z))

#损失函数thecost function

def costfunction(y,h):

y = array(y)

h = array(h)

J = sum(y*log(h))+sum((1-y)*log(1-h))

return J

#梯度下降算法thebatch gradient descent algrithm

def gradescent(x,y):

m,n = shape(x) #m: number of training example; n: numberof features

x = c_[ones(m),x] #add x0

x = mat(x) # to matrix

y = mat(y)

a = 0.0000025 # learning rate

maxcycle = 4000

theta = zeros((n+1,1)) #initial theta

J = []

for i in range(maxcycle):

h = sigmoid(x*theta)

theta = theta + a * (x.T)*(y-h)

cost = costfunction(y,h)

J.append(cost)

plt.plot(J)

plt.show()

return theta,cost

#the stochasticgradient descent (m should be large,if you want the result is good)

defstocGraddescent(x,y):

m,n = shape(x) #m: number of training example; n: numberof features

x = c_[ones(m),x] #add x0

x = mat(x) # to matrix

y = mat(y)

a = 0.01 # learning rate

theta = ones((n+1,1)) #initial theta

J = []

for i in range(m):

h = sigmoid(x[i]*theta)

theta = theta + a *x[i].transpose()*(y[i]-h)

cost = costfunction(y,h)

J.append(cost)

plt.plot(J)

plt.show()

return theta,cost

#plot the decisionboundary

defplotbestfit(x,y,theta):

plt.plot(x[:,0:1][where(y==1)],x[:,1:2][where(y==1)],'ro')

plt.plot(x[:,0:1][where(y!=1)],x[:,1:2][where(y!=1)],'bx')

x1= arange(-4,4,0.1)

x2 =(-float(theta[0])-float(theta[1])*x1)/float(theta[2])

plt.plot(x1,x2)

plt.xlabel('x1')

plt.ylabel(('x2'))

plt.show()

defclassifyVector(inX,theta):

prob = sigmoid((inX*theta).sum(1))

return where(prob >= 0.5, 1, 0)

## 准确率

def accuracy(x, y,theta):

m = shape(y)[0]

x = c_[ones(m),x]

y_p = classifyVector(x,theta)

accuracy = sum(y_p==y)/float(m)

return accuracy

##调用上面代码:

x,y =loadData("E:/Python/work/horseColicTraining.txt")

theta,cost =gradescent(x,y)

print ('J:',cost)

##引入训练数据

ac_train = accuracy(x,y, theta)

print ('accuracy of thetraining examples:', ac_train)

## 引入测试数据

x_test,y_test =loadData('E:/Python/work/horseColicTest.txt')

ac_test =accuracy(x_test, y_test, theta)

print ('accuracy of thetest examples:', ac_test)

运行上面代码得到:

the number of examples: 299

the number of features: 21

accuracy of the training examples: 0.6220735785953178

the number of examples: 67

the number of features: 21

accuracy of the test examples: 0.7014925373134329

2、引入python中scikit-learn机器学习库

##引入包使用

import scipy as sp

import numpy as np

fromsklearn.cross_validation import train_test_split

from sklearn importmetrics

fromsklearn.linear_model import LogisticRegression

##定义引入数据并归一化处理

def loadData(filename):

data = loadtxt(filename)

m,n = data.shape

print ('the number of examples:',m)

print ('the number of features:',n-1)

x = data[:,0:n-1]

max = x.max(0)

min = x.min(0)

x = (x - min)/((max-min)*1.0) #scaling

y = data[:,n-1:n]

return x,y

##引入训练数据并归一化处理

x,y =loadData("E:/Python/work/horseColicTraining.txt")

x_train=x

##将y内list合并

y1=[]

for i in range(len(y)):

y1.extend(y[i].tolist())

y_train=np.array(y1)

#print(x_train)

#print(y_train) #查看样本

#调用逻辑回归

model =LogisticRegression()

model.fit(x_train,y_train)

print(model) #输出模型

##引入测试数据并归一化处理

x,y =loadData("E:/Python/work/horseColicTest.txt")

x_test=x

##将y内list合并

y1=[]

for i in range(len(y)):

y1.extend(y[i].tolist())

y_test=np.array(y1)

#print(x_test)

#print(y_test) #查看样本

#预测makepredictions

expected = y_test #测试样本的期望输出

predicted =model.predict(x_test) #测试样本预测

#输出结果

print(metrics.classification_report(expected,predicted)) #输出结果,精确度、召回率、f-1分数

print(metrics.confusion_matrix(expected,predicted)) #混淆矩阵

运行上面代码得到:

以上就是逻辑回归的原理与应用,对于pyspark的代码实现后期会更新,感谢您的阅读,请指导!

如需要原数据及源代码,可关注公众号:遇见YI算法,发送消息给小哪吒。

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180506G02VVX00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券