逻辑回归分类算法
Posted myshuzhimei
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了逻辑回归分类算法相关的知识,希望对你有一定的参考价值。
逻辑回归由于其简单、高效、可解释性强的特点,在实际用途中十分的广泛:从购物预测到用户营销响应,从流失分析到信用评价,都能看到其活跃的身影。可以说逻辑回归占据了分类算法中非常重要的地位。
逻辑回归:logistic regression,LR。模型公式是Logistic函数,也叫Sigmoid函数。图像形如S型曲线。它可以将实数映射到[0,1]区间用来做二分类。一般选择0.5作为阀值,大于阀值的归为类1,小于阀值的归为类0。公式(Y为决策值,x为特征值,e为自然对数):
如果希望对正例样本有更高的准确率,则可以把阈值适当地调高,例如调高到0.6。
如果希望对正例样本有更高的召回率,则可以把阈值适当地降低,例如降低到0.4。
用python拟合了不同的自变量取值下,与因变量的成像。结果都是S型曲线,取值集中在0和1上。
1.自变量是线性连续值:
x = np.arange(-20, 20, 0.1)
y =1/( 1+math.e**(-x))
plt.scatter(x, y, c = ‘r‘, marker = ‘o‘)
2.自变量是一元三次方程式的取值:
z = np.arange(-20, 20, 0.1)
x = 2*z**3+4*z**2+3*z+10
y =1/( 1+math.e**(-x))
plt.scatter(x, y, c = ‘r‘, marker = ‘o‘)
损失函数定义与最小化:对数损失函数/梯度下降法求极值
先来回顾下线性回归的损失函数:
如果逻辑回归也用这个,这会引发损失函数为非凸函数的问题,简单来说就是有很多个局部最低点。
而理想的损失函数是一个如下图所示的碗状结构的凸函数,这样求解到局部最低点,就一定是全局最小值。
用极大似然思想推导出其损失函数,参考https://blog.csdn.net/programmer_wei/article/details/52072939。结论:
汇总所有点的损失,即:
如果y = 1, 判断Y(x)=1,则Cost = 0:预测值和真实值相等,损失本该为0;
如果y = 1, 判断Y(x)=0,则Cost ->∞:预测值和真实值相反,损失无穷大。
用梯度下降法求损失最小值,即可求得Logistic函数中的参数:各特征的特征向量、唯一截距。
比如下图的:
z=w0+w1x1+w2x2+...+wnxn
表示有n个特征Xi,最后会求出每个特征对应的特征向量Wi,以及截距W0。
疑问:Z为什么是线性函数?为什么不是多项式函数?暂未看到相关资料说明。
简单代码示例
import numpy as np
import math
import matplotlib.pyplot as plt
from sklearn import linear_model
x = [[20,3],[23,7],[31,10],[42,13],[50,7],[60,5]]
y = [0,1,1,1,0,0]
lr = linear_model.LogisticRegression()
lr.fit(x,y)
testX = [[28,10]]
label = lr.predict(testX)
print(label)#预测分类值
prob = lr.predict_proba(testX)
print(prob)#预测分类分别是0和1的概率
print lr.coef_,lr.intercept_,lr.n_iter_ #输出特征向量、截距、迭代次数
#根据上述输出的特征向量和截距,输出Logistic函数图像
x1 = np.arange(20, 60, 1)
x2 = np.arange(30, -10, -1)#也可以写成x2 = np.arange(-10, 30, 1)
#x1和x2不光个数要相同,还要和模拟样本数据吻合,如果x2 = np.arange(20, 60, 1)就看不到S型图像了
x = (-0.19730001)*x1+(0.91555745)*x2-0.04131838
y =1/( 1+math.e**(-x))
plt.scatter(x, y, c = ‘r‘, marker = ‘o‘)
plt.show()
#用预测点计算Logistic函数结果,即预测分类较大的概率值
x1=28
x2=10
x= (-0.19730001)*x1+(0.91555745)*x2-0.04131838
y =1/( 1+math.e**(-x))
print y
输出:
以上是关于逻辑回归分类算法的主要内容,如果未能解决你的问题,请参考以下文章