python 多分类算法_Python机器学习:逻辑回归算法以及多类分类

向AI转型的程序员都关注了这个号👇👇👇

大数据挖掘DT机器学习  公众号: datayx

在我们进行分类的时,所取样本中的特征值一般都分布在实数域,但是我们想得到的往往是一个在 [0,1] 中的类似概率的值。 或者这么说,为了让特征值之间不会因为相差过大而造成干扰,比如,只有一个特征取值特别大,但是其他取值很小的时候, 我们需要对数据进行归一化。 即我们需要用一个从R 到 [0,1] 的单射来先处理特征值矩阵,然后再进行机器学习。当所用的映射是 sigmoid函数的时候,我们管这样的机器学习算法叫做逻辑回归。

本文源码地址:

关注微信公众号datayx 然后回复“逻辑回归”即可获取。

PS:逻辑回归是用来分类的!!!不是用来做线性回归的! sigmoid 函数的反函数叫做 logit 函数, 这就是逻辑回归 logistic regression 的来历,跟逻辑没啥关系......

sigmoid 函数

这个函数的特点就是一条S型的定义域在 R 中, 值域在 [0,1] 中的函数

同时它也代表 y=1的概率, y=0 的概率为 1-phi(z)

画一下图来说明一下

逻辑回归算法 logistic regression

基本原理

逻辑回归算法跟Adaline 线性自适应算法很类似,区别只不过是把激活函数从**恒同映射 y = z ** 换成了 y = sigmoid(z)

逻辑回归中的损失函数

回忆一下在梯度下降模型 Adaline 中应用到的损失函数 cost function 平方差函数

这是线性回归的一种损失函数

但是对于S型的sigmoid函数,这样的定义在 y 趋近-1,1 的时候会特别接近零

对于逻辑回归 logistic regression 损失函数是这样定义的

对数似然损失函数(交叉熵)

Ps: 一下所有的 log 其实都是 ln

这个损失函数是怎么来的呢?  极大似然法

先定义似然函数(每个样本都认为是独立的):

似然函数可以看成条件概率

关于似然函数的概念可以参考kevinGao的博客

http://www.cnblogs.com/kevinGaoblog/archive/2012/03/29/2424346.html

根据似然函数的概念,令似然函数最大的那个概率就是最合理的。我们想最大化似然函数,但是这个形式还是不够好看,毕竟是连乘的形式,所以,我们取一下对数

现在好了,我们知道:当 权向量 w 使 l最大的时候, w 最合理

那么我们就定义 J 函数 : J = -l

为了更好的理解,我们看一下单个样本的损失函数:

以y=1为例,当预测值接近正确值的时候,J 会收敛到 0

权值更新

跟梯度下降法一样,按照公式

经过计算

我们就有了权值更新的公式

居然跟Adaline一模一样哎

意不意外?惊不惊喜?

实践

我们再上一章 sklearn 实现 Perceptron 感知机的基础上用 Iris 的数据集来实践一下

过拟合,欠拟合与正则化

过拟合与欠拟合是机器学习常见的两个问题

过拟合

俗称想太多。为了很好的拟合训练集,模型使用了太多的参数,变得特别复杂,甚至噪音与误差都被分成了一类,这样的模型虽然对训练集模拟的很好,但是对用来预测的数据集却特别不可靠,我们说 :这样的模型 has a high variance (高方差)

-欠拟合

对应的,头脑太简单。模型太过简单以至于对预测用数据集来说也不可靠

我们这这样的模型 has a high bias (高偏差)

正则化 Ruglarization

为了防止过拟合,正则化是一种常用的方法。正则化,简单地说,就是引入额外的偏差去降低一些极端权值的影响。

最常见的正则化,是 L2正则化,他在损失函数的末尾加上这样一项

Lambda 被称为正则化参数

这样损失函数形式变为:

Ir = LogisticRegression(C=1000.0,random_state=0)

在类 LogisticRegression 中的参数C 来源于支持向量机(SVM)的相关概念, 这里先不作展开

损失函数的最终形式:

C值对模拟的影响

设置从 -5 到 4 10不同的幂作为C值,我们看一下 权值的影响

垃圾邮件分类

二元分类问题就是垃圾邮件分类(spam classification)。这里,分类垃圾短信。先用TF-IDF算法来抽取短信的特征向量,然后用逻辑回归分类。

数据源:UCI Machine Learning Repository(http://archive.ics.uci.edu/ml/datasets/SMS+Spam+Collection)的短信垃圾分类数据集(SMS SpamClassification Data Set)。

网格搜索

网格搜索(Grid search)就是用来确定最优超参数的方法。其原理就是选取可能的参数不断运行模型获取最佳效果。网格搜索用的是穷举法,其缺点在于即使每个超参数的取值范围都很小,计算量也是巨大的。不过这是一个并行问题,参数与参数彼此独立,计算过程不需要同步,所有很多方法都可以解决这个问题。scikit-learn有GridSearchCV()函数解决这个问题:

GridSearchCV()函数的参数有待评估模型pipeline,超参数词典parameters和效果评价指。

标scoring。n_jobs是指并发进程最大数量,设置为-1表示使用所有CPU核心进程。经过网格计算后的超参数在训练集中取得了很好的效果。

多类分类

scikit-learn用one-vs.-all或one-vs.-the-rest方法实现多类分类,就是把多类中的每个类都作为二元分类处理。分类器预测样本不同类型,将具有最大置信水平的类型作为样本类型。LogisticRegression()通过one-vs.-all策略支持多类分类。

数据集可以从kaggle (https://www.kaggle.com/c/sentiment-analysis-on-movie-reviews)

用烂番茄(Rotten Tomatoes)网站影评短语数据对电影进行评价。每个影评可以归入下面5个类项:不给力(negative),不太给力(somewhat negative),中等(neutral),有点给力(somewhat positive), 给力(positive)。解释变量不会总是直白的语言,因为影评内容千差万别,有讽刺的,否定的,以及其他语义的表述,语义并不直白。

多标签分类

多标签分类(multi-label classification)。每个样本可以拥有全部类型的一部分类型。一般有两种解决方法:

问题转化方法(Problem transformation)可以将多标签问题转化成单标签问题。

方法1:训练集里面每个样本通过幂运算转换成单标签。这种幂运算虽然直观,但是并不实用,因为这样做多出来的标

签只有一小部分样本会用到。而且,这些标签只能在训练集里面学习这些类似,在测试集中依然无法使用。

方法2:每个标签都用二元分类处理。每个标签的分类器都预测样本是否属于该标签。这个问题确保了单标签问题和多标签问题有同样的训练集,只是忽略了标签之间的关联关系。

多标签分类效果评估:

最常用的手段是汉明损失函数(Hamming

loss)和杰卡德相似度(Jaccard similarity)。

汉明损失函数表示错误标签的平均比例,是一个函数,当预测全部正确,即没有错误标签时,值为0。

杰卡德相似度或杰卡德相指数(Jaccardindex),是预测标签和真实标签的交集数量除以预测标签和真实标签的并集数量。其值在{0,1}之间,J(Predicted,True)=|Predicted ∩ True|/|Predicted ∪ True|

搜索公众号添加:datayx

不断更新资源

深度学习、机器学习、数据分析、python

长按图片,识别二维码,点关注

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值