您的位置:首页 > 其它

机器学习初级算法梳理二

2019-04-01 21:08 513 查看

机器学习初级算法梳理二

  • 三、逻辑回归损失函数推导及优化
  • 四、 正则化与模型评估指标
  • 五、逻辑回归的优缺点
  • 六、样本不均衡问题解决办法
  • 七. sklearn逻辑回归参数
  • 任务二:逻辑回归算法梳理

    一、逻辑回归与线性回归的联系与区别

    逻辑回归与线性回归都属于广义线性回归模型,其区别与联系从以下几个方面比较:

    1. 分类与回归:回归模型就是预测一个连续变量(如降水量,价格等)。在分类问题中,预测属于某类的概率,可以看成回归问题。这可以说是使用回归算法的分类方法。
    2. 输出:直接使用线性回归的输出作为概率是有问题的,因为其值有可能小于0或者大于1,这是不符合实际情况的,逻辑回归的输出正是[0,1]区间。见下图,
    1. 参数估计方法: [ol] 线性回归中使用的是最小化平方误差损失函数,对偏离真实值越远的数据惩罚越严重。这样做会有什么问题呢?假如使用线性回归对{0,1}二分类问题做预测,则一个真值为1的样本,其预测值为50,那么将会对其产生很大的惩罚,这也和实际情况不符合,更大的预测值说明为1的可能性越大,而不应该惩罚的越严重。
    2. 逻辑回归使用对数似然函数进行参数估计,使用交叉熵作为损失函数,对预测错误的惩罚是随着输出的增大,逐渐逼近一个常数,这就不存在上述问题了1
    3. 也正是因为使用的参数估计的方法不同,线性回归模型更容易受到异常值(outlier)的影响,有可能需要不断变换阈值(threshold),线性回归分类的情况见下面两图:
    [/ol]

    无异常值的线性回归情况:

    蓝线为求得的h(x),上图中可选阈值为0.5作为判断肿瘤是否是良性。

    有异常值的线性回归情况:

    这个时候再想有好的预测效果需调整阈值为0.2,才能准确预测。

    使用逻辑回归的方法进行分类,就明显对异常值有较好的稳定性。如下图:

    1. 参数解释: [ol] 线性回归中,独立变量的系数解释十分明了,就是保持其他变量不变时,改变单个变量因变量的改变量。
    2. 逻辑回归中,自变量系数的解释就要视情况而定了,要看选用的概率分布是什么,如二项式分布,泊松分布等
    [/ol]

    二、 逻辑回归的原理

    2.1 什么是逻辑回归

    逻辑回归就是这样的一个过程:面对一个回归或者分类问题,建立代价函数,然后通过优化方法迭代求解出最优的模型参数,然后测试验证我们这个求解的模型的好坏。

    Logistic回归虽然名字里带“回归”,但是它实际上是一种分类方法,主要用于两分类问题(即输出只有两种,分别代表两个类别)

    回归模型中,y是一个定性变量,比如y=0或1,logistic方法主要应用于研究某些事件发生的概率

    2.2 逻辑回归模型

    逻辑回归模型是一种分类模型,用条件概率分布的形式表示 P(Y∣X)P(Y|X)P(Y∣X),这里随机变量 X 取值为 n 维实数向量,例如x=(x(1),x(2),...,x(n))x=(x^{(1)},x^{(2)},...,x^{(n)})x=(x(1),x(2),...,x(n)),Y 取值为 0 或 1。即:
    P(Y=1∣x)=e−(w⋅x+b)1+e−(w⋅x+b)P(Y=1|x)=\frac{e^{-(w\cdot x+b)}}{1+e^{-(w\cdot x+b)}}P(Y=1∣x)=1+e−(w⋅x+b)e−(w⋅x+b)​
    P(Y=0∣x)=11+e−(w⋅x+b)P(Y=0|x)=\frac1{1+e^{-(w\cdot x+b)}}P(Y=0∣x)=1+e−(w⋅x+b)1​
    或:
    ϕ(x)=11+e−(wTx+b)\phi(x)=\frac{1}{1+e^{-(w^{T}x+b)}}ϕ(x)=1+e−(wTx+b)1​
    假设有一个二分类问题,输出为y∈{0,1}y\in{\{0,1\}}y∈{0,1},线性回归模型z=wTx+bz=w^{T}x+bz=wTx+b是个实数值,我们希望有一个理想的阶跃函数来帮我们事先z值到0/1的转换,于是选用Sigmord函数进行替代:
    g(z)=11+e−zg(z)=\frac{1}{1+e^{-z}}g(z)=1+e−z1​
    有了 Sigmoid 函数之后,由于其值取值范围在[0,1]。就可以将其视为类 1 的后验概率估计 p(y=1∣X)p(y=1|X)p(y=1∣X)。说白了,就是如果有了一个测试点 x,那么就可以用Sigmoid函数算出来的结果当作该点 x 属于类别 1 的概率大小。

    于是,非常自然地,我们把 Sigmoid 函数计算得到的值大于等于0.5的归为类别1,小于0.5的归为类别0。

    2.3. 逻辑回归和多重线性回归的区别

    Logistic回归与多重线性回归实际上有很多相同之处,最大的区别就在于它们的因变量不同,其他的基本都差不多。正是因为如此,这两种回归可以归于同一个家族,即广义线性模型(generalizedlinear model)。

    这一家族中的模型形式基本上都差不多,不同的就是因变量不同。这一家族中的模型形式基本上都差不多,不同的就是因变量不同。

    • 如果是连续的,就是多重线性回归
    • 如果是二项分布,就是Logistic回归
    • 如果是Poisson分布,就是Poisson回归
    • 如果是负二项分布,就是负二项回归

    2.4. 逻辑回归用途

    • 寻找危险因素:寻找某一疾病的危险因素等;
    • 预测:根据模型,预测在不同的自变量情况下,发生某病或某种情况的概率有多大;
    • 判别:实际上跟预测有些类似,也是根据模型,判断某人属于某病或属于某种情况的概率有多大,也就是看一下这个人有多大的可能性是属于某病。

    三、逻辑回归损失函数推导及优化

    3.1 求代价函数

    将y=0或1的概率结果综合起来:
    P(y∣x;θ)=(hθ(x))y(1−hθ(x))1−yP(y|x;\theta)=(h_{\theta}(x))^{y}(1-h_{\theta}(x))^{1-y}P(y∣x;θ)=(hθ​(x))y(1−hθ​(x))1−y
    取似然函数为:
    L(θ)=∏i=1mP(yi∣xi;θ)=∏i=1m(hθ(x))y(1−hθ(x))1−yL(\theta)=\prod_{i=1}^{m}P(y_i|x_i;\theta)=\prod_{i=1}^{m}(h_{\theta}(x))^{y}(1-h_{\theta}(x))^{1-y}L(θ)=i=1∏m​P(yi​∣xi​;θ)=i=1∏m​(hθ​(x))y(1−hθ​(x))1−y
    其对数似然函数为:
    L(θ)=logL(θ)=∑i=1m(yiloghθ(xi)+(1−yi)log(1−hθ(xi))L(\theta)=logL(\theta)=\sum_{i=1}^m(y_ilogh_\theta(x_i)+(1-y_i)log(1-h_\theta(x_i))L(θ)=logL(θ)=i=1∑m​(yi​loghθ​(xi​)+(1−yi​)log(1−hθ​(xi​))
    最大似然估计就是求使L(θ)L(θ)L(θ)取最大值时的θ,其实这里可以使用梯度上升法求解,求得的θ就是要求的最佳参数。
    损失函数J(θ)J(\theta)J(θ)取为下式:
    J(θ)=−1ml(θ)J(\theta)=-\frac{1}{m}l(\theta)J(θ)=−m1​l(θ)

    3.2 梯度下降法求最小值

    θ\thetaθ更新过程:

    θ更新过程可以写成:

    3.3 向量化

    向量化是使用矩阵计算来代替for循环,以简化计算过程,提高效率。
    向量化过程
    约定训练数据的矩阵形式如下,x的每一行为一条训练样本,而每一列为不同的特称取值:

    综上所述,向量化后θ更新的步骤如下:

    1. 求A=x⋅θA=x\cdot\thetaA=x⋅θ
    2. 求E=g(A)−yE=g(A)-yE=g(A)−y
    3. 求θ:=θ−αxTE\theta:=\theta-\alpha x^{T}Eθ:=θ−αxTE

    四、 正则化与模型评估指标

    4.1 过拟合问题

    对于线性回归或逻辑回归的损失函数构成的模型,可能会有些权重很大,有些权重很小,导致过拟合(就是过分拟合了训练数据),使得模型的复杂度提高,泛化能力较差(对未知数据的预测能力)。

    下面左图即为欠拟合,中图为合适的拟合,右图为过拟合。

    问题的主因

    过拟合问题往往源自过多的特征。

    解决方法

    1)减少特征数量(减少特征会失去一些信息,即使特征选的很好)

    • 可用人工选择要保留的特征;
    • 模型选择算法;

    2)正则化(特征较多时比较有效)

    • 保留所有特征,但减少θ的大小

    正则化方法

    正则化的思想是,前面的参数会使得函数变得很大,如果想要最小化整个函数的话,那么正则化部分的必须要小才能满足要求(可以将压缩到接近0)。一般正则化不对增加惩罚项,只对1到n,只是约定俗成的,就算对0惩罚也没有什么影响。一般我们不知道是哪个参数导致过拟合,所以我们惩罚所有的参数。那么,加了惩罚项的损失函数为(一逻辑回归为例):

    上述模型加的是L2正则化,当然也可以用L1正则化。

    经过正则化后,线性回归的代价函数变为:

    线性回归的梯度下降算法变为:

    而逻辑回归的代价函数变为:

    梯度下降算法变为:

    两种算法的h_\theta(x)是不一样的,虽然看上去形式一样。

    4.2 模型评估指标

    在使用机器学习算法过程中,针对不同的问题需要不用的模型评估标准,这里统一汇总。这里对分类问题进行阐述。

    1、混淆矩阵
    混淆矩阵是监督学习中的一种可视化工具,主要用于比较分类结果和实例的真实信息。矩阵中的每一行代表实例的预测类别,每一列代表实例的真实类别。

    真正(True Positive , TP):被模型预测为正的正样本。
    假正(False Positive , FP):被模型预测为正的负样本。
    假负(False Negative , FN):被模型预测为负的正样本。
    真负(True Negative , TN):被模型预测为负的负样本。

    真正率(True Positive Rate,TPR):TPR=TP/(TP+FN),即被预测为正的正样本数 /正样本实际数。
    假正率(False Positive Rate,FPR) :FPR=FP/(FP+TN),即被预测为正的负样本数 /负样本实际数。
    假负率(False Negative Rate,FNR) :FNR=FN/(TP+FN),即被预测为负的正样本数 /正样本实际数。
    真负率(True Negative Rate,TNR):TNR=TN/(TN+FP),即被预测为负的负样本数 /负样本实际数/2

    2、准确率(Accuracy)
    准确率是最常用的分类性能指标。
    Accuracy = (TP+TN)/(TP+FN+FP+TN)

    即正确预测的正反例数 /总数

    3、精确率(Precision)

    精确率容易和准确率被混为一谈。其实,精确率只是针对预测正确的正样本而不是所有预测正确的样本。表现为预测出是正的里面有多少真正是正的。可理解为查准率。
    Precision = TP/(TP+FP)

    即正确预测的正例数 /预测正例总数

    4、召回率(Recall)

    召回率表现出在实际正样本中,分类器能预测出多少。与真正率相等,可理解为查全率。
    Recall = TP/(TP+FN),即正确预测的正例数 /实际正例总数

    5、F1 score

    F值是精确率和召回率的调和值,更接近于两个数较小的那个,所以精确率和召回率接近时,F值最大。很多推荐系统的评测指标就是用F值的。
    2/F1 = 1/Precision + 1/Recall

    6、ROC曲线

    逻辑回归里面,对于正负例的界定,通常会设一个阈值,大于阈值的为正类,小于阈值为负类。如果我们减小这个阀值,更多的样本会被识别为正类,提高正类的识别率,但同时也会使得更多的负类被错误识别为正类。为了直观表示这一现象,引入ROC。根据分类结果计算得到ROC空间中相应的点,连接这些点就形成ROC curve,横坐标为False Positive Rate(FPR假正率),纵坐标为True Positive Rate(TPR真正率)。一般情况下,这个曲线都应该处于(0,0)和(1,1)连线的上方,如图:

    ROC曲线中的四个点和一条线:
    点(0,1):即FPR=0, TPR=1,意味着FN=0且FP=0,将所有的样本都正确分类。
    点(1,0):即FPR=1,TPR=0,最差分类器,避开了所有正确答案。
    点(0,0):即FPR=TPR=0,FP=TP=0,分类器把每个实例都预测为负类。
    点(1,1):分类器把每个实例都预测为正类。
    总之:ROC曲线越接近左上角,该分类器的性能越好。而且一般来说,如果ROC是光滑的,那么基本可以判断没有太大的overfitting

    7、AUC

    AUC(Area Under Curve)被定义为ROC曲线下的面积(ROC的积分),通常大于0.5小于1。随机挑选一个正样本以及一个负样本,分类器判定正样本的值高于负样本的概率就是 AUC 值。AUC值(面积)越大的分类器,性能越好,如图:

    8、PR曲线

    PR曲线的横坐标是精确率P,纵坐标是召回率R。评价标准和ROC一样,先看平滑不平滑(蓝线明显好些)。一般来说,在同一测试集,上面的比下面的好(绿线比红线好)。当P和R的值接近时,F1值最大,此时画连接(0,0)和(1,1)的线,线和PRC重合的地方的F1是这条线最大的F1(光滑的情况下),此时的F1对于PRC就好像AUC对于ROC一样。一个数字比一条线更方便调型。

    五、逻辑回归的优缺点

    逻辑回归应用到工业界当中一些优点:

    • 形式简单,模型的可解释性非常好。从特征的权重可以看到不同的特征对最后结果的影响,某个特征的权重值比较高,那么这个特征最后对结果的影响会比较大。
    • 模型效果不错。在工程上是可以接受的(作为baseline),如果特征工程做的好,效果不会太差,并且特征工程可以大家并行开发,大大加快开发的速度。
    • 训练速度较快。分类的时候,计算量仅仅只和特征的数目相关。并且逻辑回归的分布式优化sgd发展比较成熟,训练的速度可以通过堆机器进一步提高,这样我们可以在短时间内迭代好几个版本的模型。
    • 资源占用小,尤其是内存。因为只需要存储各个维度的特征值,。
    • 方便输出结果调整。逻辑回归可以很方便的得到最后的分类结果,因为输出的是每个样本的概率分数,我们可以很容易的对这些概率分数进行cutoff,也就是划分阈值(大于某个阈值的是一类,小于某个阈值的是一类)。

    有时候模型没有单纯的谁比谁好(比如图二的蓝线和青线),所以选择模型还是要结合具体的使用场景。下面是两个场景:
    1,地震的预测 对于地震的预测,我们希望的是RECALL非常高,也就是说每次地震我们都希望预测出来。这个时候我们可以牺牲PRECISION。情愿发出1000次警报,把10次地震都预测正确了,也不要预测100次对了8次漏了两次。
    2,嫌疑人定罪 基于不错怪一个好人的原则,对于嫌疑人的定罪我们希望是非常准确的。即时有时候放过了一些罪犯(recall低),但也是值得的。
    对于分类器来说,本质上是给一个概率,此时,我们再选择一个CUTOFF点(阀值),高于这个点的判正,低于的判负。那么这个点的选择就需要结合你的具体场景去选择。反过来,场景会决定训练模型时的标准,比如第一个场景中,我们就只看RECALL=99.9999%(地震全中)时的PRECISION,其他指标就变得没有了意义。
    当正负样本数量差距不大的情况下,ROC和PR的趋势是差不多的,但是在正负样本分布极不均衡的情况下,PRC比ROC更能真实的反映出实际情况,因为此时ROC曲线看起来似乎很好,但是却在PR上效果一般。

    但是逻辑回归本身也有许多的缺点:

    • 准确率并不是很高。因为形式非常的简单(非常类似线性模型),很难去拟合数据的真实分布。
    • 很难处理数据不平衡的问题。举个例子:如果我们对于一个正负样本非常不平衡的问题比如正负样本比 10000:1.我们把所有样本都预测为正也能使损失函数的值比较小。但是作为一个分类器,它对正负样本的区分能力不会很好。
    • 处理非线性数据较麻烦。逻辑回归在不引入其他方法的情况下,只能处理线性可分的数据,或者进一步说,处理二分类的问题 。
    • 逻辑回归本身无法筛选特征。有时候,我们会用gbdt来筛选特征,然后再上逻辑回归。

    六、样本不均衡问题解决办法

    6.1 通过过抽样和欠抽样解决样本不均衡

    抽样是解决样本分布不均衡相对简单且常用的方法,包括过抽样和欠抽样两种。

    过抽样

    过抽样(也叫上采样、over-sampling)方法通过增加分类中少数类样本的数量来实现样本均衡,最直接的方法是简单复制少数类样本形成多条记录,这种方法的缺点是如果样本特征少而可能导致过拟合的问题;经过改进的过抽样方法通过在少数类中加入随机噪声、干扰数据或通过一定规则产生新的合成样本,例如SMOTE算法。

    欠抽样

    欠抽样(也叫下采样、under-sampling)方法通过减少分类中多数类样本的样本数量来实现样本均衡,最直接的方法是随机地去掉一些多数类样本来减小多数类的规模,缺点是会丢失多数类样本中的一些重要信息。

    总体上,过抽样和欠抽样更适合大数据分布不均衡的情况,尤其是第一种(过抽样)方法应用更加广泛。

    6.2 通过正负样本的惩罚权重解决样本不均衡

    通过正负样本的惩罚权重解决样本不均衡的问题的思想是在算法实现过程中,对于分类中不同样本数量的类别分别赋予不同的权重(一般思路分类中的小样本量类别权重高,大样本量类别权重低),然后进行计算和建模。

    使用这种方法时需要对样本本身做额外处理,只需在算法模型的参数中进行相应设置即可。很多模型和算法中都有基于类别参数的调整设置,以scikit-learn中的SVM为例,通过在class_weight : {dict, ‘balanced’}中针对不同类别针对不同的权重,来手动指定不同类别的权重。如果使用其默认的方法balanced,那么SVM会将权重设置为与不同类别样本数量呈反比的权重来做自动均衡处理,计算公式为:n_samples / (n_classes * np.bincount(y))。

    如果算法本身支持,这种思路是更加简单且高效的方法。

    6.3 通过组合/集成方法解决样本不均衡

    组合/集成方法指的是在每次生成训练集时使用所有分类中的小样本量,同时从分类中的大样本量中随机抽取数据来与小样本量合并构成训练集,这样反复多次会得到很多训练集和训练模型。最后在应用时,使用组合方法(例如投票、加权投票等)产生分类预测结果。

    例如,在数据集中的正、负例的样本分别为100和10000条,比例为1:100。此时可以将负例样本(类别中的大量样本集)随机分为100份(当然也可以分更多),每份100条数据;然后每次形成训练集时使用所有的正样本(100条)和随机抽取的负样本(100条)形成新的数据集。如此反复可以得到100个训练集和对应的训练模型。

    这种解决问题的思路类似于随机森林。在随机森林中,虽然每个小决策树的分类能力很弱,但是通过大量的“小树”组合形成的“森林”具有良好的模型预测能力。

    如果计算资源充足,并且对于模型的时效性要求不高的话,这种方法比较合适。

    6.4 通过特征选择解决样本不均衡

    上述几种方法都是基于数据行的操作,通过多种途径来使得不同类别的样本数据行记录均衡。除此以外,还可以考虑使用或辅助于基于列的特征选择方法。

    一般情况下,样本不均衡也会导致特征分布不均衡,但如果小类别样本量具有一定的规模,那么意味着其特征值的分布较为均匀,可通过选择具有显著型的特征配合参与解决样本不均衡问题,也能在一定程度上提高模型效果。

    上述几种方法的思路都是基于分类问题解决的。实际上,这种从大规模数据中寻找罕见数据的情况,也可以使用非监督式的学习方法,例如使用One-class SVM进行异常检测。分类是监督式方法,前期是基于带有标签(Label)的数据进行分类预测;而采用非监督式方法,则是使用除了标签以外的其他特征进行模型拟合,这样也能得到异常数据记录。所以,要解决异常检测类的问题,先是考虑整体思路,然后再考虑方法模型。

    七. sklearn逻辑回归参数

    Logistics Regression参数名称 含义
    函数调用形式 LogisticRegression(penalty=‘l2’,dual=False,tol=1e-4,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 字符串型,’l1’ or ‘l2’,默认:’l2’;正则化类型。
    dual 布尔型,默认:False。当样本数>特征数时,令dual=False;用于liblinear解决器中L2正则化。
    tol 浮点型,默认:1e-4;迭代终止判断的误差范围。
    C 浮点型,默认:1.0;其值等于正则化强度的倒数,为正的浮点数。数值越小表示正则化越强。
    fit_intercept 布尔型,默认:True;指定是否应该向决策函数添加常量(即偏差或截距)。
    intercept_scaling 浮点型,默认为1;仅仅当solver是”liblinear”时有用。
    class_weight 默认为None;与“{class_label: weight}”形式中的类相关联的权重。如果不给,则所有的类的权重都应该是1。
    random_state 整型,默认None;当“solver”==“sag”或“liblinear”时使用。在变换数据时使用的伪随机数生成器的种子。如果是整数, random_state为随机数生成器使用的种子;若为RandomState实例,则random_state为随机数生成器;如果没有,随机数生成器就是’ np.random '使用的RandomState实例。
    solver {‘newton-cg’, ‘lbfgs’, ‘liblinear’, ‘sag’, ‘saga’},默认: ‘liblinear’;用于优化问题的算法。对于小数据集来说,“liblinear”是个不错的选择,而“sag”和’saga’对于大型数据集会更快。对于多类问题,只有’newton-cg’, ‘sag’, 'saga’和’lbfgs’可以处理多项损失;“liblinear”仅限于“one-versus-rest”分类。
    max_iter 最大迭代次数,整型,默认是100;
    multi_class 字符串型,{ovr’, ‘multinomial’},默认:‘ovr’;如果选择的选项是“ovr”,那么一个二进制问题适合于每个标签,否则损失最小化就是整个概率分布的多项式损失。对liblinear solver无效。
    verbose 整型,默认是0;对于liblinear和lbfgs solver,verbose可以设为任意正数。
    warm_start 布尔型,默认为False;当设置为True时,重用前一个调用的解决方案以适合初始化。否则,只擦除前一个解决方案。对liblinear解码器无效。
    n_jobs 整型,默认是1;如果multi_class=‘ovr’ ,则为在类上并行时使用的CPU核数。无论是否指定了multi_class,当将’ solver ’ '设置为’liblinear’时,将忽略此参数。如果给定值为-1,则使用所有核。
    内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
    标签: