首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Scikit-learn笔记3 逻辑回归

在众多分类器中,逻辑回归(Logistic Regression)绝对是应用最广泛的模型之一。它以良好的性能和稳健的表现成为了机器学习模型的Baseline,即其他模型的表现至少要和它相当,不能比它差。

逻辑回归作为使用最多的一种广义线性模型,它将线性的预测值通过logistic函数p=1/(1+e^-y)=e^y/(e^y+1)映射到0-1的范围内,转换成概率,当概率大于设定的阈值则为1,反之则为0。通过这种方式,逻辑回归可以解决二分类问题(多分类是Softmax回归)。logistic函数形式如下:

Scikit-learn中,逻辑回归模型位于sklearn.linear_model.logistic文件夹下。下面打开Ipython notebook导入sklearn包,如下:

定义一个LogisticRegression类,打印出它的默认参数,解释如下:

C:惩罚项系数的倒数。值越小正则化项越大,通过大的C值削弱了正则化的影响,过拟合没有得到控制,模型效果较差。

class_weight:标签各类别的权重,默认每个类别一样,如果设为balanced则权重与类别出现的频次呈反比;也可以传入字典,如{'yes':0.7, 'no':0.3}。

dual:目标函数的对偶形式,只有当L2正则化项且solver='iiblinear‘才为对偶形式,默认为false,则求解目标函数的原始形式。

fit_intercept:是否拟合截距项,默认true,大多数决策边界函数都不会过原点,有截距项,除非对特征进行了去均值等中心化操作,才不需要。

intercept_scaling:浮点数,降低截距项的影响,solver='iiblinear‘才需要。

max_iter:优化目标函数时的迭代次数,默认100。

multi_class:多分类策略,默认为ovr,one-vs-rest,比如有a,b,c三类,ovr将这个标签变成3个:是a不是a、是b不是b、是c不是c分别预测。

n_jobs:单机则是能使用的cpu核心数,设为-1则训练时用到所有核心,实现并发操作,提升效率。

penalty:默认为L2,也可以是L1。

random_state:随机种子,设为某个正整数,则每次训练的样本相同,便于模型之间的比较,如果为None,则每次训练样本可能不同。

solver:各种求解最优化的算法,例如:iiblinear-线性规划法、newton-cg牛顿法、lbfgs-拟牛顿法、sag-随机平均梯度下降法。

注:小规模数据用iiblinear,大规模数据用sag,newton-cg/lbfgs/sag只适用L2正则的情况。

tol:一个很小的浮点数,判断是否停止迭代,小于则停止。

verbose:是否输出训练日志。

warm_start:热启动。是否使用前次迭代的结果,是则接着前一次继续训练,否则从头开始。

这些参数中,n_jobs、random_state、verbose、warm_start为通用参数,大多数模型都会有。模型的属性有:

coef_:模型系数向量,越大表示越有影响力。

intercept_:截距项

n_iter:实际迭代次数

分类器的方法有如下几个,他们不是逻辑回归独有,sklearn中的模型几乎都用这些方法进行训练和预测。

fit(X,y):传入特征和标签开始训练

predict(X):预测标签

predict_proba(X):预测各个类别的概率值,Kaggle比赛要求你提交每个类别的预测概率,可以用此方法

score(X,y):模型预测的准确率accuracy

下面用Kaggle入门比赛泰坦尼克数据集来演示逻辑回归模型。数据概况如下:

PassengerId:只是个乘客序号;

Survived:最终是否存活(标签);

Pclass:舱位,1是头等舱,3是最低等,从电影里看,这个影响还是挺大的;

Name:乘客姓名;

Sex:性别,应该影响很大;

Age:年龄,有一部分数据缺失;

SibSp:一同上船的兄弟姐妹或配偶;

Parch:一同上船的父母或子女;

Ticket:船票信息,比较乱,完全看不出有任何用处;

Fare:乘客票价,这个数据应该和Pclass有一定对应关系;

Cabin:客舱编号,缺失很多;

Embarked:上船地点,主要是S(南安普顿)、C(瑟堡)、Q(皇后镇)。

首先导入原始数据集,有891条观测和12个特征。如下:

经过数据清洗后的数据集去除了Id和Name等无用特征,将性别和上船地点转为独热编码。

生成训练集分开特征和标签。

接着从sklearn的model_selection包中importcross_val_score用于做交叉验证,评估模型效果,由于数据量较小,此处设置CV=3。Kaggle的测试集没有标签,所以只能评估训练集本身。

先来调试超参数C,其他参数固定如下。结果显示最大的f1值对应的C=0.1。

确定C=0.1后,保持其他参数不变,来调试优化器solver,分别尝试牛顿法、拟牛顿和随机梯度下降三种适合L2正则化的优化方法,可见sag效果最差。

最后,将优化器调整为lbfgs,其它参数不变,来调整迭代次数,默认为100次,当增大到下图的150次后,f1值有了小幅的提高,但继续增加迭代次数则无变化。如下:

当我们使用cross_val_score交叉验证时,无需手动调用fit(X,y)拟合模型,也不需要用predict(X,y)去做预测。还提供了多种评价指标供用户选择。如需要获得模型的系数和截距项,就要用fit()方法训练模型,用f1=0.74的clf训练如下:

逻辑回归中还有一些指标如优势比(Odd ratio)、负似然对数值等,sklearn并未提供,读者可以自行编写代码实现。为了比较模型的效果,后续分类器的文章都将使用泰坦尼克数据集。

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180117G00W4D00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券