Logistic Regression 逻辑回归
逻辑回归模型
二项的逻辑回归模型是由如下条件概率分布组成:
P ( Y = 1 ∣ X ) = e x p ( w ⋅ x ) 1 + e x p ( w ⋅ x ) P ( Y = 0 ∣ X ) = 1 1 + e x p ( w ⋅ x ) P(Y=1|X)=\frac{exp{(w \cdot x)}}{1+exp{(w \cdot x)}} \\ P(Y=0|X)=\frac{1}{1+exp{(w \cdot x)}} P(Y=1∣X)=1+exp(w⋅x)exp(w⋅x)P(Y=0∣X)=1+exp(w⋅x)1
其中 x x x是输入, Y Y Y是输出, w w w是需要学习的参数。
用极大似然估计来学习参数
于给定的训练数据集 T = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , ⋯ , ( x N , y N ) } T= \left \{(x_1, y_1), (x_2, y_2), \cdots, (x_N, y_N) \right \} T={(x1,y1),(x2,y2),⋯,(xN,yN)},其中, x i ∈ R n , y i ∈ { 0 , 1 } x_i\in R_n, y_i \in \left \{ 0, 1 \right \} xi∈Rn,yi∈{0,1},用极大似然估计来估计模型参数从而得到逻辑回归模型。设 P ( Y = 1 ∣ X ) = e x p ( w ⋅ x ) 1 + e x p ( w ⋅ x ) = π ( x ) , P ( Y = 0 ∣ X ) = 1 1 + e x p ( w ⋅ x ) = 1 − π ( x ) P(Y=1|X)=\frac{exp{(w \cdot x)}}{1+exp{(w \cdot x)}}=\pi(x), P(Y=0|X)=\frac{1}{1+exp{(w \cdot x)}}=1-\pi (x) P(Y=1∣X)=1+exp(w⋅x)exp(w⋅x)=π(x),P(Y=0∣X)=1+exp(w⋅x)1=1−π(x)。则可以得到似然函数 ∏ i = 1 N [ π ( x i ) ] y i [ 1 − π ( x i ) ] 1 − y i \prod^N_{i=1}[\pi (x_i)]^{y_i}[1-\pi (x_i)]^{1-y_i} ∏i=1N[π(xi)]yi[1−π(xi)]1−yi, 对数似然为
L ( w ) = ∑ i = 1 N [ y i log π ( x i ) + ( 1 − y i ) log ( 1 − π ( x i ) ) ] = ∑ i = 1 N [ y i log π ( x i ) 1 − π ( x i ) + log ( 1 − π ( x i ) ) ] = ∑ i = 1 N [ y i ( w ⋅ x i ) − log ( 1 + e x p ( w ⋅ x i ) ) ] \begin{aligned} L(w)&=\sum_{i=1}^{N}[y_i\log \pi (x_i)+(1-y_i)\log (1-\pi (x_i))] \\ &=\sum_{i=1}^N[y_i\log \frac{\pi (x_i)}{1-\pi (x_i)}+\log (1-\pi (x_i))] \\ &=\sum_{i=1}^N[y_i (w \cdot x_i)-\log(1 + exp{(w \cdot x_i)})] \end{aligned} L(w)=i=1∑N[yilogπ(xi)+(1−yi)log(1−π(xi))]=i=1∑N[yilog1−π(xi)π(xi)+log(1−π(xi))]=i=1∑N[yi(w⋅xi)−log(1+exp(w⋅xi))]
对 L ( w ) L(w) L(w)求极大值即可得到 w w w,可以使用的方法有很多,比如坐标上升法,梯度上升法,共轭牛顿法。不在赘述。
其中有一个重要概念叫几率(odd)是指该事件发生的概率和不发生概率的比值,若事件发生的概率是p,不发生的概率是1-p,那么该事件的对数几率为 l o g i t ( p ) = log p 1 − p logit(p)=\log \frac{p}{1-p} logit(p)=log1−pp,对应逻辑回归的几率就是 log P ( Y = 1 ∣ X ) 1 − P ( Y = 1 ∣ X ) = w ⋅ x \log \frac{P(Y=1|X)}{1-P(Y=1|X)}=w\cdot x log1−P(Y=1∣X)P(Y=1∣X)=w⋅x,在一些损失函数中logit的概念经常出现。
sklearn中的逻辑回归
sklearn中有三个类LogisticRegression, LogisticRegressionCV 和logistic_regression_path,LogisticRegressionCV相比于LogisticRegression的主要区别在于CV使用了交叉验证来选择正则化系数C,logistic_regression_path类则比较特殊,它拟合数据后,不能直接来做预测,只能为拟合数据选择合适逻辑回归的系数和正则化系数。主要是用在模型选择的时候。一般情况用不到这个类。
其中sklearn文档中的目标函数和上式有点出入,我也不太明白,望大家指点一二
class 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='lbfgs', max_iter=100, multi_class='auto', verbose=0, warm_start=False, n_jobs=None, l1_ratio=None)
解释一下各个参数的含义:
penalty:字符串型,可选择的有 l 1 , l 2 l1, l2 l1,l2正则和elastic正则,默认:” l 2 l2 l2“;正则化类型,elastic正则是综合了l1正则和l2正则。‘newton-cg’,'sag’和’lbfgs’解算器仅支持l2处罚。
在调参时如果我们主要的目的只是为了解决过拟合,一般penalty选择L2正则化就够了。但是如果选择L2正则化发现还是过拟合,即预测效果差的时候,就可以考虑L1正则化。另外,如果模型的特征非常多,我们希望一些不重要的特征系数归零,从而让模型系数稀疏化的话,也可以使用L1正则化。
penalty参数的选择会影响我们损失函数优化算法的选择。即参数solver的选择,如果是L2正则化,那么4种可选的算法{‘newton-cg’, ‘lbfgs’, ‘liblinear’, ‘sag’}都可以选择。但是如果penalty是L1正则化的话,就只能选择‘liblinear’了。这是因为L1正则化的损失函数不是连续可导的,而{‘newton-cg’, ‘lbfgs’,‘sag’}这三种优化算法时都需要损失函数的一阶或者二阶连续导数。而‘liblinear’并没有这个依赖。
dual:布尔型,默认:False。对偶或原始形式,只用于解决用liblinear解决l2正则化的模型,当样本数大于特征数时,通常设置为False。
tol:浮点型,默认:1e-4;迭代终止判断的误差范围。
C:浮点型,默认:1.0;其值等于正则化强度的倒数,为正的浮点数。数值越小表示正则化越强(在sklearn公式中是 1 C \frac{1}{C} C1)。
fit_intercept:布尔型,默认:True;指定是否应该向决策函数添加常量(即偏差或截距)。不用管
intercept_scaling:浮点型,默认为1;仅在使用solver为“liblinear”且fit_intercept=True时有用。 在这种情况下,x变为[x,intercept_scaling],即具有等于intercept_scaling的常数值的“合成”特征被附加到实例矢量。 截距变成了intercept_scaling * synthetic_feature_weight.
注意: 合成特征权重与所有其他特征一样经受l1 / l2正则化。 为了减小正则化对合成特征权重(并因此对截距)的影响,必须增加intercept_scaling。相当于人造一个特征出来,该特征恒为 1,其权重为b。具体有什么用,暂时不懂。
class_weight:dict or ‘balanced’,default:None;class_weight参数用于标示分类模型中各种类型的权重,可以不输入,即不考虑权重,或者说所有类型的权重一样。如果选择输入的话,可以选择balanced让类库自己计算类型权重,或者我们自己输入各个类型的权重,比如对于0,1的二元模型,我们可以定义class_weight={0:0.9, 1:0.1},这样类型0的权重为90%,而类型1的权重为10%。
如果class_weight选择balanced,那么类库会根据训练样本量来计算权重。某种类型样本量越多,则权重越低,样本量越少,则权重越高。当class_weight为balanced时,类权重计算方法如下:n_samples / (n_classes * np.bincount(y))
random_state:随机数种子。
solver:‘newton-cg’,‘lbfgs’,‘liblinear’,‘sag’,‘saga’,default:liblinear
liblinear:使用了开源的liblinear库实现,内部使用了坐标轴下降法来迭代优化损失函数。
lbfgs:拟牛顿法的一种,利用损失函数二阶导数矩阵即海森矩阵来迭代优化损失函数。
newton-cg:共轭牛顿法,牛顿法家族的一种,利用损失函数二阶导数矩阵即海森矩阵来迭代优化损失函数。
sag:即随机平均梯度下降,是梯度下降法的变种,和普通梯度下降法的区别是每次迭代仅仅用一部分的样本来计算梯度,适合于样本数据多的时候。saga(STOCHASTIC VARIANCE REDUCTION METHODS):线性收敛的随机优化算法。
对于小型数据集,‘liblinear’是一个不错的选择,而’sag’和’saga’对于大型的更快。对于多类问题,只有’newton-cg’,‘sag’,'saga’和’lbfgs’处理多项损失;'liblinear’仅限于一项损失。 ‘newton-cg’,'lbfgs’和’sag’只处理L2惩罚,而’liblinear’和’saga’处理L1惩罚。“sag”和“saga”快速收敛仅在具有大致相同比例的要素上得到保证, 可以使用sklearn.preprocessing中的缩放器预处理数据。
max_iter:最大迭代次数,整型,默认是100。
multi_class:字符串型,{ovr’, ‘multinomial’,“auto”},默认:‘ovr’;ovr即one-vs-rest(OvR),而multinomial即many-vs-many(MvM)。如果选择的选项是“ovr”,那么一个二进制问题适合于每个标签,否则损失最小化就是整个概率分布的多项式损失。multinomial对liblinear solver无效。
verbose:整型,默认为0;对于liblinear和lbfgs求解器,将verbose设置为任何正数以表示详细程度。用于开启/关闭迭代中间输出的日志。
warm_state:布尔型,默认为False;如果为True,那么使用前一次训练结果继续训练,否则从头开始训练。对liblinear解码器无效。关于warm_state,这篇博客讲的很详细。
n_jobs:如果multi_class =‘ovr’,则在对类进行并行化时使用的CPU数量。 无论是否指定’multi_class’,当solver
设置为’liblinear’时,都会忽略此参数。 如果给定值-1,则使用所有CPU。
l1_ratio:浮点型,默认为None;弹性网参数,即上面图片中的 ρ \rho ρ。
属性(attributes):
classes_ : array,shape:(n_classes,),分类器已知的类标签列表。
coef_:shape为(1,n_features)或(n_classes, n_features)的数组,决策函数中的特征系数。当给定的问题是二分类问题。特别地,当multi_class ='multinomial’时,coef_对应于结果1(True)并且-coef_对应于结果0(False)。
intercept_:ndarray of shape (1,) or (n_classes,),决策函数中的截距,如果fit_intercept设置为False,则截距设置为零。 当给定问题是二进制时,intercept_具有形状(1,)。特别是,当multi_class ='multinomial’时,intercept_ 对应于结果1(True),- intercept_对应于结果0(False)。
n_features_in_:整型。参与拟合的特证数。
feature_names_in_:ndarray of shape (n_features_in_, ),顾名思义。
n_iter_ :ndarray of shape (n_classes,) or (1, )
所有类的实际迭代次数。如果是二分类或multinomial,则只返回1个元素。对于liblinear解算器,仅给出了所有类的最大迭代次数。
关于神经网络训练中的提前终止
下面记录一些我训练神经网络遇到的一些小问题。Keras中的model.compile和model.fit
Model.compile(
optimizer="rmsprop",
loss=None,
metrics=None,
loss_weights=None,
weighted_metrics=None,
run_eagerly=None,
steps_per_execution=None,
**kwargs
)
example:
model.compile(optimizer=tf.keras.optimizer.Adam(learning_rate=1e-3),
loss=tf.keras.losses.BinaryCrossentropy(),
metrics=[tf.keras.metrics.BinaryAccuracy(),
tf.keras.metrics.FalseNegatives()])
optimizer:优化器,用于控制梯度裁剪。必选项,关于优化器的选择可以看这个链接
loss:损失函数(或称目标函数、优化评分函数)。必选项
metrics:评价函数用于评估当前训练模型的性能。当模型编译后(compile),评价函数应该作为 metrics 的参数来输入。评价函数和损失函数相似,只不过评价函数的结果不会用于训练过程中。
在使用过程中常用的就是这三个参数。
keras中有提前终止功能EarlyStopping
keras.callbacks.EarlyStopping(monitor='val_loss', min_delta=0, patience=0, verbose=0, mode='auto', baseline=None, restore_best_weights=False)