Python机器学习(6)——逻辑回归分类

摘要:
在这一系列文章中,提到了Python机器学习数据拟合和广义线性回归用于数值预测。逻辑回归算法的本质是回归,但它引入了逻辑函数来帮助它进行分类。在实践中,发现逻辑回归在文本分类领域也表现良好。出现S形函数。现在让我们看看洛基回归分类算法在处理此类情绪分类问题时是如何工作的。

在本系列文章中提到过用Python机器学习(2)数据拟合与广义线性回归中提到过回归算法来进行数值预测。逻辑回归算法本质还是回归,只是其引入了逻辑函数来帮助其分类。实践发现,逻辑回归在文本分类领域表现的也很优秀。现在让我们来一探究竟。

1、逻辑函数

假设数据集有n个独立的特征,x1到xn为样本的n个特征。常规的回归算法的目标是拟合出一个多项式函数,使得预测值与真实值的误差最小:

Python机器学习(6)——逻辑回归分类第1张

而我们希望这样的f(x)能够具有很好的逻辑判断性质,最好是能够直接表达具有特征x的样本被分到某类的概率。比如f(x)>0.5的时候能够表示x被分为正类,f(x)<0.5表示分为反类。而且我们希望f(x)总在[0, 1]之间。有这样的函数吗?

sigmoid函数就出现了。这个函数的定义如下:

Python机器学习(6)——逻辑回归分类第2张

先直观的了解一下,sigmoid函数的图像如下所示(来自http://computing.dcu.ie/~humphrys/Notes/Neural/sigmoid.html):

Python机器学习(6)——逻辑回归分类第3张

sigmoid函数具有我们需要的一切优美特性,其定义域在全体实数,值域在[0, 1]之间,并且在0点值为0.5。

那么,如何将f(x)转变为sigmoid函数呢?令p(x)=1为具有特征x的样本被分到类别1的概率,则p(x)/[1-p(x)]被定义为让步比(odds ratio)。引入对数:

Python机器学习(6)——逻辑回归分类第4张

上式很容易就能把p(x)解出来得到下式:

Python机器学习(6)——逻辑回归分类第5张

现在,我们得到了需要的sigmoid函数。接下来只需要和往常的线性回归一样,拟合出该式中n个参数c即可。

2、测试数据

测试数据我们仍然选择康奈尔大学网站的2M影评数据集。

在这个数据集上我们已经测试过KNN分类算法、朴素贝叶斯分类算法。现在我们看看罗辑回归分类算法在处理此类情感分类问题效果如何。

同样的,我们直接读入保存好的movie_data.npy和movie_target.npy以节省时间。

3、代码与分析

逻辑回归的代码如下:

#-*- coding: utf-8 -*-
from matplotlib importpyplot
importscipy as sp
importnumpy as np
from matplotlib importpylab
from sklearn.datasets importload_files
from sklearn.cross_validation importtrain_test_split
from sklearn.feature_extraction.text importCountVectorizer
from sklearn.feature_extraction.text importTfidfVectorizer
from sklearn.naive_bayes importMultinomialNB
from sklearn.metrics importprecision_recall_curve, roc_curve, auc
from sklearn.metrics importclassification_report
from sklearn.linear_model importLogisticRegression
importtime
 
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 inrange(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
Python机器学习(6)——逻辑回归分类第6张

首先注意我们连续测试了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机器学习(6)——逻辑回归分类》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇C# DataGridView显示行号的三种方法 (转载)兼容ie7以上的 placeholder属性下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

R语言实现 朴素贝叶斯算法

library(NLP)library(tm)library(wordcloud)library(RColorBrewer)library(e1071)library(gmodels)setwd('C:/Users/E0399448/Desktop/机器学习')###spam 垃圾短信 ham非垃圾短信 ###数据地址:https://github.com...

python中多线程,多进程,多协程概念及编程上的应用

1, 多线程  线程是进程的一个实体,是CPU进行调度的最小单位,他是比进程更小能独立运行的基本单位。  线程基本不拥有系统资源,只占用一点运行中的资源(如程序计数器,一组寄存器和栈),但是它可以与同属于一个进程的其他线程共享全部的资源。  提高程序的运行速率,上下文切换快,开销比较少,但是不够稳定,容易丢失数据,形成死锁。 直接上代码: impor...

pywinauto客户端自动化---pywinauto初始

目前流行的自动化就是web,app,接口算是目前最主流的测试内容了,那么如果让做安装windows上的客户端自动化呢?是不是一脸懵?今天安静给大家介绍python的第三方库,可以帮助我们做客户端的自动化 pywinauto pywinauto是一组用于自动化Microsoft Windows GUI的python模块。 最简单的是,它允许您将鼠标和键盘操作...

Qt 单元测试

    使用Qtcreator 自带的单元测试工具框架QTestlib进行测试。 一.创建一个单元测试程序 new project->other project ->Qt unit test 二.文件列表: qtestlib/tutorial1/testqstring.cpp qtestlib/tutorial1/tutorial1.pro...

最全Pycharm教程(29)——再探IDE,速成手冊

1、准备工作 (1)确认安装了Python解释器,版本号2.4到3.4均可。 (2)注意Pycharm有两个公布版本号:社区版和专业版,详见Edition Comparison Matrix 2、初始化安装 第一次安装Pycharm时,安装程序会咨询你几个重要问题: (1)是否已经预先保存了设置信息(比如早期版本号的配置信息) (2)许可证信息 (3)选...

python模块win32com中的early-bind与lazy-bind(以Autocad为例)

1.什么是Lazy-bind模式,Early-bind模式? win32com中,Lazy-bind 模式指的是程序事先不知道对象的任何方法和属性,当对象属性,方法被调用时,程序才向对象发出一个询问(query),如果对方法和属性的询问成功,则调用成功,而Early-bind则是指程序事先知道对象的方法,属性。Python 用makepy 来支持early...