初级算法梳理->逻辑回归算法梳理 ->Test2

目录

 

逻辑回归与线性回归的联系与区别,参考

分类与回归任务差别:

理论基础(根本差别):

参数估计方法:

逻辑回归的原理:

接下来说一说具体过程:

逻辑回归损失函数推导及优化,参考:

正则化与模型评估指标

正则化

模型评估指标

逻辑回归的优缺点

优点:

缺点:

样本不均衡问题解决办法

八大解决方法

扩大数据集

尝试其它评价指标

对数据集进行重采样

  一些经验法则:

尝试不同的分类算法

尝试对模型进行惩罚

尝试一个新的角度理解问题

尝试创新

将你的大类压缩成小类;

sklearn参数:


逻辑回归与线性回归的联系与区别,参考

分类与回归任务差别:

回归模型就是预测一个连续变量(如降水量,价格等)。在分类问题中,预测属于某类的概率。

这样就造成的了输出不同:在分类模型中输出是[0,1],使用线性回归作为输出就有问题,见下图:

理论基础(根本差别):

线性回归和逻辑回归的理论基础都是线性回归。线性回归拟合是的是超平面,数据应尽量在线的周围。逻辑回归拟合的是分割面,数据应尽量在线的两侧。见下图。

                                                                              线性回归

                                                                            逻辑回归

参数估计方法:

线性回归:线性回归中使用的是最小化平方误差损失函数,对偏离真实值越远的数据惩罚越严重。假如使用线性回归对{0,1}二分类问题做预测,则一个真值为1的样本,其预测值为50,那么将会对其产生很大的惩罚,这也和实际情况不符合,更大的预测值说明为1的可能性越大,而不应该惩罚的越严重。

逻辑回归:逻辑回归使用对数似然函数进行参数估计,使用交叉熵作为损失函数,对预测错误的惩罚是随着输出的增大,逐渐逼近一个常数,这就不存在上述问题了。

造成的区别:也正是因为使用的参数估计的方法不同,线性回归模型更容易受到异常值(outlier)的影响,有可能需要不断变换阈值(threshold),线性回归分类的情况见下面两图:

                                无异常值得线性回归

                                有异常值得线性回归

                                    使用逻辑回归的分类

逻辑回归的原理:

逻辑回归就是改变线性回归的目标,将尽量拟合数据改为尽量分割数据。

然后在套一个逻辑函数,这里套这个函数是有物理意义的,是为了构建后面损失函数。

这样分割面左边就是小于0的部分,就会被封为0类。分割面右边就是大于0的部分就会被封为1类。这样就完成分类问题,将线性回归的输出变成了离散化。

接下来说一说具体过程:

(1)找一个合适的预测函数(Andrew Ng的公开课中称为hypothesis),一般表示为h函数,该函数就是我们需要找的分类函数,它用来预测输入数据的判断结果。这个过程时非常关键的,需要对数据有一定的了解或分析,知道或者猜测预测函数的“大概”形式,比如是线性函数还是非线性函数。

 

(2)构造一个Cost函数(损失函数),该函数表示预测的输出(h)与训练数据类别(y)之间的偏差,可以是二者之间的差(h-y)或者是其他的形式。综合考虑所有训练数据的“损失”,将Cost求和或者求平均,记为J(θ)函数,表示所有训练数据预测值与实际类别的偏差。

 

(3)显然,J(θ)函数的值越小表示预测函数越准确(即h函数越准确),所以这一步需要做的是找到J(θ)函数的最小值。找函数的最小值有不同的方法,Logistic Regression实现时有的是梯度下降法(Gradient Descent)。

逻辑回归损失函数推导及优化,参考

正则化与模型评估指标

正则化

用于防止过拟合(减低结构风险),参考。

模型评估指标

逻辑回归的优缺点

优点:

 

(模型)模型清晰,背后的概率推导经得住推敲。

(输出)输出值自然地落在0到1之间,并且有概率意义(逻辑回归的输出是概率么?)。

(参数)参数代表每个特征对输出的影响,可解释性强。

(简单高效)实施简单,非常高效(计算量小、存储占用低),可以在大数据场景中使用。

(可扩展)可以使用online learning的方式更新轻松更新参数,不需要重新训练整个模型。

(过拟合)解决过拟合的方法很多,如L1、L2正则化。

(多重共线性)L2正则化就可以解决多重共线性问题。

缺点:

 

(特征相关情况)因为它本质上是一个线性的分类器,所以处理不好特征之间相关的情况。

(特征空间)特征空间很大时,性能不好。

(精度)容易欠拟合,精度不高。

样本不均衡问题解决办法

八大解决方法

扩大数据集

  当遇到类别不均衡问题时,首先应该想到,是否可能再增加数据(一定要有小类样本数据),更多的数据往往战胜更好的算法。因为机器学习是使用现有的数据多整个数据的分布进行估计,因此更多的数据往往能够得到更多的分布信息,以及更好分布估计。即使再增加小类样本数据时,又增加了大类样本数据,也可以使用放弃一部分大类数据(即对大类数据进行欠采样)来解决。

尝试其它评价指标

  从前面的分析可以看出,准确度这个评价指标在类别不均衡的分类任务中并不能work,甚至进行误导(分类器不work,但是从这个指标来看,该分类器有着很好的评价指标得分)。因此在类别不均衡分类任务中,需要使用更有说服力的评价指标来对分类器进行评价。如何对不同的问题选择有效的评价指标参见这里

  上面的超链接中的文章,讲述了如何对乳腺癌患者复发类别不均衡数据进行分类。在文中,推荐了几个比传统的准确度更有效的评价指标:

  1. 混淆矩阵(Confusion Matrix):使用一个表格对分类器所预测的类别与其真实的类别的样本统计,分别为:TP、FN、FP与TN。
  2. 精确度(Precision)
  3. 召回率(Recall)
  4. F1得分(F1 Score):精确度与找召回率的加权平均。
  5. Kappa (Cohen kappa)
  6. ROC曲线(ROC Curves):见Assessing and Comparing Classifier Performance with ROC Curves

对数据集进行重采样

 可以使用一些策略该减轻数据的不平衡程度。该策略便是采样(sampling),主要有两种采样方法来降低数据的不平衡性。

对小类的数据样本进行采样来增加小类的数据样本个数,即过采样(over-sampling ,采样的个数大于该类样本的个数)。

对大类的数据样本进行采样来减少该类数据样本的个数,即欠采样(under-sampling,采样的次数少于该类样本的个素)。

  采样算法往往很容易实现,并且其运行速度快,并且效果也不错。更详细的内容参见这里。

  一些经验法则:

考虑对大类下的样本(超过1万、十万甚至更多)进行欠采样,即删除部分样本;

考虑对小类下的样本(不足1为甚至更少)进行过采样,即添加部分样本的副本;

考虑尝试随机采样与非随机采样两种采样方法;

考虑对各类别尝试不同的采样比例,比一定是1:1,有时候1:1反而不好,因为与现实情况相差甚远;

考虑同时使用过采样与欠采样。

尝试产生人工数据样本

  一种简单的人工样本数据产生的方法便是,对该类下的所有样本每个属性特征的取值空间中随机选取一个组成新的样本,即属性值随机采样。你可以使用基于经验对属性值进行随机采样而构造新的人工样本,或者使用类似朴素贝叶斯方法假设各属性之间互相独立进行采样,这样便可得到更多的数据,但是无法保证属性之前的线性关系(如果本身是存在的)。

  有一个系统的构造人工数据样本的方法SMOTE(Synthetic Minority Over-sampling Technique)。SMOTE是一种过采样算法,它构造新的小类样本而不是产生小类中已有的样本的副本,即该算法构造的数据是新样本,原数据集中不存在的。该基于距离度量选择小类别下两个或者更多的相似样本,然后选择其中一个样本,并随机选择一定数量的邻居样本对选择的那个样本的一个属性增加噪声,每次处理一个属性。这样就构造了更多的新生数据。具体可以参见原始论文。

  这里有SMOTE算法的多个不同语言的实现版本:

Python: UnbalancedDataset模块提供了SMOTE算法的多种不同实现版本,以及多种重采样算法。

R: DMwR package。

Weka: SMOTE supervised filter。

尝试不同的分类算法

  强烈建议不要对待每一个分类都使用自己喜欢而熟悉的分类算法。应该使用不同的算法对其进行比较,因为不同的算法使用于不同的任务与数据。具体可以参见“Why you should be Spot-Checking Algorithms on your Machine Learning Problems”。

  决策树往往在类别不均衡数据上表现不错。它使用基于类变量的划分规则去创建分类树,因此可以强制地将不同类别的样本分开。目前流行的决策树算法有:C4.5、C5.0、CART和Random Forest等。基于R编写的决策树参见这里。基于Python的Scikit-learn的CART使用参见这里。

尝试对模型进行惩罚

你可以使用相同的分类算法,但是使用一个不同的角度,比如你的分类任务是识别那些小类,那么可以对分类器的小类样本数据增加权值,降低大类样本的权值(这种方法其实是产生了新的数据分布,即产生了新的数据集,译者注),从而使得分类器将重点集中在小类样本身上。一个具体做法就是,在训练分类器时,若分类器将小类样本分错时额外增加分类器一个小类样本分错代价,这个额外的代价可以使得分类器更加“关心”小类样本。如penalized-SVM和penalized-LDA算法。

Weka中有一个惩罚模型的通用框架CostSensitiveClassifier,它能够对任何分类器进行封装,并且使用一个自定义的惩罚矩阵对分错的样本进行惩罚。

如果你锁定一个具体的算法时,并且无法通过使用重采样来解决不均衡性问题而得到较差的分类结果。这样你便可以使用惩罚模型来解决不平衡性问题。但是,设置惩罚矩阵是一个复杂的事,因此你需要根据你的任务尝试不同的惩罚矩阵,并选取一个较好的惩罚矩阵。

尝试一个新的角度理解问题

  我们可以从不同于分类的角度去解决数据不均衡性问题,我们可以把那些小类的样本作为异常点(outliers),因此该问题便转化为异常点检测(anomaly detection)与变化趋势检测问题(change detection)。

  异常点检测即是对那些罕见事件进行识别。如通过机器的部件的振动识别机器故障,又如通过系统调用序列识别恶意程序。这些事件相对于正常情况是很少见的。

  变化趋势检测类似于异常点检测,不同在于其通过检测不寻常的变化趋势来识别。如通过观察用户模式或银行交易来检测用户行为的不寻常改变。

  将小类样本作为异常点这种思维的转变,可以帮助考虑新的方法去分离或分类样本。这两种方法从不同的角度去思考,让你尝试新的方法去解决问题。

尝试创新

  仔细对你的问题进行分析与挖掘,是否可以将你的问题划分成多个更小的问题,而这些小问题更容易解决。你可以从这篇文章In classification, how do you handle an unbalanced training set?中得到灵感。例如:

将你的大类压缩成小类;

使用One Class分类器(将小类作为异常点);

使用集成方式,训练多个分类器,然后联合这些分类器进行分类;

 

这些想法只是冰山一角,你可以想到更多的有趣的和有创意的想法去解决问题。更多的想法参加Reddit的文章

sklearn参数:

方法与参数

LogisticRegression类的各项参数的含义

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' : 字符串‘l1’或‘l2’,默认‘l2’。
    • 用来指定惩罚的基准(正则化参数)。只有‘l2’支持‘newton-cg’、‘sag’和‘lbfgs’这三种算法。
    • 如果选择‘l2’,solver参数可以选择‘liblinear’、‘newton-cg’、‘sag’和‘lbfgs’这四种算法;如果选择‘l1’的话就只能用‘liblinear’算法。
  • dual=False : 对偶或者原始方法。Dual只适用于正则化相为l2的‘liblinear’的情况,通常样本数大于特征数的情况下,默认为False。
  • C=1.0 : C为正则化系数λ的倒数,必须为正数,默认为1。和SVM中的C一样,值越小,代表正则化越强。
  • fit_intercept=True : 是否存在截距,默认存在。
  • intercept_scaling=1 : 仅在正则化项为‘liblinear’,且fit_intercept设置为True时有用。
  • solver='liblinear' : solver参数决定了我们对逻辑回归损失函数的优化方法,有四种算法可以选择。
    • a) liblinear:使用了开源的liblinear库实现,内部使用了坐标轴下降法来迭代优化损失函数。
    • b) lbfgs:拟牛顿法的一种,利用损失函数二阶导数矩阵即海森矩阵来迭代优化损失函数。
    • c) newton-cg:也是牛顿法家族的一种,利用损失函数二阶导数矩阵即海森矩阵来迭代优化损失函数。
    • d) sag:即随机平均梯度下降,是梯度下降法的变种,和普通梯度下降法的区别是每次迭代仅仅用一部分的样本来计算梯度,适合于样本数据多的时候。

从上面的描述可以看出,newton-cg、lbfgs和sag这三种优化算法时都需要损失函数的一阶或者二阶连续导数,因此不能用于没有连续导数的L1正则化,只能用于L2正则化。而liblinear通吃L1正则化和L2正则化。
同时,sag每次仅仅使用了部分样本进行梯度迭代,所以当样本量少的时候不要选择它,而如果样本量非常大,比如大于10万,sag是第一选择。但是sag不能用于L1正则化,所以当你有大量的样本,又需要L1正则化的话就要自己做取舍了。要么通过对样本采样来降低样本量,要么回到L2正则化。
但是liblinear也有自己的弱点!我们知道,逻辑回归有二元逻辑回归和多元逻辑回归。对于多元逻辑回归常见的有one-vs-rest(OvR)和many-vs-many(MvM)两种。而MvM一般比OvR分类相对准确一些。而liblinear只支持OvR,不支持MvM,这样如果我们需要相对精确的多元逻辑回归时,就不能选择liblinear了。也意味着如果我们需要相对精确的多元逻辑回归不能使用L1正则化了。

总结:

正则化

算法

适用场景

L1

liblinear

liblinear适用于小数据集;如果选择L2正则化发现还是过拟合,即预测效果差的时候,就可以考虑L1正则化;如果模型的特征非常多,希望一些不重要的特征系数归零,从而让模型系数稀疏化的话,也可以使用L1正则化。

L2

liblinear

libniear只支持多元逻辑回归的OvR,不支持MvM,但MVM相对精确。

L2

lbfgs/newton-cg/sag

较大数据集,支持one-vs-rest(OvR)和many-vs-many(MvM)两种多元逻辑回归。

L2

sag

如果样本量非常大,比如大于10万,sag是第一选择;但不能用于L1正则化。

来源:http://jishu.y5y.com.cn/cherdw/article/details/54891073

  • multi_class='ovr' : 分类方式。官网有个对比两种分类方式的例子:链接地址
    • ovr即one-vs-rest(OvR),multinomial是many-vs-many(MvM)。如果是二元逻辑回归,ovr和multinomial并没有任何区别,区别主要在多元逻辑回归上。
    • ovr不论是几元回归,都当成二元回归来处理。mvm从从多个类中每次选两个类进行二元回归。如果总共有T类,需要T(T-1)/2次分类。
    • OvR相对简单,但分类效果相对略差(大多数样本分布情况)。而MvM分类相对精确,但是分类速度没有OvR快。
    • 如果选择了ovr,则4种损失函数的优化方法liblinear,newton-cg,lbfgs和sag都可以选择。但是如果选择了multinomial,则只能选择newton-cg, lbfgs和sag了。
  • class_weight=None : 类型权重参数。用于标示分类模型中各种类型的权重。默认不输入,即所有的分类的权重一样。
    • 选择‘balanced’自动根据y值计算类型权重。
    • 自己设置权重,格式:{class_label: weight}。例如0,1分类的er'yuan二元模型,设置class_weight={0:0.9, 1:0.1},这样类型0的权重为90%,而类型1的权重为10%。
  • random_state=None : 随机数种子,默认为无。仅在正则化优化算法为sag,liblinear时有用。
  • max_iter=100 : 算法收敛的最大迭代次数。
  • tol=0.0001 : 迭代终止判据的误差范围。
  • verbose=0 : 日志冗长度int:冗长度;0:不输出训练过程;1:偶尔输出; >1:对每个子模型都输出
  • warm_start=False : 是否热启动,如果是,则下一次训练是以追加树的形式进行(重新使用上一次的调用作为初始化)。布尔型,默认False。
  • n_jobs=1 : 并行数,int:个数;-1:跟CPU核数一致;1:默认值。

LogisticRegression类的常用方法

  • fit(X, y, sample_weight=None)
    • 拟合模型,用来训练LR分类器,其中X是训练样本,y是对应的标记向量
    • 返回对象,self。
  • fit_transform(X, y=None, **fit_params)
    • fit与transform的结合,先fit后transform。返回X_new:numpy矩阵。
  • predict(X)
    • 用来预测样本,也就是分类,X是测试集。返回array。
  • predict_proba(X)
    • 输出分类概率。返回每种类别的概率,按照分类类别顺序给出。如果是多分类问题,multi_class="multinomial",则会给出样本对于每种类别的概率。
    • 返回array-like。
  • score(X, y, sample_weight=None)
    • 返回给定测试集合的平均准确率(mean accuracy),浮点型数值。
    • 对于多个分类返回,则返回每个类别的准确率组成的哈希矩阵。

示例

参考官网的例子,对鸢尾花数据进行逻辑回归。画图参考

import numpy as np

from sklearn import linear_model, datasets

from sklearn.cross_validation import train_test_split

 

# 1.加载数据

iris = datasets.load_iris()

X = iris.data[:, :2]  # 使用前两个特征

Y = iris.target

#np.unique(Y)   # out: array([0, 1, 2])

 

# 2.拆分测试集、训练集。

X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.3, random_state=0)

# 设置随机数种子,以便比较结果。

 

# 3.标准化特征值

from sklearn.preprocessing import StandardScaler

sc = StandardScaler()

sc.fit(X_train)

X_train_std = sc.transform(X_train)

X_test_std = sc.transform(X_test)

 

# 4. 训练逻辑回归模型

logreg = linear_model.LogisticRegression(C=1e5)

logreg.fit(X_train, Y_train)

 

# 5. 预测

prepro = logreg.predict_proba(X_test_std)

acc = logreg.score(X_test_std,Y_test)

因为这里数据量小,结果准确率只有0.7。嘛,只是小小的示范一下怎么使用sklearn的逻辑回归方法。在训练模型之前,可以优化一下模型参数,用GridSearchCV()函数。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
本系统的研发具有重大的意义,在安全性方面,用户使用浏览器访问网站时,采用注册和密码等相关的保护措施,提高系统的可靠性,维护用户的个人信息和财产的安全。在方便性方面,促进了校园失物招领网站的信息化建设,极大的方便了相关的工作人员对校园失物招领网站信息进行管理。 本系统主要通过使用Java语言编码设计系统功能,MySQL数据库管理数据,AJAX技术设计简洁的、友好的网址页面,然后在IDEA开发平台中,编写相关的Java代码文件,接着通过连接语言完成与数据库的搭建工作,再通过平台提供的Tomcat插件完成信息的交互,最后在浏览器中打开系统网址便可使用本系统。本系统的使用角色可以被分为用户和管理员,用户具有注册、查看信息、留言信息等功能,管理员具有修改用户信息,发布寻物启事等功能。 管理员可以选择任一浏览器打开网址,输信息无误后,以管理员的身份行使相关的管理权限。管理员可以通过选择失物招领管理,管理相关的失物招领信息记录,比如进行查看失物招领信息标题,修改失物招领信息来源等操作。管理员可以通过选择公告管理,管理相关的公告信息记录,比如进行查看公告详情,删除错误的公告信息,发布公告等操作。管理员可以通过选择公告类型管理,管理相关的公告类型信息,比如查看所有公告类型,删除无用公告类型,修改公告类型,添加公告类型等操作。寻物启事管理页面,此页面提供给管理员的功能有:新增寻物启事,修改寻物启事,删除寻物启事。物品类型管理页面,此页面提供给管理员的功能有:新增物品类型,修改物品类型,删除物品类型。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值