逻辑回归(分类算法)

逻辑回归(分类算法)

什么是逻辑回归

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(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函数),函数形式为:

逻辑回归(分类算法)

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

逻辑回归(分类算法)

解释: 将任意的输入映射到[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说明完全符合预测结果。但是拟合的越好,不代表效果就越好,有可能拟合过度。

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

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

逻辑回归(分类算法)

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

代码实战

#导入数据集,获取数据
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 私信 关注
上一篇:【DB笔试面试449】如何监控数据库的登陆登出、DDL语句等内容?


下一篇:常见分布总结