逻辑回归及梯度下降法

1 逻辑回归

1.1 原理过程

逻辑回归是一种二分类方法。

  • 找到预测函数,一般表示为h函数,用来预测输入数据的判断结果:
    分类边界为线性边界时,预测函数为
    在这里插入图片描述
    h θ ( x ) h_θ(x) hθ(x)函数的值表示结果取1的概率。
  • 找到损失函数,记为J(θ)函数,表示所有训练数据预测值和实际类别的偏差:
    基于最大似然估计,得到损失函数
    在这里插入图片描述
    逻辑回归及梯度下降法_第1张图片
  • 找到J(θ)函数的最小值:
    根据梯度下降的公式,得到迭代公式
    在这里插入图片描述因为式中α为一常量,所以1/m一般省略,所以最终的θ更新过程为:
    在这里插入图片描述

2 梯度下降法

梯度下降法(gradient descent)是一种常用的一阶优化方法,是求解无约束优化问题最简单、最经典的方法之一。
求解目标函数J(θ)的最小值,梯度下降法公式:
在这里插入图片描述
梯度下降法包括批量梯度下降法和随机梯度下降法。批量梯度下降:每迭代一步,要用到训练集的所有样本。随机梯度下降:每迭代一步,用到训练集中的部分样本。

牛顿法是典型的二阶方法,其迭代轮数远小于梯度下降法,但其每轮迭代中涉及到海森矩阵的求逆,计算复杂度相当高。拟牛顿法是以较低的计算代价寻找海森矩阵的近似逆矩阵。
牛顿法迭代公式:
逻辑回归及梯度下降法_第2张图片
H k H_k Hk是海森矩阵(二阶导数矩阵), g k g_k gk是一阶导数。

3 更新过程向量化

vectorization后θ更新的步骤如下:

(1)求A=x·θ;

(2)求E=g(A)-y;

(3)求θ:=θ-α.x’.E,x’表示矩阵x的转置。

4 逻辑回归的代码实现

# 加载库
import numpy as np
from sklearn import datasets

# 定义 sigmoid 函数
def sigmoid(x):
    return 1.0 / (1.0 + np.exp(-x))

# 定义梯度下降的过程
def gradDescent(dataMatIn,classLabels):
    dataMatrix = np.mat(dataMatIn)
    labelMat = np.mat(classLabels).transpose()
    m = dataMatrix.shape[0]
    n = dataMatrix.shape[1]
    alpha = 0.001
    maxCycles = 500
    weights = np.ones((n,1))   # 参数初始化
    for k in range(maxCycles):
        h = sigmoid(dataMatrix * weights)
        error = h -labelMat
        weights -= alpha * dataMatrix.transpose() * error
    return weights

#加载数据
irisData = datasets.load_iris()  
data = irisData.data  # 数据的样本及特征,n维数组
labels = irisData.target  # 数据的标签,1维数组

# 得到迭代完成的模型参数
gradDescent(data,labels)

模型结果:
array([[ 40.55002842],
[-10.34998117],
[103.2500085 ],
[ 45.50000138]])

5 sklearn中逻辑回归的参数介绍

5.1 LogisticRegression 函数的参数

penalty 正则化选择 可选“l1”和“l2”,默认“l2”。l1 正则化时,solver 只能选择 liblinear。
dual 用来指明是否将原问题改成他的对偶问题,默认是False。只适用于libnear的L2正则化。样本数量大于特征数量时选False。
tol 残差收敛条件,默认是0.0001,只需要收敛的时候两步只差<0.0001就停止。
C 正则化系数的倒数,c越小,表示正则化强度越大。默认1.0
fit_intercept 是否将截距加入到决策模型中,默认为True
intercept_scaling 默认为1。只有当 solver 是 liblinear 且 fit_intercept 为 true 时才有用,即在矩阵中添加一列1。
class_weight 类型权重 用于标示分类模型中各种类型的权重,默认是None,即不考虑权重,或者说所有类型的权重一样。可以选择balanced让类库自己计算类型权重,或者自己输入各个类型的权重,比如对于0,1的二元模型,我们可以定义class_weight={0:0.9, 1:0.1},这样类型0的权重为90%,而类型1的权重为10%。如果选择balanced,那么类库会根据训练样本量来计算权重。某种类型样本量越多,则权重越低,样本量越少,则权重越高。那么class_weight有什么作用呢?在分类模型中,我们经常会遇到两类问题:第一种是误分类的代价很高。第二种是样本高度失衡。
random_state 随机种子的设置,默认是None。如果设置了随机种子,那么每次使用的训练集和测试集都是一样的,这样不管你运行多少次,最后的准确率都是一样的;如果没有设置,那么每次都是不同的训练集和测试集,最后得出的准确率也是不一样的。只有当solver选择‘sag’ 或者是‘liblinear’时使用。
solver 优化算法选择 默认是 ** lbfgs**。 a) liblinear:适用于小数据集+L1,内部使用了坐标轴下降法来迭代优化损失函数。b) lbfgsL2,拟牛顿法的一种,利用损失函数二阶导数矩阵即海森矩阵来迭代优化损失函数。c) newton-cgL2,牛顿法家族的一种,利用损失函数二阶导数矩阵即海森矩阵来迭代优化损失函数。d) sagL2,即随机平均梯度下降,是梯度下降法的变种,和普通梯度下降法的区别是每次迭代仅仅用一部分的样本来计算梯度,适合于大数据集。e) saga:‘multinomial’ + L1,适用于大数据集。 liblinear只支持OvR,不支持MvM。‘sag’和**‘saga’要求数据有相同的量纲**。
max_iter 算法收敛的最大迭代次数默认是100。仅适用于solver选择newton-cg,sag和lbfgs
multi_class 分类参数选择 可选ovrmultinomialauto,默认是 auto。ovr即one-vs-rest(OvR),而multinomial即many-vs-many(MvM)。区别主要在多元逻辑回归上。OvR:对于第K类的分类决策,我们把所有第K类的样本作为正例,除了第K类样本以外的所有样本都作为负例,然后在上面做二分类,得到第K类的分类模型。其他类的分类模型获得以此类推。而MvM则相对复杂,举MvM的特例one-vs-one(OvO)作讲解。如果模型有T类,我们每次在所有的T类样本里面选择两类样本出来,不妨记为T1类和T2类,把所有的输出为T1和T2的样本放在一起,把T1作为正例,T2作为负例,进行二分类,得到模型参数。我们一共需要T(T-1)/2次分类。OvR相对简单,但分类效果相对略差(这里指大多数样本分布情况,某些样本分布下OvR可能更好)。而MvM分类相对精确,但是分类速度没有OvR快。auto:当数据是二分类或者优化算法是liblinear时选择ovr,其他情况选择multinomial。
verbose “冗余”,会输出一些模型运算过程中的东西(任务进程)。整数型,默认值为0,适用于solver选择liblinearlbfgs时,将verbose设置为任何正数以表示冗长度。
warm_start 是否使用上次的模型结果作为初始化,默认是False,表示不使用。
n_jobs 并行运算数量(核的数量),默认为1,如果设置为-1,则表示将电脑的cpu全部用上。

在 fit 函数中可以使用sample_weight,来自己调节每个样本权重。

# 调用
from sklearn.linear_model import LogisticRegression
clf = LogisticRegression()
model = clf.fit(data,labels)

模型对象:

coef_:返回各特征的系数,绝对值大小可以理解成特征重要性
intercept_:返回模型的截距
n_iter_:模型迭代次数
classes_:类别标签列表

模型方法:

predict_proba(X):返回每个类别的概率值(有几类就返回几列值)
predict_log_proba(X):返回概率值的log值(即将概率取对数)
predict(X):返回预测结果值(0/1)
score(X, y=None):返回函数
get_params(deep=True):返回估计器的参数
set_params(**params):为估计器设置参数

5.2 LogisticRegressionCV 的参数

Cs 正则项系数的倒数组成的浮点数列表或者一个整数
cv 交叉验证。默认5
scoring 模型评估标准,默认是 accuracy

你可能感兴趣的:(机器学习,逻辑回归与梯度下降,python实现逻辑回归,原理介绍,参数解释)