ML入门-Logistic回归简介
ML入门-Logistic回归简介
1. Logistic回归简介
回归任务和分类任务都属于有监督学习(Supervised Learning),其训练数据的格式为:
典型的分类任务有:垃圾邮件过滤、手写数字/文本识别、语音识别、人脸识别、医疗诊断、金融风控等。
贝努力(Bernoulli)分布:
以两类分类为例。两类分类任务中,假设样本的输出为
其中期望
1.1 Sigmoid函数
当选择最简单的线性模型来表示期望
Sigmoid 函数表达式为:
Sigmoid 函数亦被称为 Logistic 函数或 Logit 函数,Logistic 回归亦被称为 Logit 回归。
LogisticRegression 虽然名字上用了“回归”,但实际上是分类算法。
使用 Sigmoid 函数对
定义一个事件的几率(Odd,与概率 Probability 不是一个概念)为该事件发生的概率与不发生的概率的比值:
两边同取
当
① 当
② 当
③ 当
令决策函数
1.2 决策边界
更一般地:根据需要划分的类别,分类器将输入控件
当决策面是输入
分类器为每个类别分配一个判别函数,根据判别函数来判断一个新样本属于该类别的可能性,然后将新样本归类为可能性最大的一类。假设有 C 个类别,则对应有 C 个判别函数:
对一个新样本
判别函数
例如两类分类问题中,决策函数
2. Logistic损失函数
2.1 负log似然损失
以两类分类问题为例,直观地,可以定义一种损失:0 / 1 损失,预测类别正确时预测损失为 0,否则为 1。记为:
但 0 / 1 损失不连续,优化计算不方便。因此需要寻找其他 替代损失函数(Surrogate Loss Function)。替代损失函数应当符合几个特征:
- 通常是凸函数,计算方便。
- 与 0 / 1 损失函数具有等效性。
下图列举了几种不同的损失函数:
图中横轴为
定义两类分类中,真值
可以看出,浅蓝色曲线 L2 损失并不能很好地代替 0 / 1 损失,因此优化 L2 损失并不能很好地优化模型的准确度。
整理 Logistic 回归模型:
其中,
Logistic 的似然函数为:
取极大似然估计 :
因此极大似然估计等价于最小训练集上的负
2.2 交叉熵损失
Logistic 损失亦被称为 交叉熵损失(Corss Entropy Loss, CE)。
交叉熵损失:两个分布之间的差异(已知真实分布的情况下,预测分布与真实分布之间的差异)。定义交叉熵
假设预测值
(1)假设已知真值
(2)同理,假设已知真值
整理合并得:
定义
则可得到交叉熵损失简洁表达式:
交叉熵损失与
对
的理解:根据 的表达式,当真实值 时, 。由于 表示的是预测值 的概率,因此 即表示预测分布接近真实分布的概率。因此 越大,表示预测越准确,同时对应的交叉熵损失 也就越小,与图中曲线含义相同。
3. Logistic正则项
Logistic 回归采用 Logistic 损失 / 交叉熵损失,由于预测值
Logistic 回归的目标函数同样包括训练集上的损失和与正则项,正则项同样可选 L1 正则、L2 正则、或 L1 + L2 正则。
假设有一个两类分类任务,且训练样本完全可分(即所有同类样本均可被分对),为了使 Logistic 损失和最小(完全可分时最小损失和即为 0),则对每个样本有:
① 对于每个真实值
的样本,其预测值 的概率为 1(必定预测分类为 1),也即 。 ② 而对于每个真实值
的样本,其预测值 的概率为 0(不可能预测分类为 1),也即 。
由于
当
因此 Logistic 回归必须加正则!
Scikit-Learn 中实现的 Logistic 回归
LogisticRegression
默认为 L2 正则。
与 SVM 类似的是,Logistic 回归的超参数
4. Scikit-Learn中的Logistic
Scikit-Learn 中实现了 3 种 Logistic 回归:
LogisticRegression
: 最原始的 Logistic 回归模型,超参数调优时需要手动搭配GridSearchCV
使用。LogisticRegressionCV
: Scikit-Learn 提供的已集成了交叉验证的 Logistic 回归模型,可以直接使用内置的交叉验证对超参数调优。SGDClassifier
: 随机梯度下降分类,则是在样本数很大(样本数 ,特征数 )时效果更好。
4.1 LogitsicRegression
1 | # class sklearn.linear_model.LogisticRegression |
4.1.1 LogitsicRegression的参数
penalty
: 惩罚函数 / 正则函数,默认:'L2'。支持 L2 正则和 L1 正则。选择 L1 正则时优化器可选 'liblinear' 和 'saga'。
dual
: 是否是对偶问题求解,默认:False
。是原问题(primal)还是对偶问题(dual)求解。对偶问题只支持 L2 正则和 'liblinear' 优化器。
tol
: 迭代终止判据的误差范围,默认: 。C
: 交叉熵损失函数系数,默认:1。fit_intercept
: 是否在决策函数中加入截距项。默认:True
。如果数据已经中心化,则不需要拟合截距项。
intercept_scaling
: 截距缩放因子。当
fit_intercept
为True
且优化器solver
设置为liblinear
时有效。输入为[X, self.intercept_scaling]
,即对输入特征插入 1 维常数项。由于增加的常数项系数也受到 L1 / L2 正则的惩罚,因此要适当增大常数项。class_weight
: 不同类别样本的权重。默认:None
。可指定每类样本权重,或设置为 'balanced',则每类样本权重与该类别样本数比例成反比。
random_state
: 随机种子,默认:None
。solver
: 优化求解算法,默认:'liblinear'。可选:'newton-cg','lbfgs','liblinear','sag','saga'。
- L1 正则优化器仅可选 'liblinear' 和 'saga',L2 正则可使用所有优化器。
max_iter
: 最大迭代次数,默认:100。仅当
solver
设置为 'newton-cg','sag',或 'lbfgs' 时有效。multi_class
: 多类分类处理策略,默认:'ovr'。可选:'ovr','multinomial'。
'ovr':One-Versus-Rest,一对多。将 C 类分类问题转化为 C 个两类分类问题,每一次分类当前类别样本为正样本,其余样本视为负样本。
'multinomial':即 softmax 分类器。使用 'multinomial' 时,优化器仅可选 'newton-cg','lbfgs','sag'。
OVO:One-Versus-One,一对一。
OVR 相对简单但分类效果相对略差。MVM 分类相对精确,但分类速度比 OVR 慢。
verbose
: 是否详细输出。warm_start
: 是否热启动,默认:False
。solver
设置为 'liblinear' 时无效。
n_jobs
: 多线程控制,默认:-1.取 -1 时算法自动检测可用 CPU 核,并使用全部核。
4.1.2 LogitsicRegression的属性
coef
: 回归系数 / 权重。与特征的维数相同。如果是多任务回归,标签
为 m 维数组,则回归系数也为 m 维数组。intercept_
: 截距项。n_iter_
: 每个类的迭代此时。
4.1.3 LogitsicRegression的方法
fit(X, y[, sample_weight])
: 模型训练。参数 X,y 为训练数据,也可以通过
sample_weight
设置每个样本的权重。predict(X)
: 返回 X 对应的预测值(类别标签)。predict_log_proba(X)
: 返回 X 对应的预测值(每个类别对应的概率的 值)。predict_proba(X)
: 返回 X 对应的预测值(每个类别对应的概率)。score(X, y[, sample_weight])
: 评估模型预测性能,返回模型预测的正确率。decision_function(X)
: 预测的置信度(样本到分类超平面的带符号距离)。在分对的情况下,正样本得到的应为正值,负样本得到的应为负值。
densify()
: 如果之前将系数矩阵变成了稀疏模式,再将其变回稠密模式(fit
函数要求系数矩阵为稠密模式)。sparsify()
: 将系数矩阵变成了稀疏模式。
4.2 LogisticRegressionCV
1 | # class sklearn.linear_model.LogisticRegressionCV |
4.2.1 LogisticRegressionCV的参数
Cs
: 超参数调优范围。在区间
的 域均匀取 Cs 个值作为正则参数 C 的搜索空间。cv
: 交叉校验划分策略。solver
: 与LogisticRegression
相同,但默认为 'lbfgs'。multi_class
: 对多类分类问题,采用的是 'ovr' 的方式,用交叉验证得到每个类的最佳正则参数。其余参数与
LogisticRegression
相同。
4.2.2 LogisticRegressionCV的属性
与 LogisticRegression
相同。
4.2.3 LogisticRegressionCV的方法
与 LogisticRegression
相同。
4.3 SGDClassifier
1 | # class sklearn.linear_model.SGDClassifier |
4.3.1 SGDClassifier的参数
lose
: 损失函数。可选:'hinge'(合页损失,SVM 中常用),'log'(负
似然损失,即 Logistic 回归使用的损失),'modified_huber'(对噪声不损失),'squared_hinge','perceptron',还有回归中使用的损失函数:'squared_loss','huber','epsilon_insensitive','squared_epsilon_insensitive'。使用回归的方式也可以实现分类。在分类中,
表示样本输入 取某个类别的概率,当使用回归的方式进行分类时, 为一具体数值,可通过数值判断分类。例如二分类任务中,对 ,分为类别 1,对 ,分为类别 0。epsilon
: 额外参数项。某些损失函数(huber、epsilon_insensitive、squared_epsilon_insensitive)所需要的额外参数。
penalty
: 正则项。可选:'none','l2','l1','elasticnet'(弹性网络,L1 + L2)。
alpha
: 正则惩罚系数。对应为目标函数中的
,也用于学习率的计算。l1_ratio
: L1 正则比例。仅当正则项为 'elasticnet' 时有效,用于控制 L1 正则所占比例。
优化相关参数如下:
max_iter
: 最大迭代次数(访问所有训练数据的次数 / epoches 次数),默认:5。SGD 在接近
的训练样本时收敛,因此可将max_iter
设置为np.ceil(10^6 / N)
( ),其中 N 为训练集样本数。tol
: 迭代停止条件。若非
None
,则当 (loss > previous_loss - tol) 时迭代终止。learning_rate
: 学习率。对应为迭代优化算法中的
。可选:'constant','optimal','invscaling'。
- 'constant':eta = eta0
- 'optimal':eta = 1.0 / (alpha * (t + t0))
- 'invscaling':eta = eta0 / pow(t, power_t)
shuffle
: 每轮 SGD 之前是否洗牌。默认为
True
。warm_start
: 是否热启动。随机梯度下降中初始值可以是之前的训练结果,支持在线学习。初始值可在
fit()
函数中作为参数传递。average
: 是否采用平均随机梯度下降法(随机梯度下降法的改进)ASGD。其他参数与
LogisticRegression
相同。
关于“随机梯度下降实现”的参考文献:
- "Stochastic Gradient Descent" L. Bottou - Website, 2010
- "The Tradeoffs of Large Scale Machine Learning" L. Bottou - Website, 2011