ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

逻辑回归(分类算法)

2020-02-25 13:45:23  阅读:553  来源: 互联网

标签:逻辑 Xb 回归 分类 算法 np theta


逻辑回归(分类算法)

什么是逻辑回归

​ 在前面讲述的回归模型中,处理的因变量都是数值型区间变量,建立的模型描述是因变量的期望与自变量之间的线性关系。比如常见的线性回归模型:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fiMtyMlz-1582608209856)(E:\Typora图片\线性)]

​ 而在采用回归模型分析实际问题中,所研究的变量往往不全是区间变量而是顺序变量或属性变量,比如二项分布问题。通过分析年龄、性别、体质指数、平均血压、疾病指数等指标,判断一个人是否换糖尿病,Y=0表示未患病,Y=1表示患病,这里的响应变量是一个两点(0-1)分布变量,它就不能用h函数连续的值来预测因变量Y*(只能取0或1)*。
​ 总之,线性回归模型通常是处理因变量是连续变量的问题,如果因变量是定性变量,线性回归模型就不再适用了,需采用逻辑回归模型解决。

逻辑回归(Logistic Regression)是用于处理因变量为分类变量的回归问题,常见的是二分类或二项分布问题,也可以处理多分类问题,它实际上是属于一种分类方法

逻辑回归的优缺点

优点:

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

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

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

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

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

缺点 :

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

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

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

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

逻辑回归的推导

1. Sigmoid 函数:(z值就是预测值)

​ Logistic Regression虽然名字里带“回归”,但是它实际上是一种分类方法,用于两分类问题(即输出只有两种)。需要先找到一个预测函数(h),显然,该函数的输出必须是两个值(分别代表两个类别)。

所以利用了Logistic函数(或称为Sigmoid函数),函数形式为:

img

二分类问题的概率与自变量之间的关系图形往往是一个S型曲线,如图所示,采用的Sigmoid函数实现:

img

解释: 将任意的输入映射到[0,1]之间

我们能在线性回归中得到一个预测值,再将该值映射到Sigmoid函数中,这样就完成了由值到概率的转换,也就是分类。

2. 求导计算

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-d3X9ACpW-1582608209858)(E:\Typora图片\逻辑回归求导计算.png)]

5.求解(通过参数的变化得到最优解):

​ 逻辑回归的超参数:

  1. C 用于控制在求解最优化值时,损失函数所占的权重
  2. penalty 选择正则化类型,L1、L2

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ax3CKI3C-1582608209860)(E:\Typora图片\逻辑回归参数调优.png)]

逻辑回归解决多分类问题:

OVR方法:某个分类算法有N类,将某一类和剩余的类比较作为二分类问题,N个类别进行N次分类,得到N个二分类模型,给定一个新的样本点,求出每种二分类对应的概率,概率最高的一类作为新样本的预测结果。

OVO方法:某个分类算法有N类,将某一类和另一类比较作为二分类问题,总共可分为Cn2 即(n*(n-1))/2种不同的二分类模型,给定一个新的样本点,求出每种二分类对应的概率,概率最高的一类作为新样本的预测结果。

总结:

逻辑回归就是一个分类的算法,常见用在二分类当中,就是把我们的输入值在线性回归中转化为预测值,然后映射到Sigmoid 函数中,讲值作为x轴的变量,y轴作为一个概率,预测值对应的Y值越接近于1说明完全符合预测结果。但是拟合的越好,不代表效果就越好,有可能拟合过度。

注:拟合的越好的意思是,测试集的测试效果符合训练集的训练效果。在我看来训练集就是真实值的集合,测试集就是预测值的集合。

注:这里要注意一个关于数组切片的问题

img

​ 上面画圈的两个语句一个返回一维数组,一个返回三维数组

代码实战

#导入数据集,获取数据
import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
iris = datasets.load_iris()
x = iris.data
y = iris.target
X = x[y<2,:2]
Y = y[y<2]
plt.scatter(X[Y==0,0],X[Y==0,1],color = 'r')
plt.scatter(X[Y==1,0],X[Y==1,1],color = 'g')
plt.show()
#训练集数据分割
train_data,test_data,train_label,test_label = train_test_split(X,Y,random_state=666)
#定义sigmoid函数
def sigmoid(t):
    return 1/(1+np.exp(-t))
#定义损失函数
def J(theta,Xb,y):
    y_hat = sigmoid(Xb.dot(theta))
    return -np.sum(y * np.log(y_hat) + (1-y) * np.log(1 - y_hat)) / len(y)
# 定义损失函数倒数
def dj(theta,Xb,y):
    y_hat = sigmoid(Xb.dot(theta))
    return (Xb.T.dot(y_hat - y))/len(y)
#梯度下降法
def gradient_descent(Xb,y,initial_theta,eta,epsilon= 1e-8):
    theta = initial_theta
    while True:
        gradient = dj(theta,Xb,y)
        last_theta = theta
        theta = theta - eta * gradient
        if(abs(J(theta,Xb,y) - J(last_theta,Xb,y)) < epsilon):
            break
    return theta
#模型训练
Xb = np.hstack([np.ones((len(train_data),1)),train_data])

init_theta = np.zeros(Xb.shape[1])
eta = 0.001
res_theta = gradient_decsent(Xb,train_label,init_theta,eta)


X_test = np.hstack([np.ones((len(test_data),1)),test_data])

predict_y = sigmoid(X_test.dot(res_theta))
predict_y = np.array(predict_y >=0.5,dtype='int')
predict_y

#准确率评测
from sklearn.metrics import accuracy_score
accuracy_score(test_label,predict_y)

d(X_test.dot(res_theta))
predict_y = np.array(predict_y >=0.5,dtype=‘int’)
predict_y

#准确率评测
from sklearn.metrics import accuracy_score
accuracy_score(test_label,predict_y)


6x6x6x 发布了11 篇原创文章 · 获赞 0 · 访问量 120 私信 关注

标签:逻辑,Xb,回归,分类,算法,np,theta
来源: https://blog.csdn.net/x6x6x6x/article/details/104495885

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有