用Python开始机器学习(7:逻辑回归分类) --好!!
from : http://blog.csdn.net/lsldd/article/details/41551797
在本系列文章中提到过用Python开始机器学习(3:数据拟合与广义线性回归)中提到过回归算法来进行数值预测。逻辑回归算法本质还是回归,只是其引入了逻辑函数来帮助其分类。实践发现,逻辑回归在文本分类领域表现的也很优秀。现在让我们来一探究竟。
1、逻辑函数
假设数据集有n个独立的特征,x1到xn为样本的n个特征。常规的回归算法的目标是拟合出一个多项式函数,使得预测值与真实值的误差最小:
而我们希望这样的f(x)能够具有很好的逻辑判断性质,最好是能够直接表达具有特征x的样本被分到某类的概率。比如f(x)>0.5的时候能够表示x被分为正类,f(x)<0.5表示分为反类。而且我们希望f(x)总在[0, 1]之间。有这样的函数吗?
sigmoid函数就出现了。这个函数的定义如下:
先直观的了解一下,sigmoid函数的图像如下所示(来自http://computing.dcu.ie/~humphrys/Notes/Neural/sigmoid.html):
sigmoid函数具有我们需要的一切优美特性,其定义域在全体实数,值域在[0, 1]之间,并且在0点值为0.5。
那么,如何将f(x)转变为sigmoid函数呢?令p(x)=1为具有特征x的样本被分到类别1的概率,则p(x)/[1-p(x)]被定义为让步比(odds ratio)。引入对数:
上式很容易就能把p(x)解出来得到下式:
现在,我们得到了需要的sigmoid函数。接下来只需要和往常的线性回归一样,拟合出该式中n个参数c即可。
2、测试数据
测试数据我们仍然选择康奈尔大学网站的2M影评数据集。
在这个数据集上我们已经测试过KNN分类算法、朴素贝叶斯分类算法。现在我们看看罗辑回归分类算法在处理此类情感分类问题效果如何。
同样的,我们直接读入保存好的movie_data.npy和movie_target.npy以节省时间。
3、代码与分析
逻辑回归的代码如下:
- # -*- coding: utf-8 -*-
- from matplotlib import pyplot
- import scipy as sp
- import numpy as np
- from matplotlib import pylab
- from sklearn.datasets import load_files
- from sklearn.cross_validation import train_test_split
- from sklearn.feature_extraction.text import CountVectorizer
- from sklearn.feature_extraction.text import TfidfVectorizer
- from sklearn.naive_bayes import MultinomialNB
- from sklearn.metrics import precision_recall_curve, roc_curve, auc
- from sklearn.metrics import classification_report
- from sklearn.linear_model import LogisticRegression
- import time
- start_time = time.time()
- #绘制R/P曲线
- def plot_pr(auc_score, precision, recall, label=None):
- pylab.figure(num=None, figsize=(6, 5))
- pylab.xlim([0.0, 1.0])
- pylab.ylim([0.0, 1.0])
- pylab.xlabel('Recall')
- pylab.ylabel('Precision')
- pylab.title('P/R (AUC=%0.2f) / %s' % (auc_score, label))
- pylab.fill_between(recall, precision, alpha=0.5)
- pylab.grid(True, linestyle='-', color='0.75')
- pylab.plot(recall, precision, lw=1)
- pylab.show()
- #读取
- movie_data = sp.load('movie_data.npy')
- movie_target = sp.load('movie_target.npy')
- x = movie_data
- y = movie_target
- #BOOL型特征下的向量空间模型,注意,测试样本调用的是transform接口
- count_vec = TfidfVectorizer(binary = False, decode_error = 'ignore',\
- stop_words = 'english')
- average = 0
- testNum = 10
- for i in range(0, testNum):
- #加载数据集,切分数据集80%训练,20%测试
- x_train, x_test, y_train, y_test\
- = train_test_split(movie_data, movie_target, test_size = 0.2)
- x_train = count_vec.fit_transform(x_train)
- x_test = count_vec.transform(x_test)
- #训练LR分类器
- clf = LogisticRegression()
- clf.fit(x_train, y_train)
- y_pred = clf.predict(x_test)
- p = np.mean(y_pred == y_test)
- print(p)
- average += p
- #准确率与召回率
- answer = clf.predict_proba(x_test)[:,1]
- precision, recall, thresholds = precision_recall_curve(y_test, answer)
- report = answer > 0.5
- print(classification_report(y_test, report, target_names = ['neg', 'pos']))
- print("average precision:", average/testNum)
- print("time spent:", time.time() - start_time)
- plot_pr(0.5, precision, recall, "pos")
代码运行结果如下:
0.8
0.817857142857
0.775
0.825
0.807142857143
0.789285714286
0.839285714286
0.846428571429
0.764285714286
0.771428571429
precision recall f1-score support
neg 0.74 0.80 0.77 132
pos 0.81 0.74 0.77 148
avg / total 0.77 0.77 0.77 280
average precision: 0.803571428571
time spent: 9.651551961898804
首先注意我们连续测试了10组测试样本,最后统计出准确率的平均值。另外一种好的测试方法是K折交叉检验(K-Fold)。这样都能更加准确的评估分类器的性能,考察分类器对噪音的敏感性。
其次我们注意看最后的图,这张图就是使用precision_recall_curve绘制出来的P/R曲线(precition/Recall)。结合P/R图,我们能对逻辑回归有更进一步的理解。
前文我们说过,通常我们使用0.5来做划分两类的依据。而结合P/R分析,阈值的选取是可以更加灵活和优秀的。
在上图可以看到,如果选择的阈值过低,那么更多的测试样本都将分为1类。因此召回率能够得到提升,显然准确率牺牲相应准确率。
比如本例中,或许我会选择0.42作为划分值——因为该点的准确率和召回率都很高。
最后给一些比较好的资源:
浙大某女学霸的博客!记录的斯坦福Andrew老师主讲的LR公开课笔记:http://blog.csdn.net/abcjennifer/article/details/7716281
一个总结LR还不错的博客:http://xiamaogeng.blog.163.com/blog/static/1670023742013231197530/
Sigmoid函数详解:http://computing.dcu.ie/~humphrys/Notes/Neural/sigmoid.html
用Python开始机器学习(7:逻辑回归分类) --好!!的更多相关文章
- 机器学习二 逻辑回归作业、逻辑回归(Logistic Regression)
机器学习二 逻辑回归作业 作业在这,http://speech.ee.ntu.edu.tw/~tlkagk/courses/ML_2016/Lecture/hw2.pdf 是区分spam的. 57 ...
- 100天搞定机器学习|Day8 逻辑回归的数学原理
机器学习100天|Day1数据预处理 100天搞定机器学习|Day2简单线性回归分析 100天搞定机器学习|Day3多元线性回归 100天搞定机器学习|Day4-6 逻辑回归 100天搞定机器学习|D ...
- Lineage逻辑回归分类算法
Lineage逻辑回归分类算法 线性回归和逻辑回归参考文章: http://blog.csdn.net/viewcode/article/details/8794401 http://www.cnbl ...
- Python机器学习算法 — 逻辑回归(Logistic Regression)
逻辑回归--简介 逻辑回归(Logistic Regression)就是这样的一个过程:面对一个回归或者分类问题,建立代价函数,然后通过优化方法迭代求解出最优的模型参数,然后测试验证我们这个求解的模型 ...
- scikit-learn机器学习(二)逻辑回归进行二分类(垃圾邮件分类),二分类性能指标,画ROC曲线,计算acc,recall,presicion,f1
数据来自UCI机器学习仓库中的垃圾信息数据集 数据可从http://archive.ics.uci.edu/ml/datasets/sms+spam+collection下载 转成csv载入数据 im ...
- python sklearn库实现逻辑回归的实例代码
Sklearn简介 Scikit-learn(sklearn)是机器学习中常用的第三方模块,对常用的机器学习方法进行了封装,包括回归(Regression).降维(Dimensionality Red ...
- 分布式机器学习:逻辑回归的并行化实现(PySpark)
1. 梯度计算式导出 我们在博客<统计学习:逻辑回归与交叉熵损失(Pytorch实现)>中提到,设\(w\)为权值(最后一维为偏置),样本总数为\(N\),\(\{(x_i, y_i)\} ...
- 【机器学习】逻辑回归(Logistic Regression)
注:最近开始学习<人工智能>选修课,老师提纲挈领的介绍了一番,听完课只了解了个大概,剩下的细节只能自己继续摸索. 从本质上讲:机器学习就是一个模型对外界的刺激(训练样本)做出反应,趋利避害 ...
- 逻辑回归(分类问题)(Logistic Regression、罗杰斯特回归)
逻辑回归:问题只有两项,即{0, 1}.一般而言,回归问题是连续模型,不用在分类问题上,且噪声较大,但如果非要引入,那么采用逻辑回归模型. 对于一般训练集: 参数系统为: 逻辑回归模型为: ...
随机推荐
- paip..禁用mmseg 的默认词库. . 仅仅使用自定义词库from数据库.
paip..禁用mmseg 的默认词库. . 仅仅使用自定义词库from数据库. mmseg默认词库只能是文件格式...不好维护..要是不个词库放的个数据库里面走好维护兰.. 要实现2个目标..: 1 ...
- atitit.hbnt orm db 新新增更新最佳实践o99
atitit.hbnt orm db 新新增更新最佳实践o99 1. merge跟个save了. 1 2. POJO对象处于游离态.持久态.托管态.使用merge()的情况. 1 3. @Dynami ...
- paip.关于动画特效原理 html js 框架总结
paip.关于动画特效原理 html js 框架总结 1. 动画框架的来源:flex,jqueryui 3 2. 特效的分类 3 2.1. Property effects 动态改变一个或多个目标对象 ...
- Python框架之Tornado(四)源码之褪去模板外衣
上一篇介绍了客户端请求在tornado框架中的生命周期,其本质就是利用epoll和socket来获取并处理请求.在上一篇的内容中,我们只是给客户端返回了简单的字符串,如:“Hello World”,而 ...
- Axios、Lodash、TweenJS
Axios是一个基于promise的HTTP库 http://chuansong.me/n/394228451820 Lodash是一个JavaScript的函数工具集 http://www.css8 ...
- php header函数详解
客户机的请求方式格式:是统一资源标识符.协议版本号,后边是MIME信息包括请求修饰符.客户机信息和可能的内容!服务器响应格式:一个状态行包括信息的协议版本号.一个成功或错误的代码,后边是MIME信息包 ...
- 攻城利器 —— Carthage简单介绍
01 Carthage简单介绍 主页:https://github.com/Carthage/Carthage.git 作者:Justin Spahr-Summers等 版本:0.18 目标:用最简单 ...
- Java反序列化漏洞执行命令回显实现及Exploit下载
原文地址:http://www.freebuf.com/tools/88908.html 本文原创作者:rebeyond 文中提及的部分技术.工具可能带有一定攻击性,仅供安全学习和教学用途,禁止非法使 ...
- HTML 邮件链接,超链接发邮件
在网页中可以设置如“联系我们”.“问题反馈”等所谓的邮箱链接,类似网页超链接,只是可以直接打开默认邮箱程序. 使用<a href="mailto:youEMail@xxx.yyy&qu ...
- (转)【Unity3d】Glow + Outline 轮廓描边
转:http://www.cnblogs.com/dosomething/archive/2012/08/04/2622488.html [Unity3d]Glow + Outline 轮廓描边 轮廓 ...