机器学习笔记(三)---- 逻辑回归(二分类)

举报
云上有未来 发表于 2019/08/20 15:23:23 2019/08/20
【摘要】 逻辑回归基本概念:前面提到过线性模型也可以用来做分类任务,但线性模型的预测输出 y = wx + b 可能是(-∞,+∞)范围内的任意实数,而二分类任务的输出y={0,1},如何在这之间做转换呢?

逻辑回归基本概念

      前面提到过线性模型也可以用来做分类任务,但线性模型的预测输出 y = wx + b 可能是(-∞,+)范围内的任意实数,而二分类任务的输出y={0,1},如何在这之间做转换呢?答案就是找一个单调可微函数将分类任务输出y和线性回归模型联系起来,对数几率函数(Sigmoid函数)可以很好地胜任这个工作,函数图形如下,预测值z大于零判为正例,z小于零判为负例,z等于零处在临界值可任意判别。

              对数几率函数(Sigmoid函数)

      将对数几率函数作为判别函数代入线性回归模型中,就得到逻辑回归的模型如下,x不管怎么变化,预测输出y总是在[0,1]范围内,实际上给出的是y=1的概率,这样通过对数几率函数就将线性回归模型的预测输出从(-∞,+)压缩到[0,1],符合二分类问题的预测输出,所以逻辑回归也叫做对数几率回归,虽然名称上有“回归”二字,但实际上是分类模型。

                                             2.png
逻辑回归代价函数

      机器学习模型的代价函数要求是凸函数,左下图就是非凸函数,存在多个局部最小值,不利于求解全局最小值。而右下图则是凸函数的图形,可以保证局部最小点就是全局最小点,利用梯度下降算法可以很快地找到最小值。

                  非凸函数凸函数的图形

      这里略掉代价函数的推导过程,直接给出逻辑回归的代价函数:

                 逻辑回归的代价函数

       分析下这个函数,h(x)是预测输出(输出范围[0,1]),y为真实分类,代价函数也称为损失函数(loss funciton),预测和真实分类越吻合,代价函数越小,反之,代价函数越大。

      (1)y = 1时,Cost(h(x), y) = -log(h(x)),函数图形如左下图,h(x)的值趋近于1时,Cost趋近于0,说明预测和真实分类趋于一致,代价函数越小;h(x)趋近于0,说明预测和真实分类相反,则Cost越来越大。

      (2)y =0时,Cost(h(x), y) = -log(1-h(x)),函数图形如右下图,h(x)的值趋近于1时,Cost趋近于无穷大,说明预测和真实分类相反;h(x)趋近于0时,预测和真实分类趋于一致,Cost的值趋近于0。


6.png函数图形                    

逻辑回归特点

      - 模型简单,易于理解和实现,计算复杂度低;

      - 直接对分类可能性进行建模,无需事先假设数据分布,避免假设分布不准确带来的问题;

      - 不仅可以预测分类,还可以得到近似概率,对于辅助决策很有用;

      - 广泛应用于工业问题上,如垃圾邮件分类等;

      - 当特征属性很多,而数据量较小时,性能不太好;

逻辑回归练习

      sklearn中自带有breast数据集,是一组关于威斯康辛州的乳腺癌诊断数据库,共有569条数据,30个属性特征,分类输出为两类(良性、恶性),是一个可以用来做逻辑回归的简单例子。随机抽取十分之一的数据作为测试数据集,剩下的作为训练数据。

-

Python 代码


01import pandas as pd
02from sklearn import datasets
03from sklearn.cross_validation import train_test_split
04from sklearn.linear_model import LogisticRegression
05from sklearn.metrics import accuracy_score
06from sklearn import preprocessing
07
08breast_data = datasets.load_breast_cancer()
09data = pd.DataFrame(datasets.load_breast_cancer().data)
10data.columns = breast_data['feature_names']
11
12data_np = breast_data['data']
13target_np = breast_data['target']
14train_X,test_X, train_y, test_y = train_test_split(data_np,target_np,test_size =0.1,random_state = 0)
15
16model = LogisticRegression(C=1.0, tol=1e-6)
17model.fit(train_X, train_y)
18
19y_pred = model.predict(test_X)
20print(accuracy_score(test_y, y_pred))
21-----------------------------------------
220.9649122807017544

      上面是直接将原始数据直接灌入模型,细心的读者可能会问,各维度数据的量纲、取值区间差异这么大,有的特征属性数据取值都在1000以上,而有的特征属性取值却小于1,这样直接输入模型可以么?其实在训练前,还应该对数据进行标准化。数据标准化主要是将各维度数据按比例进行缩放,使之落入一个特定的区间内,同时去除数据的单位限制,转为为无量纲数据,便于不同单位或量级的特征能够进行加权和比较。

      归一化是一种最常用的数据标准化方法,将数值变为[0,1]之间的小数,方法是将每个特征属性(列)的数据减去均值,并除以方差。对于每个特征属性来说,所有数据都聚集在[0,1]范围内,方差为1。sklearn中数据归一化可以使用 preprocessing.scale(X),在本例中,数据归一化后预测结果正确率可达100%。


本文来自作者周捷

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。