python机器学习-逻辑回归
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作为划分值——因为该点的准确率和召回率都很高。
转至:http://blog.csdn.net/lsldd/article/details/41551797
python机器学习-逻辑回归的更多相关文章
- 吴裕雄 python 机器学习——逻辑回归
import numpy as np import matplotlib.pyplot as plt from matplotlib import cm from mpl_toolkits.mplot ...
- python机器学习——逻辑回归
我们知道感知器算法对于不能完全线性分割的数据是无能为力的,在这一篇将会介绍另一种非常有效的二分类模型--逻辑回归.在分类任务中,它被广泛使用 逻辑回归是一个分类模型,在实现之前我们先介绍几个概念: 几 ...
- 机器学习_线性回归和逻辑回归_案例实战:Python实现逻辑回归与梯度下降策略_项目实战:使用逻辑回归判断信用卡欺诈检测
线性回归: 注:为偏置项,这一项的x的值假设为[1,1,1,1,1....] 注:为使似然函数越大,则需要最小二乘法函数越小越好 线性回归中为什么选用平方和作为误差函数?假设模型结果与测量值 误差满足 ...
- 机器学习---逻辑回归(二)(Machine Learning Logistic Regression II)
在<机器学习---逻辑回归(一)(Machine Learning Logistic Regression I)>一文中,我们讨论了如何用逻辑回归解决二分类问题以及逻辑回归算法的本质.现在 ...
- 机器学习/逻辑回归(logistic regression)/--附python代码
个人分类: 机器学习 本文为吴恩达<机器学习>课程的读书笔记,并用python实现. 前一篇讲了线性回归,这一篇讲逻辑回归,有了上一篇的基础,这一篇的内容会显得比较简单. 逻辑回归(log ...
- 机器学习之使用Python完成逻辑回归
一.任务基础 我们将建立一个逻辑回归模型来预测一个学生是否被大学录取.假设你是一个大学系的管理员,你想根据两次考试的结果来决定每个申请人的录取机会.你有以前的申请人的历史数据,你可以用它作为逻辑回归的 ...
- 机器学习——逻辑回归(Logistic Regression)
1 前言 虽然该机器学习算法名字里面有"回归",但是它其实是个分类算法.取名逻辑回归主要是因为是从线性回归转变而来的. logistic回归,又叫对数几率回归. 2 回归模型 2. ...
- python机器学习《回归 一》
唠嗑唠嗑 依旧是每一次随便讲两句生活小事.表示最近有点懒,可能是快要考试的原因,外加这两天都有笔试和各种面试,让心情变得没那么安静的敲代码,没那么安静的学习算法.搞得第一次和技术总监聊天的时候都不太懂 ...
- 机器学习---逻辑回归(一)(Machine Learning Logistic Regression I)
逻辑回归(Logistic Regression)是一种经典的线性分类算法.逻辑回归虽然叫回归,但是其模型是用来分类的. 让我们先从最简单的二分类问题开始.给定特征向量x=([x1,x2,...,xn ...
随机推荐
- 针对“永恒之蓝”攻击紧急处置手册(蠕虫 WannaCry)
首先确认主机是否被感染 被感染的机器屏幕会显示如下的告知付赎金的界面: 如果主机已被感染: 则将该主机隔离或断网(拔网线).若客户存在该主机备份,则启动备份恢复程序. 如果主机未被感染: 则存在四种方 ...
- Codeforces 863F - Almost Permutation
863F - Almost Permutation 题意 给出每个位置可以放的数字的范围,定义 \(cost = \sum_{i=1}^{n}(cnt(i))^2\) ,其中 \(cnt(i)\) 为 ...
- Codeforces #430 Div2 C
#430 Div2 C 题意 给出一棵带点权的树,每一个节点的答案为从当前节点到根节点路径上所有节点权值的最大公因子(在求最大共因子的时候可以选择把这条路径上的任意一点的权值置为0).对于每一个节点单 ...
- ubuntu 16.04.1 LTS python 3.5.2安装
python 3.5.2安装-----------------------apt-get -y install build-essential checkinstallapt-get install ...
- 21、Django实战第21天:课程章节信息
在课程详情页中,点击"开始学习",就进入到这课程章节信息,这里面包含了两个页面:"章节"和评论 1.把course-video.html(章节).course- ...
- ASP.NET Core 2.2 基础知识(十二) 发送 HTTP 请求
可以注册 IHttpClientFactory 并将其用于配置和创建应用中的 HttpClient 实例. 这能带来以下好处: 提供一个中心位置,用于命名和配置逻辑 HttpClient 实例. 例如 ...
- 日期 function
SELECT SYSDATE, ADD_MONTHS(SYSDATE,), ADD_MONTHS(SYSDATE,), LAST_DAY(SYSDATE), MONTHS_BETWEEN(SYSDAT ...
- 【哈希表】CODEVS1230 元素查找
#include<cstdio> #include<vector> using namespace std; typedef vector<int>::iterat ...
- python3开发进阶-Django框架的中间件的五种用法和逻辑过程
阅读目录 什么是中间件 中间件的执行流程 中间件的逻辑过程 一.什么是中间件? 官方的说法:中间件是一个用来处理Django的请求和响应的框架级别的钩子.它是一个轻量.低级别的插件系统,用于在全局范围 ...
- dd-wrt端口映射不出去的解决办法
本人有一个巴法络的WZR-HP-G450H系统自带的固件不好用,但是随机却带了一个官方定制的DD-WRT,于是刷了去,但是今天在做一个FTP的时候突然无论怎么样映射或是做DMZ都不会出去,终于找到解决 ...