1
逻辑回归与线性回归的联系与区别
**联系:**逻辑回归和线性回归同属于广义线性模型,逻辑回归就是用线性回归模型的预测值去拟合真实标签的的对数几率(一个事件的几率(odds)是指该事件发生的概率与不发生的概率之比,如果该事件发生的概率是P,那么该事件的几率是 ,对数几率就是
)。
**区别:**逻辑回归和线性回归本质上都是得到一条直线,不同的是,线性回归的直线是尽可能去拟合输入变量X的分布,使得训练集中所有样本点到直线的距离最短;而逻辑回归的直线是尽可能去拟合决策边界,使得训练集样本中的样本点尽可能分离开。因此,两者的目的是不同的。
2
逻辑回归的原理
线性回归方程:
此处,y为因变量,x为自变量。在机器学习中y是标签,x是特征。
Sigmoid函数公式:
通过将线性模型和Sigmoid函数结合,我们可以得到逻辑回归的公式:
对式子进行变换,可得:
3
逻辑回归损失函数推导及优化
损失函数就是衡量真实值和预测值之间差距的函数。所以,损失函数越小,模型就越好。在这里,最小损失是0:
我们把这两个损失函数综合起来:
对于m个样本,总的损失函数为:
这个式子中,m是样本数,y是标签,取值0或1,i表示第i个样本,p(x)表示预测的输出。
4
正则化与模型评估指标
正则化: 当损失过于小的时候,也就是模型能够拟合绝大部分的数据,这时候就容易出现过拟合。为了防止过拟合,我们会引入正则化。
L1 正则化: Lasso 回归,相当于为模型添加了这样一个先验知识,即 服从零均值拉普拉斯分布:
其中μ,b为常数,且μ>0。
下面证明这一点,由于引入了先验知识,所以似然函数这样写:
取log再取负,得到目标函数:
等价于原始的cross−entropy后面加上了L1正则,因此L1正则的本质其实是为模型增加了“模型参数服从零均值拉普拉斯分布”这一先验知识。
L2 正则化: 相当于为模型添加了这样一个先验知识: 服从零均值正态分布。
正态分布公式:
、
由于引入了先验知识,所以似然函数这样写:
取log再取负,得到目标函数:
等价于原始的cross−entropy后面加上了L2正则,因此L2正则的本质其实是为模型增加了“模型参数服从零均值正态分布”这一先验知识。
5
优点: 1)适合需要得到一个分类概率的场景。2)计算代价不高,容易理解实现。LR在时间和内存需求上相当高效。它可以应用于分布式数据,并且还有在线算法实现,用较少的资源处理大型数据。3)LR对于数据中小噪声的鲁棒性很好,并且不会受到轻微的多重共线性的特别影响。(严重的多重共线性则可以使用逻辑回归结合L2正则化来解决,但是若要得到一个简约模型,L2正则化并不是最好的选择,因为它建立的模型涵盖了全部的特征。)
缺点: 1)容易欠拟合,分类精度不高。2)数据特征有缺失或者特征空间很大时表现效果并不好。
6
**类别数据不均衡:**是分类任务中一个典型的存在的问题。简而言之,即数据集中,每个类别下的样本数目相差很大。例如,在一个二分类问题中,共有100个样本(100行数据,每一行数据为一个样本的表征),其中80个样本属于class 1,其余的20个样本属于class 2,class 1:class2=80:20=4:1,这便属于类别不均衡。当然,类别不均衡同样会发生在多分类任务中。
1、重新采样训练集
可以使用不同的数据集。有两种方法使不平衡的数据集来建立一个平衡的数据集——欠采样和过采样。
1.1. 欠采样
欠采样是通过减少丰富类的大小来平衡数据集,当数据量足够时就该使用此方法。通过保存所有稀有类样本,并在丰富类别中随机选择与稀有类别样本相等数量的样本,可以检索平衡的新数据集以进一步建模。
1.2. 过采样
相反,当数据量不足时就应该使用过采样,它尝试通过增加稀有样本的数量来平衡数据集,而不是去除丰富类别的样本的数量。通过使用重复、自举或合成少数类过采样等方法(SMOTE)来生成新的稀有样品。
注意到欠采样和过采样这两种方法相比而言,都没有绝对的优势。这两种方法的应用取决于它适用的用例和数据集本身。另外将过采样和欠采样结合起来使用也是成功的。
2、使用K-fold交叉验证
值得注意的是,使用过采样方法来解决不平衡问题时应适当地应用交叉验证。这是因为过采样会观察到罕见的样本,并根据分布函数应用自举生成新的随机数据,如果在过采样之后应用交叉验证,那么我们所做的就是将我们的模型过拟合于一个特定的人工引导结果。这就是为什么在过度采样数据之前应该始终进行交叉验证,就像实现特征选择一样。只有重复采样数据可以将随机性引入到数据集中,以确保不会出现过拟合问题。
K-fold交叉验证就是把原始数据随机分成K个部分,在这K个部分中选择一个作为测试数据,剩余的K-1个作为训练数据。交叉验证的过程实际上是将实验重复做K次,每次实验都从K个部分中选择一个不同的部分作为测试数据,剩余的数据作为训练数据进行实验,最后把得到的K个实验结果平均。
3、转化为一分类问题
对于二分类问题,如果正负样本分布比例极不平衡,我们可以换一个完全不同的角度来看待问题:把它看做一分类(One Class Learning)或异常检测(Novelty Detection)问题。这类方法的重点不在于捕捉类间的差别,而是为其中一类进行建模,经典的工作包括One-class SVM等,如下图所示:
One Class SVM 是指你的训练数据只有一类正(或者负)样本的数据, 而没有另外的一类。在这时,你需要学习的实际上你训练数据的边界。而这时不能使用最大化软边缘了,因为你没有两类的数据。 所以呢,在这文章中,“Estimating the support of a high-dimensional distribution”, 假设最好的边缘要远离特征空间中的原点。左边是在原始空间中的边界,可以看到有很多的边界都符合要求,但是比较靠谱的是找一个比较紧的边界(红色的)。这个目标转换到特征空间就是找一个离原点比较远的边界,同样是红色的直线。当然这些约束条件都是人为加上去的,你可以按照你自己的需要采取相应的约束条件。比如让你data 的中心离原点最远。
说明:对于正负样本极不均匀的问题,使用异常检测,或者一分类问题,也是一个思路。
4、组合不同的重采样数据集
成功泛化模型的最简单方法是使用更多的数据,问题是像逻辑回归或随机森林这样开箱即用的分类器,倾向于通过舍去稀有类来泛化模型。一个简单的最佳实践是建立n个模型,每个模型使用稀有类别的所有样本和丰富类别的n个不同样本。假设想要合并10个模型,那么将保留例如1000例稀有类别,并随机抽取10000例丰富类别。然后,只需将10000个案例分成10块,并训练10个不同的模型。
如果拥有大量数据,这种方法是简单并且是可横向扩展的,这是因为可以在不同的集群节点上训练和运行模型。集合模型也趋于泛化,这使得该方法易于处理。
5、用不同比例重新采样
方法4 可以很好地将稀有类别和丰富类别之间的比例进行微调,最好的比例在很大程度上取决于所使用的数据和模型。但是,不是在整体中以相同的比例训练所有模型,所以值得尝试合并不同的比例。如果10个模型被训练,有一个模型比例为1:1(稀有:丰富)和另一个1:3甚至是2:1的模型都是有意义的。一个类别获得的权重依赖于使用的模型。
6、多模型Bagging
方法5 虽然能够选出最好的样本数据比例。但是它的鲁棒性不能够保证:它的鲁棒性取决于测试集样本的选取。
为了解决上述方法的缺陷,增加模型鲁棒性。为此,我本人在 随机森林算法 思想的启发下,想出了在上述方法的基础上,将不同比例下训练出来的模型进行 多模型Bagging 操作,具体的步骤如下:
- 对两类样本选取 N 组不同比例的数据进行训练并测试,得出模型预测的准确率:
P={ Pi | i=1,2,…N } - 对上述各模型的准确率进行归一化处理,得到新的权重分布:
Ω={ ωi | i=1,2,…N }
其中:
- 按权重分布 Ω 组合多个模型,作为最终的训练器:
● 对于分类任务:
● 对于回归任务:
7、集群丰富类
Sergey Quora提出了一种优雅的方法,他建议不要依赖随机样本来覆盖训练样本的种类,而是将r个群体中丰富类别进行聚类,其中r为r中的例数。每个组只保留集群中心(medoid)。然后,基于稀有类和仅保留的类别对该模型进行训练。
7.1. 对丰富类进行聚类操作
首先,我们可以对具有大量样本的丰富类进行聚类操作。假设我们使用的方法是 K-Means聚类算法 。此时,我们可以选择K值为稀有类中的数据样本的个数,并将聚类后的中心点以及相应的聚类中心当做富类样本的代表样例,类标与富类类标一致。
7.2. 聚类后的样本进行有监督学习
经过上述步骤的聚类操作,我们对富类训练样本进行了筛选,接下来我们就可以将相等样本数的K个正负样本进行有监督训练。如下图所示:
8、设计适用于不平衡数据集的模型
所有之前的方法都集中在数据上,并将模型保持为固定的组件。但事实上,如果设计的模型适用于不平衡数据,则不需要重新采样数据,著名的XGBoost已经是一个很好的起点,因此设计一个适用于不平衡数据集的模型也是很有意义的。
通过设计一个代价函数来惩罚稀有类别的错误分类而不是分类丰富类别,可以设计出许多自然泛化为稀有类别的模型。例如,调整SVM以惩罚稀有类别的错误分类。
7
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=’liblinear’, max_iter=100, multi_class=’ovr’, verbose=0,warm_start=False, n_jobs=1)
penalty :默认为l2
说明:LogisticRegression默认带了正则化项。penalty参数可选择的值为”l1”和”l2”.分别对应L1的正则化和L2的正则化,默认是L2的正则化。
dual:默认为false
说明:对偶或者原始方法。Dual只适用于正则化相为l2 liblinear的情况,通常样本数大于特征数的情况下,默认为False。
C:默认为1
说明:C为正则化系数λ的倒数,通常默认为1。
fit_intercept:默认为True
说明:是否存在截距,默认存在
intercept_scaling:default 1
说明:仅在正则化项为“liblinear”,且fit_intercept设置为True时有用。