一、数学原理
逻辑斯谛回归模型(Logistic regression)是对数线性模型,经典的分类方法。
算法思路: 给定输入实例x,分别利用二项逻辑斯谛回归模型计算P(Y=1|x)与P(Y=0|x),比较两个概率值的大小,将x分到概率较大的那一类。
**算法特点:**通过逻辑斯谛回归模型的定义式 P(Y=1|x) 可以将线性函数 *x转换为概率值,线性函数值 *x越接近正无穷,概率值越接近为1,线性函数越接近负无穷,概率值越接近为0。
(1)逻辑斯谛回归
设X为连续随机变量,X服从逻辑斯谛分布是指X具有以下分布函数F(x)和密度函数f(x)
分布函数F(x)和密度函数f(x)的图形为,F(x)以(
,1/2)为中心对称。
(2)二项逻辑斯谛回归模型
二项逻辑斯谛回归模型满足如下条件概率
x(n维特征向量)为输入,Y
{0,1}为输出,
为权值向量,b为偏置。将权值向量和输入向量加以补充,这时,逻辑斯谛模型如下
逻辑斯谛模型特点
一个事件发生的几率是指该事件发生的概率除以该事件不发生的概率。则该事件的对数几率为
对于逻辑斯谛回归而言,则逻辑斯谛模型的对数几率为
*x,
含义: 通过逻辑斯谛回归模型的定义式 P(Y=1|x) 可以将线性函数
*x转换为概率值,线性函数值
*x越接近正无穷,概率值越接近为1,线性函数越接近负无穷,概率值越接近为0。
(3)逻辑斯谛回归模型参数估计
采用极大似然法估计模型参数,以对数似然函数为目标函数的最优化问题采用的方法为梯度下降法和拟牛顿法。原理如下:
二、逻辑回归(Logistic Regression)与线性回归(Linear Regression)区别
- 逻辑回归是分类模型,要求因变量是分类型变量,输出变量类别,逻辑回归的参数计算方法是梯度下降。
- 线性回归是回归模型,要求因变量是连续性数值变量,输出连续值,线性回归的参数计算方法是最小二乘法。
实际上逻辑回归是在线性回归的基础上,加了一个sigmod函数,逻辑回归需要把线性回归的值作为sigmod函数的输入,通过sigmod函数计算出一个非常接近0或者1的数,这个0或者1就是逻辑回归的最终输出。
三、逻辑回归与线性回归代码实现
分为两种实现
sklearn(调用库)
python3(机器学习实战源代码第五章,logistic回归)
代码在github
线性回归sklearn实现
sklearn.linear_model.LinearRegression(fit_intercept=True, normalize=False, copy_X=True, n_jobs=None)
参数:
1、fit_intercept:bool量,选择是否需要计算截距,默认为True,如果中心化了的数据可以选择false
2、normalize:bool量,选择是否需要标准化(中心化),默认为false,和参数fit_intercept有关,自行思考
3、copy_x:bool量,选择是否幅值X数据,默认True,如果否,可能会因为中心化把X数据覆盖
4、n_job:int量,选择几核用于计算,默认1,-1表示全速运行
import numpy as np
from sklearn.linear_model import LinearRegression#线性回归
import matplotlib.pyplot as plt#用于作图
x = [[1], [1], [2], [2]]
y = [1, 2, 2, 3]
# y = np.dot(X, np.array([1, 2])) + 3
reg = LinearRegression().fit(x, y)### y = 1 * x_0 + 2 * x_1 + 3
print (x,y)
y1 = 1 * x + 0.5
plt.scatter(x,y1)
plt.show()
print (reg.score(x, y))
print (reg.intercept_)##截距
print (reg.coef_)##系数
逻辑回归sklearn实现
sklearn.linear_model.LogisticRegression(penalty=’l2’, dual=False, tol=0.0001, C=1.0, fit_intercept=True, intercept_scaling=1, class_weight=None, random_state=None, solver=’warn’, max_iter=100, multi_class=’warn’, verbose=0, warm_start=False, n_jobs=None)
参数介绍;
- 正则化选择参数:str,‘l1’或’l2’,默认:‘l2’。 ‘newton-cg’,'sag’和’lbfgs’解算器仅支持l2处罚。一般如果解决过拟合,l2就够了,如果l2不行,考虑l1,若模型特征较多,不需要那么多特征,也可以考虑l1正则项。
- 优化算法选择参数solver,str,{‘newton-cg’,‘lbfgs’,‘liblinear’,‘sag’,‘saga’},默认:‘liblinear’。
'liblinear’使用坐标轴下降法来迭代优化损失函数。
‘lbfgs’ 利用损失函数二阶导数矩阵即海森矩阵来迭代优化损失函数。
'newton-cg’利用损失函数二阶导数矩阵即海森矩阵来迭代优化损失函数。
'sag’使用随机平均梯度下降,是梯度下降法的变种,和普通梯度下降法的区别是每次迭代仅仅用一部分的样本来计算梯度,适合于样本数据多的时候。
对于小数据集,‘liblinear’是一个不错的选择,而’sag’和’saga’对于大数据集来说更快。对于多类问题,只有’newton-cg’,‘sag’,'saga’和’lbfgs’处理多项式损失;‘newton-cg’,'lbfgs’和’sag’只能选择L2惩罚项而’liblinear’能选择L1惩罚和L2。“sag”和“saga”能在具有归一化的数据上快速收敛。 可以使用sklearn.preprocessing中的缩放器预处理数据。样本量很大的时候可以选择sag。
-
分类方式选择参数multi_class : str, {‘ovr’, ‘multinomial’}, default:‘ovr’
在二元逻辑回归上,ovr和multinomial并没有任何区别,区别主要在多元逻辑回归上。OvR相对简单,但分类效果相对略差(这里指大多数样本分布情况,某些样本分布下OvR可能更好)。而MvM分类相对精确,但是分类速度没有OvR快。如果选择了ovr,则4种损失函数的优化方法liblinear,newton-cg,lbfgs和sag都可以选择。但是如果选择了multinomial,则只能选择newton-cg, lbfgs和sag了。 -
class_weight(类型权重参数) : dict or ‘balanced’, default: None,可以自己定义,或者样本分布不均衡的时候选择balanced
-
返回参数
- coef_: array,shape(1,n_features)或(n_classes,n_features)
决策函数中的特征系数。当给定问题是二分类时,coef_具有形状(1,n_features)。 - intercept_: array,shape(1,)或(n_classes,),截距
- n_iter_ : 迭代次数
代码实例
from sklearn.linear_model import LinearRegression
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.model_selection import cross_val_score
from sklearn.metrics import confusion_matrix
import numpy as np
from sklearn.model_selection import learning_curve
import matplotlib.pyplot as plt
from sklearn import tree
from sklearn.metrics import classification_report
from sklearn.metrics import accuracy_score
from sklearn.linear_model import LogisticRegression
iris=datasets.load_iris()
x=iris.data
y=iris.target
x_train,x_test,y_train,y_test =train_test_split(x,y,test_size=0.3,random_state=0)
model = LogisticRegression(penalty='l2',solver='liblinear').fit(x_train,y_train)
print ('train_score is',model.score(x_train,y_train))
print ('test_score is',model.score(x_test,y_test))
y_pred=model.predict(x_test)
print (y_pred)
print (accuracy_score(y_test,y_pred))
print (confusion_matrix(y_test, y_pred))
print (classification_report(y_test, y_pred))
print (model.decision_function(x_test))##预测样本的置信度分数。
print (model.predict_proba(x_test))##输出分类概率,返回每种类别的概率
##模型效果获取
print (model.coef_)
print (model.intercept_)
print (model.classes_)
print (model.n_iter_)
print (model.feature_importances_)
四、逻辑回归的面试点总结
逻辑回归假设数据服从伯努利分布,通过极大化似然函数的方法,运用梯度下降来求解参数,来达到将数据二分类的目的。
(1)、五个基本问题
- 逻辑回归的假设 (基本假设是假设数据服从伯努利分布)
- 逻辑回归的损失函数 (损失函数是它的极大似然函数)
- 逻辑回归的求解方法
由于该极大似然函数无法直接求解,我们一般通过对该函数进行梯度下降来不断逼近最优解。梯度下降有随机梯度下降,批梯度下降,small batch 梯度下降三种方式,这三种方式的优劣以及如何选择最合适的梯度下降方式介绍如下。
(1)简单来说 批梯度下降会获得全局最优解,缺点是在更新每个参数的时候需要遍历所有的数据,计算量会很大,并且会有很多的冗余计算,导致的结果是当数据量大的时候,每个参数的更新都会很慢。
(2)随机梯度下降是以高方差频繁更新,优点是使得sgd会跳到新的和潜在更好的局部最优解,缺点是使得收敛到局部最优解的过程更加的复杂。
(3)小批量梯度下降结合了sgd和batch gd的优点,每次更新的时候使用n个样本。减少了参数更新的次数,可以达到更加稳定收敛结果,一般在深度学习当中我们采用这种方法。
- 逻辑回归的目的 (将数据二分类,提高准确率。)
- 逻辑回归如何分类(划定一个阈值,y值大于这个阈值的是一类,y值小于这个阈值的是另外一类。)
(2)逻辑回归的损失函数为什么要使用极大似然函数作为损失函数?
损失函数一般有四种,平方损失函数,对数损失函数,0-1损失函数,绝对值损失函数。将极大似然函数取对数以后等同于对数损失函数。在逻辑回归这个模型下,对数损失函数的训练求解参数的速度是比较快的,这个式子的更新速度只和,相关。和sigmod函数本身的梯度是无关的。这样更新的速度是可以自始至终都比较的稳定。如果你使用平方损失函数,你会发现梯度更新的速度和sigmod函数本身的梯度是很相关的。sigmod函数在它在定义域内的梯度都不大于0.25。这样训练会非常的慢。
(3)学习率的选择
- 第一个是如何对模型选择合适的学习率。
自始至终保持同样的学习率其实不太合适。因为一开始参数刚刚开始学习的时候,此时的参数和最优解隔的比较远,需要保持一个较大的学习率尽快逼近最优解。但是学习到后面的时候,参数和最优解已经隔的比较近了,所以学习率需要调整。
- 第二个是如何对参数选择合适的学习率。
在实践中,对每个参数都保持的同样的学习率也是很不合理的。有些参数更新频繁,那么学习率可以适当小一点。有些参数更新缓慢,那么学习率就应该大一点。
(4)逻辑回归优缺点
优点
- 形式简单,模型的可解释性非常好。从特征的权重可以看到不同的特征对最后结果的影响,某个特征的权重值比较高,那么这个特征最后对结果的影响会比较大。
- 模型效果不错,训练速度较快。
- 资源占用小,尤其是内存,因为只需要存储各个维度的特征值。
- 方便输出结果调整。逻辑回归可以很方便的得到最后的分类结果,因为输出的是每个样本的概率分数,我们可以很容易的对这些概率分数进行筛选,也就是划分阈值。
缺点
- 很难处理数据不平衡的问题。
- 处理非线性数据较麻烦。逻辑回归在不引入其他方法的情况下,只能处理线性可分的数据,或者进一步说,处理二分类的问题 。
- 逻辑回归本身无法筛选特征。只能看出特征权重,有时候,我们会用gbdt来筛选特征,然后再使用逻辑回归。