用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、代码与分析

逻辑回归的代码如下:

[python] view plain copy

  1. # -*- coding: utf-8 -*-
  2. from matplotlib import pyplot
  3. import scipy as sp
  4. import numpy as np
  5. from matplotlib import pylab
  6. from sklearn.datasets import load_files
  7. from sklearn.cross_validation import train_test_split
  8. from sklearn.feature_extraction.text import  CountVectorizer
  9. from sklearn.feature_extraction.text import  TfidfVectorizer
  10. from sklearn.naive_bayes import MultinomialNB
  11. from sklearn.metrics import precision_recall_curve, roc_curve, auc
  12. from sklearn.metrics import classification_report
  13. from sklearn.linear_model import LogisticRegression
  14. import time
  15. start_time = time.time()
  16. #绘制R/P曲线
  17. def plot_pr(auc_score, precision, recall, label=None):
  18. pylab.figure(num=None, figsize=(6, 5))
  19. pylab.xlim([0.0, 1.0])
  20. pylab.ylim([0.0, 1.0])
  21. pylab.xlabel(‘Recall‘)
  22. pylab.ylabel(‘Precision‘)
  23. pylab.title(‘P/R (AUC=%0.2f) / %s‘ % (auc_score, label))
  24. pylab.fill_between(recall, precision, alpha=0.5)
  25. pylab.grid(True, linestyle=‘-‘, color=‘0.75‘)
  26. pylab.plot(recall, precision, lw=1)
  27. pylab.show()
  28. #读取
  29. movie_data   = sp.load(‘movie_data.npy‘)
  30. movie_target = sp.load(‘movie_target.npy‘)
  31. x = movie_data
  32. y = movie_target
  33. #BOOL型特征下的向量空间模型,注意,测试样本调用的是transform接口
  34. count_vec = TfidfVectorizer(binary = False, decode_error = ‘ignore‘,\
  35. stop_words = ‘english‘)
  36. average = 0
  37. testNum = 10
  38. for i in range(0, testNum):
  39. #加载数据集,切分数据集80%训练,20%测试
  40. x_train, x_test, y_train, y_test\
  41. = train_test_split(movie_data, movie_target, test_size = 0.2)
  42. x_train = count_vec.fit_transform(x_train)
  43. x_test  = count_vec.transform(x_test)
  44. #训练LR分类器
  45. clf = LogisticRegression()
  46. clf.fit(x_train, y_train)
  47. y_pred = clf.predict(x_test)
  48. p = np.mean(y_pred == y_test)
  49. print(p)
  50. average += p
  51. #准确率与召回率
  52. answer = clf.predict_proba(x_test)[:,1]
  53. precision, recall, thresholds = precision_recall_curve(y_test, answer)
  54. report = answer > 0.5
  55. print(classification_report(y_test, report, target_names = [‘neg‘, ‘pos‘]))
  56. print("average precision:", average/testNum)
  57. print("time spent:", time.time() - start_time)
  58. 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

时间: 2024-10-17 12:30:05

用Python开始机器学习(7:逻辑回归分类) --好!!的相关文章

python逻辑回归分类MNIST数据集

一.逻辑回归的介绍 logistic回归又称logistic回归分析,是一种广义的线性回归分析模型,常用于数据挖掘,疾病自动诊断,经济预测等领域.例如,探讨引发疾病的危险因素,并根据危险因素预测疾病发生的概率等.以胃癌病情分析为例,选择两组人群,一组是胃癌组,一组是非胃癌组,两组人群必定具有不同的体征与生活方式等.因此因变量就为是否胃癌,值为"是"或"否",自变量就可以包括很多了,如年龄.性别.饮食习惯.幽门螺杆菌感染等.自变量既可以是连续的,也可以是分类的.然后通

机器学习:逻辑回归

************************************** 注:本系列博客是博主学习Stanford大学 Andrew Ng 教授的<机器学习>课程笔记.博主深感学过课程后,不进行总结很容易遗忘,根据课程加上自己对不明白问题的补充遂有此系列博客.本系列博客包括线性回归.逻辑回归.神经网络.机器学习的应用和系统设计.支持向量机.聚类.将维.异常检测.推荐系统及大规模机器学习等内容. ************************************** 逻辑回归 分类(C

机器学习实战-逻辑回归

什么是回归? 假设现在有些数据点,我用直线对这些点进行拟合(该线叫做最佳拟合直线),这个拟合的过程就叫做回归. Logistic回归? 这里,Logistic回归进行分类的主要思想:根据现有数据对分类的边界线建立回归公式,以此边界线进行分类.这里的回归指的是最佳拟合,就是要找到边界线的回归公式的最佳拟合的参数集.训练时使用最优化算法寻找最佳拟合参数. 基于Logistic回归和Sigmoid函数的分类 对于边界线建立的回归函数,能够接受所有的输入然后预测出类别.例如,对于二分类的情况下,上述函数

朴素贝叶斯和逻辑回归分类

朴素贝叶斯 用p1(x, y)表示(x, y)属于类别1的概率,P2(x, y)表示(x, y)属于类别2的概率: 如果p(c1|x, y) > P(c2|x, y), 那么类别为1 如果p(c1|x, y) < P2(c2|x, y), 那么类别为2 根据贝叶斯公式: p(c|x, y) = (p(x, y|c) * p(c)) / p(x, y) (x, y)表示要分类的特征向量, c表示类别 因为p(x, y),对不同类别的数值是一样的,只需计算p(x, y|c) 和 p(c) p(c)

Lineage逻辑回归分类算法

Lineage逻辑回归分类算法 1.概述 Lineage逻辑回归是一种简单而又效果不错的分类算法 什么是回归:比如说我们有两类数据,各有50十个点组成,当我门把这些点画出来,会有一条线区分这两组数据,我们拟合出这个曲线(因为很有可能是非线性),就是回归.我们通过大量的数据找出这条线,并拟合出这条线的表达式,再有新数据,我们就以这条线为区分来实现分类. 下图是一个数据集的两组数据,中间有一条区分两组数据的线. 显然,只有这种线性可分的数据分布才适合用线性逻辑回归  2.算法思想 Lineage回归

统计学习方法五 逻辑回归分类

逻辑回归分类 1,概念 2,算法流程 3,多分类逻辑回归 4,逻辑回归总结 优点: 1)预测结果是界于0和1之间的概率: 2)可以适用于连续性和类别性自变量: 3)容易使用和解释: 缺点: 1)对模型中自变量多重共线性较为敏感,例如两个高度相关自变量同时放入模型,可能导致较弱的一个自变量回归符号不符合预期,符号被扭转.?需要利用因子分析或者变量聚类分析等手段来选择代表性的自变量,以减少候选变量之间的相关性: 2)预测结果呈"S"型,因此从log(odds)向概率转化的过程是非线性的,在

scikit-learn机器学习(二)逻辑回归进行二分类(垃圾邮件分类),二分类性能指标,画ROC曲线,计算acc,recall,presicion,f1

数据来自UCI机器学习仓库中的垃圾信息数据集 数据可从http://archive.ics.uci.edu/ml/datasets/sms+spam+collection下载 转成csv载入数据 import matplotlib matplotlib.rcParams['font.sans-serif']=[u'simHei'] matplotlib.rcParams['axes.unicode_minus']=False import pandas as pd import numpy as

机器学习二 逻辑回归作业

作业在这,http://speech.ee.ntu.edu.tw/~tlkagk/courses/ML_2016/Lecture/hw2.pdf 是区分spam的. 57维特征,2分类问题.采用逻辑回归方法.但是上述数据集在kaggle中没法下载,于是只能用替代的方法了,下了breast-cancer-wisconsin数据集. 链接在这http://archive.ics.uci.edu/ml/machine-learning-databases/breast-cancer-wisconsin

python sklearn库实现逻辑回归的实例代码

Sklearn简介 Scikit-learn(sklearn)是机器学习中常用的第三方模块,对常用的机器学习方法进行了封装,包括回归(Regression).降维(Dimensionality Reduction).分类(Classfication).聚类(Clustering)等方法.当我们面临机器学习问题时,便可根据下图来选择相应的方法. Sklearn具有以下特点: 简单高效的数据挖掘和数据分析工具 让每个人能够在复杂环境中重复使用 建立NumPy.Scipy.MatPlotLib之上 代