Quantcast
Channel: 数据科学中的R和Python
Viewing all 85 articles
Browse latest View live

《R语言与Bioconductor生物信息学应用》已经出版

$
0
0
《R语言与Bioconductor生物信息学应用》一书主要是使用R语言来解决生物信息学问题。主要作者是两位在生物信息学界有极深造诣的科研人士,高山和欧剑虹,这二位的博客地址如下:
http://blog.sciencenet.cn/u/gaoshannankai
http://pgfe.umassmed.edu/ou/
我本人也完成了其中部分章节的写作。此书的特点在于:

  • 从实际课题出发,提出解决这个问题的思路,结合用到的原理或基础知识,但更偏重整个解决问题的框架和流程,选用R这种简单易学但功能强大的语言,把讲解延伸到具体程序代码,让读者100%经历整个课题研究过程。
  • 最大的创新点是:实际课题直接来作者发表的SCI文章,全部都是真枪实弹,不杜撰所谓“实际应用”。国内外尚未见到与SCI文章紧密结合的生物信息书籍。
  • 本书是多名R领域专家(全部都是一线科研工作者)通过互联网联手写作。在前期网上调研的基础上,尽量在本书内突出大多数人普遍关心而又难找相关资料的问题。
  • 所见即所得,学到的知识可以通过简单编程(仅仅代码拷贝粘贴)加以实现,印象深刻,学了不会忘。提出三板斧学习法,让无基础的人也能编程。
  • 本书作者通过QQ群直接面向读者答疑,并且共享了大量的参考资料和习题答案。使用正版书籍的读者都可以入群享受最好的服务。不在书中罗列基础知识凑字数,也不使用光盘,既能减轻读者负担,又能保护环境。



此书详细目录如下

第一章 R基础知识4
1.1什么是R4
1.1.1 R语言的起源4
1.1.2 R语言的特点5
1.1.3 R语言的主要用途7
1.1.4 R语言的应用现状和发展趋势10
1.2R的下载与安装12
1.2.1 主程序的下载与安装12
1.2.2 扩展包的下载与安装14
1.2.3 R语言的集成开发环境16
1.2.4 R主程序和扩展包的管理与升级19
1.3 R语言快速入门21
1.3.1 从哪里入手开始学习R21
1.3.2 三板斧搞定R语言21
1.3.3 一个例子来说明三板斧22
1.4 一些简单的语法知识23
1.4.1 什么是编程23
1.4.2 变量23
1.4.3 函数24
1.4.4 综合案例25
1.5 本章源代码详解及小结25
1.5.1 例1-125
1.5.2 例1-226
1.5.3 例1-327
1.5.4 例1-428
1.5.5 小结30
参考文献:31
第二章 生物信息学基础知识4
2.1中心法则-生物信息流4
2.1.1 生物大分子4
2.1.2 中心法则7
2.1.3 基因组、转录组和蛋白质组8
2.1.4 非编码RNA和microRNA9
2.2测序与序列分析10
2.2.1 DNA测序技术10
2.2.2 第二代测序技术的应用领域12
2.2.3 序列分析13
2.2.4 序列比对和相似性搜索14
2.2.5 分子进化和系统发生树15
2.3基因表达分析17
2.3.1基因表达的检测方法17
2.3.2 基因表达数据分析18
2.3.3基因表达差异的显著性分析19
2.3.4基因本体论分析20
2.3.5通路分析22
2.4注释、统计与可视化22
2.4.1 注释与ID映射23
2.4.2 统计与可视化23
参考文献:24
第三章 R在生物信息学中的简单应用2
3.1 一个序列分析课题2
3.1.1 课题背景2
3.1.2 研究目的与实验设计2
3.1.3 数据获取与处理流程3
3.2 用R包(非bioconductor)实现课题4
3.2.1 定义全部函数(例3-1)4
3.2.2 课题实现13
3.2.3 源代码详解与小结16
3.3 用R包(bioconductor)实现课题一21
3.3.1 重新设计数据处理流程和全部函数(例3-2)21
3.3.2 课题实现25
3.3.3源代码详解与小结26
3.4 用R包(bioconductor)实现课题二26
3.41 重新设计数据处理流程和全部函数(例3-3)26
3.4.2 课题实现35
3.4.3源代码详解与小结35
第四章 Bioconductor简介1
4.1 什么是Bioconductor2
4.1.1 Bioconductor的起源2
4.1.2 Bioconductor主要特点2
4.2 Bioconductor包的分类介绍5
4.2.1 三大板块分类介绍5
4.2.2 软件包的进一步介绍6
4.2.3 按照应用领域分类9
4.3 从R到Bioconductor的跨越:Biostrings, BiomaRt以及AnnotationDbi包12
4.3.1 应用Biostrings处理生物序列13
4.3.2 应用BiomaRt获取实验数据与注释信息21
4.3.3 应用AnnotationDbi生成注释包27
参考文献:32
第五章Bioconductor分析基因芯片数据
5.1快速入门2
5.2基因芯片基础知识3
5.2.1 探针组3
5.2.2 主要的芯片文件格式4
5.3基因芯片数据预处理5
5.3.1 数据输入6
5.3.2 质量控制7
5.3.3 背景校正、标准化和汇总17
5.3.4 预处理的一体化算法20
5.4基因芯片数据分析24
5.4.1 选取差异表达基因24
5.4.2 注释27
5.4.3 统计分析及可视化28
5.5芯片处理实际课题一39
5.5.1 课题背景39
5.5.2 数据集与预处理40
5.5.3 R程序与代码讲解41
5.6芯片处理实际课题二42
5.6.1 课题背景42
5.6.2 数据集与处理过程43
5.6.3 R程序与代码讲解43
5.7芯片处理实际课题三44
5.7.1 课题背景44
5.7.2 数据集与处理过程45
5.7.3 R程序与代码讲解46
参考文献:48
第六章 Bioconductor分析RNA-seq数据4
6.1示例课题介绍4
6.1.1课题背景4
6.1.2数据集和处理过程4
6.2高通量测序基础知识5
6.2.1高通量测序原理5
6.2.2测序的质量分数9
6.2.3高通量测序文件格式12
6.3 RNA-seq技术的特点16
6.3.1 RNA-seq对芯片的优势16
6.3.2 RNA-seq存在的问题17
6.4 RNA-seq数据预处理18
6.4.1 质量控制18
6.4.2 读段清理22
6.4.3 转录组组装25
6.4.4 转录组定量和标准化25
6.4.5 线性相关系数27
6.5 RNA-seq数据分析28
6.5.1基因表达差异的显著性分析28
6.5.2 RNA-seq数据的其它分析31
参考文献:31
第七章 R的高级语法与如何创建R包
7.1 R的高级语法2
7.1.1 数据类型及相互转换2
7.1.2 向量运算6
7.1.3 函数8
7.1.4 循环与条件9
7.1.5 输入输出11
7.1.6 对象和类12
7.2 创建及发布自己的R/Bioconductor包14
7.2.1 在Windows下创建和发布R包14
7.2.2 在Linux下创建和发布包25
7.3 R包结构26
7.3.1 R的源代码包27
7.3.2 R的二进制包28
参考文献:29

附录A 进一步学习的资源
附录B R常用函数
附录C R的内存管理和帮助系统

购买方式:

支付宝账号: pibobo@126.com 何静
留言:姓名+R语言书+册数
定书后,请将邮寄地址(一定要邮编)和电话发以上电子邮件
电子邮件题目是买R语言书,内容就是姓名+邮寄地址+电话
本书定价58元,群内读者预定50元(包快递费);团购5本以上45元(包快递费);50本40元(包快递费);
如果大学指定为教材,我可以提供更多材料,长期合作,打造精品课程

用模拟来理解混合效应模型之二:Random Intercept and slope model

$
0
0
在之前的这篇文章中,混合效应模型的意义已经说的比较清楚了,简言之,样本中不能穷尽总体level的变量都是随机效应。也可以这么认为,会影响目标变量,但我们不关心的解释变量都是随机效应。之前文章的随机效应只影响模型的intercept,那么也会有影响slope的随机效应。我们先来看一下这种混合效应模型的假设,再用假设来生成数据,并建模和绘图。

Yij = b0 + (b1+si)*Xij +  bi + eij 

* b0: fixed intercept
* b1: fixed slope
* X: fixed effect
* bi: random effect(influence intercept)
* eij: noise
* si: random effect(influence slope)


从模拟角度理解混合模型第三:广义和加性混合模型(完)

$
0
0
之前讨论的混合效应模型均是最常见的线性模型基础上的扩展。但在实际使用中会发现用到其它情况,例如要处理分类问题,需要logistic回归模型。再比如说线性关系不存在,需要用加性模型来处理复杂的非线性关系。这两种模型分别归于广义线性模型和加性模型。那么在这两种模型基础上再考虑解释变量的混合效应,要分别衍生出广义混合效应模型和加性混合效应模型。在R中lme4包可以处理广义混合效应模型,而mgcv包可以处理加性混合效应模型。在之前文章一样,我们先模拟这两种数据,再分别进行建模。代码来源于《Regress by simulation》

一个简单排队论问题的python实现

$
0
0
一个诊所只有一个医生,病人到来的时间是随机的,从早上九点开始,服从一个时间参数为10min的泊松过程,即每个人到来的时间服从独立同分布的指数分布,其期望为10min,每个病人到来之后,下一个病人到来的时间服从独立同分布的指数分布,期望为10min。当一个病人到来以后,将等待直到医生有空。每个医生在每个病人上花费的时间是一个随机变量,在5min到10min之间均匀分布。诊所从下午4点不再接受新病人,最后一个病人走后,诊所关门。
(1)模拟一天的病人到来和医生接诊情况,有多少个病人来诊所看病?其中有多少病人需要等待医生?平均等待时间是多少?
(2)模拟100天的情况,给出上面各个数值的分布

理解MCMC

$
0
0
在贝叶斯统计中,经常需要计算后验概率,概率计算就涉及到积分问题。一种解决方法是用解析式得到后验概率直接计算,另一种是利用统计模拟来计算近似值。 考虑一个简单问题,我们对一个硬币反复投掷,对于出现正面的概率theta先主观设定为一个均匀分布,然后实际投掷14次,得到11次正面,要根据这个信息data来更新后验概率。下面用统计模拟来计算。 因为实际的数据表现是正面出现次数较多,所以后验概率会做出相应调整。这个统计模拟的例子非常简单,容易实施。但如果涉及的参数个数很多时,计算量就会非常大。此时就可以尝试另一种统计模拟方法,即MCMC(Markov chain Monte Carlo)。我们先考虑一个思想实验:

一个岛国下面有7个岛,各岛人数不一样。旅行者已经在其中一个岛上,他要去各岛游历,准备在人口多的岛上游玩的时间长一些。但他并不知道具体的人口数,可以询问本岛和相邻岛的市长。他的旅行计划如下:
首先每天会扔一枚硬币,如果正面向上,就计划去左岛,如果反面向上,就计划去右岛。
然后比较当前所在岛人口数a和计划去的目的岛人口数b,若b小于a,则实际去的概率为b/a,若b大于a,则实际去的概率为1。所以实际去的概率归纳为min(1,b/a)。
就这样,旅行者每天不断的在不同岛间移动,最终他在各岛上呆的时间之比,就会收敛为各岛人口之比,这样就通过一个随机模拟得到了一个概率分布。



参考资料:Doing Bayesian Data Analysis with R

python和ggplot2

$
0
0
python有个非常强大的工具,那就是ipython notebook。用户可以在浏览器中直接编写python脚本,并立即得到输出结果。这类文档可以存为ipynb分享给其它人,也可以存为html直接放在网站上,非常有利于学习交流。

在R语言方面就缺乏这类工具,不过ipython有一种“魔法”,可以在ipython中运行其它语言。在数据分析时,可以将python和R代码混编,充分利用两种语言的优势。以可视化为例,R的ggplot2图形语法可谓是独步江湖,python中虽然已经有不少优秀的绘图库。但总不及ggplot2用得习惯。下面的小例子就是示范在ipython notebook中画ggplot2。

首先是用numpy库建立两个向量,再用%load_ext建立python和R的连接机制。之后在ipython notebook的一个cell里面就可以使用%R后面接R代码行,或者使用%%R使用代码块。如果要在R代码块中读入python的对象,需要使用-i参数。

其它例子可以参见这个,python中也有人复制了ggplot语法,可参见这里

python读入csv的三种方式

$
0
0
读数据到python有好几种方法,我们以读取iris.csv为例,将其中的数值部分提取出来。第一种方法是列表理解,文件读取到lines之后用一个嵌套的列表理解就可以将数值存为一个list。第二种方法是使用numpy库,它内带的loadtxt函数,读取的数据都认作是字符串,所以在第二行取我们需要的部分,并转为数值array。第三种方法是使用pandas库,它内带read_csv函数,读取数据会自动判断数值还是字符串,而且会自动保存好变量名,只需要用ix方法就可以类似R一样取出需要的子集,它存为dataframe对象。

这三种方法中最后一种最简单,不过花费时间比较长一点,第一种最麻烦,不过用时最短。这个可以通过ipython中的magic函数%%timeit来看。

python的数据科学资源

$
0
0
python和R是数据科学家手中两种最常用的工具,R已经介绍的太多了,后续我们来玩玩python吧。从出身来看,R是统计学家写的,python是计算机科学家写的,两者的出生背景不一样,随着数据爆发,python也慢慢发展,逐渐在数据科学中找到了一席之地。

包:
python也有非常多的扩展包,不过用于数据分析的并不象R那么品种繁多。常用的:
numpy:提供最基本的数值计算,使向量化计算成为可能。
scipy:提供了包括最优化在内的科学计算函数,不用自己写啦。
pandas:提供了类似dataframe的数据结构,处理表格数据非常方便。
matplotlib:画图必备,但用起来感觉不如ggplot2啊。
statsmodel:提供包括回归、检验等多种统计分析函数,python也能干R的活。
sklearn:数据挖掘必备,各种函数非常丰富,文档齐全,看得出CS出品就是不一样啊。

书:
python的数据方面书还不算很多,不过很有CS的味道,就是用show me the code,公式不多,这点我很喜欢。

现有可以找到的书基本上分为三类,一类是用基本语法实现统计分析和科学计算,例如下面的:
Think Stats
Think Bayes
A Primer on Scientific Programming with Python

另一类是以介绍一些包为目的,带有一些案例,例如:
Introduction to Python for Econometrics, Statistics and Data Analysis
numpy begin guide
Python for Data Analysis
matplotlib cookbook
Learning scikit learn Machine Learning
python text processing with nltk 2.0 cookbook
Social Network Analysis for Startups

最后一类是专门讲数据挖掘、机器学习的书:
programming collective intelligence:不用numpy包,只用基本语法实现一些算法
Machine Learning in Action:使用了numpy包,介绍了如何实现大部分算法
Machine learning an algorithmic perspective:体系非常完善,而且示例代码中使用了类

Notebook:
python的一大妙处就是ipython notebook,它可以把代码及其结果都存在一个网页上,方便分享学习。网上有非常多的notebook,其中成体系而又精彩的有下面三个:
https://github.com/datadave/GADS9-NYC-Spring2014-Lectures
http://blog.yhathq.com/posts/data-science-in-python-tutorial.html
http://slendermeans.org/pages/will-it-python.html

更多资源,请参见github上的一个列表
https://github.com/jonathan-bower/DataScienceResources
have fun!

pandas包绘图函数初步

$
0
0
python中绘图有很多包来支持,但总是觉得没有ggplot2有用。尽管如此,在探索数据时还是需要画些图来观察数据。尝试了很多方式,感觉比较方便的还是利用pandas包的附带绘图函数,可以做一些初步的探索性画图。它本身还是对matplotlib包的一个封装。下面的代码是画一些基本的图形,如线图,直方图,条形图,散点图。散点图映射点的color时要注意,不能直接把字符串进行映射,需要用scatter函数,并且需要用数值来映射到颜色。
In [6]:
%pylabinline
importpandasaspd
df=pd.read_csv('iris.csv')
df.head()

Populating the interactive namespace from numpy and matplotlib

Out[6]:
Sepal_LengthSepal_WidthPetal_LengthPetal_WidthSpecies
0 5.1 3.5 1.4 0.2 setosa
1 4.9 3.0 1.4 0.2 setosa
2 4.7 3.2 1.3 0.2 setosa
3 4.6 3.1 1.5 0.2 setosa
4 5.0 3.6 1.4 0.2 setosa
In [8]:
df.Sepal_Length.hist(by=df['Species'])
Out[8]:

array([[,
],
[,
]], dtype=object)
In [9]:
df.ix[:,:4].plot(kind='line')
Out[9]:


In [10]:
df1=df.groupby('Species').mean()
df1.plot(kind='bar',stacked=True)
Out[10]:


In [12]:
df.ix[:,:4].plot(kind='scatter',x='Sepal_Length',y='Sepal_Width',by=df['Species'])
Out[12]:


In [13]:
scatter(df.Petal_Length,df.Petal_Width,c=tile([1,2,3],50))
Out[13]:


In []:

python中的线性回归

$
0
0

python中的线性回归

对于统计模型来说,最简单也最经典的模型要数线性回归模型,它可以满足统计建模的所有标准流程,并且适用范围也非常广。R里面是使用lm函数来做回归,而在python里面有几个包都提供了这一功能,首先介绍sklearn包中的回归函数,然后介绍statsmodels包中的回归函数。前者适合于机器学习中的预测,不需要太多中间结果的观察。后者适合于分析,需要对中间结果,例如系数,残差以及效果做判断的时候使用。

  • 第一步:加载各种包
In [228]:
%pylabinline
importpandasaspd
importmatplotlib.pylabasply
importstatsmodels.apiassm
fromsklearn.linear_modelimportLinearRegression
fromsklearn.metricsimportmean_squared_error
importstatsmodels.formula.apiassm

Populating the interactive namespace from numpy and matplotlib

  • 第二步:读取数据并画图
In [222]:
df=pd.read_csv('iris.csv')
lmdf=df[['Petal_Length','Petal_Width']]
lmdf.plot(kind='scatter',x=0,y=1)
Out[222]:

<matplotlib.axes.AxesSubplot at 0x119b1f110>
  • 第三步:使用sklearn包中的函数进行回归
In [230]:
# 建立回归对象
linear_sk=LinearRegression()
X=lmdf[['Petal_Length']]
y=lmdf['Petal_Width']
linear_sk.fit(X,y)
linear_fit.intercept_,linear_fit.coef_# coef
Out[230]:

(-0.36651404521672837, array([ 0.41641913]))
In [226]:
linear_fit.score(X,y)# R2
Out[226]:

0.92690122792200369
In [214]:
yhat=linear_fit.predict(X=lmdf[['Petal_Length']])
mean_squared_error(lmdf['Petal_Width'],yhat)#MSE
Out[214]:

0.04228994631948424
  • 第四步:观察回归效果
In [196]:
plt.scatter(lmdf['Petal_Length'],lmdf['Petal_Width'])
plt.plot(lmdf['Petal_Length'],yhat)
Out[196]:

[<matplotlib.lines.Line2D at 0x11991a790>]
  • 使用statmodels包的过程和结果,可以使用和R类似的公式实施
In [229]:
linear_model=sm.ols(formula='Petal_Width ~ Petal_Length',data=lmdf)
results=linear_model.fit()
results.summary()
Out[229]:
OLS Regression Results
Dep. Variable:Petal_Width R-squared: 0.927
Model:OLS Adj. R-squared: 0.926
Method:Least Squares F-statistic: 1877.
Date:Sat, 18 Oct 2014 Prob (F-statistic):5.78e-86
Time:18:00:43 Log-Likelihood: 24.400
No. Observations: 150 AIC: -44.80
Df Residuals: 148 BIC: -38.78
Df Model: 1
coefstd errtP>|t|[95.0% Conf. Int.]
Intercept -0.3665 0.040 -9.188 0.000 -0.445 -0.288
Petal_Length 0.4164 0.010 43.320 0.000 0.397 0.435
Omnibus: 5.498 Durbin-Watson: 1.461
Prob(Omnibus): 0.064 Jarque-Bera (JB): 5.217
Skew: 0.353 Prob(JB): 0.0736
Kurtosis: 3.579 Cond. No. 10.3

ipython notebook server配置及数据库连接

$
0
0
ipython notebook是个好东西,它的另一优点就是可以在本地用浏览器,去远程连接服务器的计算资源,就类似于Rstudio公司推出的rstudio server的功能。下面记录一下配置步骤:

第一步:服务器上安装ipython系列,推荐是安装anaconda套件,非常方便。安装完毕后将路径加在PATH环境变量中。

第二步:设置notebook server。用在ipython中如下命令设置密码:
from IPython.lib import passwd
passwd()
记下生成的字符串。

第三步:创建一个ipython配置文件,比如起名叫myserver
ipython profile create myserver
vim ~/.ipython/profile_myserver/ipython_notebook_config.py
编辑文件,加入下面几项:
c = get_config()
c.IPKernelApp.pylab = 'inline' #启动inline模式
c.NotebookApp.ip = '*'
c.NotebookApp.open_browser = False
c.NotebookApp.password = u'sha1:yourhashedpassword' #把第二步的密码考进来
c.NotebookApp.port = 9999   #自己设一个端口号

第四步:启动服务
ipython notebook --profile=myserver

最后你就可以在本地浏览器中登陆,输入密码,即可进入ipython notebook。

因为公司的数据库是Oracle的,所以下面的例子没有包括其它的数据库,不过方法类似。

最原始的连接数据库方式是cx_Oracle包,使用pip安装后import进来即可调用,出来的结果是一个list。
import cx_Oracle
conn = cx_Oracle.connect('user','password','ip/dbname')
cr = conn.cursor()
cr.execute('select * from table')
result = cr.fetchall()
cr.close()
conn.close()

对于数据分析而言,方便的调用方式是通过pandas封装的sql接口来做,这样出来的数据直接就是一个dataframe。使用它有几个前提要求
1 安装oracle瘦客户端
2 设置好环境变量,例如ORACLE_HOME和LD_LIBRARY_PATH
3 设置好tnsnames.ora
4 安装sqlalchemy包

设置好以后使用如下例:
import pandas as pd
from sqlalchemy import create_engine
engine = create_engine('oracle://user:password@service_name')
df = pd.read_sql_query('select * from table', engine)

python贝叶斯文分类识别垃圾短信

$
0
0

Python贝叶斯文本分类识别垃圾短信

1、读取数据,type表示短信类别,text是短信内容

In [17]:
%pylabinline
importpandasaspd
importnumpyasnp
df=pd.read_csv('sms_spam.csv')
df.head()

Populating the interactive namespace from numpy and matplotlib

Out[17]:
typetext
0 ham Hope you are having a good week. Just checking in
1 ham K..give back my thanks.
2 ham Am also doing in cbe only. But have to pay.
3 spam complimentary 4 STAR Ibiza Holiday or £10,000 ...
4 spam okmail: Dear Dave this is your final notice to...

2、使用sklearn包转换文本为结构化数据,将矩阵分切为训练集和检验集

CountVectorizer负责将文档转为文档词频矩阵,重要的参数有如下几个:

  • ngram_range:ngrame频率范围,如果需要识别词组的话需要设置
  • stop_words:停词列表
  • token_pattern:分词的字符模式,默认空格
  • max_df:词频上限,超过该值的词项不作为特征,即过滤常用词
  • min_df:词频下限,低于该值的词项不作为特征
  • max_features:只选择词频较高的几个作为特征
In [18]:
fromsklearn.feature_extraction.textimportCountVectorizer
vectorizer=CountVectorizer(ngram_range=(1,1),stop_words='english',lowercase=True,min_df=1)
X=vectorizer.fit_transform(df.text)
y=(df.type=='spam').values.astype(int)

TfidfVectorizer则可以计算tfidf值,而非仅仅文档词频矩阵

In [19]:
fromsklearn.feature_extraction.textimportTfidfVectorizer
vectorizer=TfidfVectorizer(ngram_range=(1,1),stop_words='english',lowercase=True,min_df=1)
X=vectorizer.fit_transform(df.text)

3、将数据切分为train和test

In [20]:
fromsklearn.cross_validationimporttrain_test_split
xtrain,xtest,ytrain,ytest=train_test_split(X,y)

4、使用贝叶斯分类器进行训练

  • 重要的参数alpha用于设置平滑系数
In [21]:
fromsklearn.naive_bayesimportMultinomialNB
clf=MultinomialNB(alpha=1).fit(xtrain,ytrain)

5、观察分类效果

In [22]:
training_accuracy=clf.score(xtrain,ytrain)
test_accuracy=clf.score(xtest,ytest)
print"训练集准确率: {:.2f}".format(training_accuracy)
print"检验集准确率: {:.2f}".format(test_accuracy)

训练集准确率: 0.98
检验集准确率: 0.97

6、使用CV选择最优参数,参数为0.2

In [23]:
fromsklearnimportsvm,grid_search
nb=MultinomialNB()
parameters={'alpha':np.linspace(0,10,101)}
clf=grid_search.GridSearchCV(nb,parameters)
clf.fit(X,y)
Out[23]:

GridSearchCV(cv=None,
estimator=MultinomialNB(alpha=1.0, class_prior=None, fit_prior=True),
fit_params={}, iid=True, loss_func=None, n_jobs=1,
param_grid={'alpha': array([ 0. , 0.1, ..., 9.9, 10. ])},
pre_dispatch='2*n_jobs', refit=True, score_func=None, scoring=None,
verbose=0)
In [100]:
print"最佳参数:  {:.3f}".format(clf.best_params_['alpha'])
print"最佳准确率: {:.3f}".format(clf.best_score_)

最佳参数: 0.200
最佳准确率: 0.984

In [62]:
accuracy=[t[1]fortinclf.grid_scores_]
para=[t[0]['alpha']fortinclf.grid_scores_]
In [94]:
importmatplotlib.pylabasplt
accuracy=[t[1]fortinclf.grid_scores_]
para=[t[0]['alpha']fortinclf.grid_scores_]
plt.plot(para,accuracy,lw=3)
Out[94]:

[]

python的决策树和随机森林

$
0
0

Python的决策树和随机森林

决策树模型是一种简单易用的非参数分类器。它不需要对数据有任何的先验假设,计算速度较快,结果容易解释,而且稳健性强,对噪声数据和缺失数据不敏感。下面示范用titanic中的数据集为做决策树分类,目标变量为survive。

第一步:读取数据

In [2]:
%pylabinline
importpandasaspd
df=pd.read_csv('titanic.csv')
df.head()
#df.info()

Populating the interactive namespace from numpy and matplotlib

Out[2]:
survivedpclassnamesexagesibspparchticketfarecabinembarked
0 0 3 Braund, Mr. Owen Harris male 22 1 0 A/5 21171 7.2500 NaN S
1 1 1 Cumings, Mrs. John Bradley (Florence Briggs Th... female 38 1 0 PC 17599 71.2833 C85 C
2 1 3 Heikkinen, Miss. Laina female 26 0 0 STON/O2. 3101282 7.9250 NaN S
3 1 1 Futrelle, Mrs. Jacques Heath (Lily May Peel) female 35 1 0 113803 53.1000 C123 S
4 0 3 Allen, Mr. William Henry male 35 0 0 373450 8.0500 NaN S

第二步:数据整理

  • 只取出三个自变量
  • 将将age缺失值进行补全
  • 将pclass变量转为三个哑变量
  • 将sex转为0-1变量
In [3]:
subdf=df[['pclass','sex','age']]
y=df.survived
# sklearn中的Imputer也可以
age=subdf['age'].fillna(value=subdf.age.mean())
# sklearn OneHotEncoder也可以
pclass=pd.get_dummies(subdf['pclass'],prefix='pclass')
sex=(subdf['sex']=='male').astype('int')
X=pd.concat([pclass,age,sex],axis=1)
X.head()
Out[3]:
pclass_1pclass_2pclass_3agesex
0 0 0 1 22 1
1 1 0 0 38 0
2 0 0 1 26 0
3 1 0 0 35 0
4 0 0 1 35 1

第三步:建模

  • 数据切分为train和test
In [4]:
fromsklearn.cross_validationimporttrain_test_split
X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.25,random_state=33)
  • 使用决策树观察在检验集表现
In [6]:
fromsklearnimporttree
clf=tree.DecisionTreeClassifier(criterion='entropy',max_depth=3,min_samples_leaf=5)
clf=clf.fit(X_train,y_train)
print"准确率为:{:.2f}".format(clf.score(X_test,y_test))

准确率为:0.83

  • 观察各变量的重要性
In [7]:
clf.feature_importances_
Out[7]:

array([ 0.08398076, 0. , 0.23320717, 0.10534824, 0.57746383])
  • 使用更多指标来评估模型
In [17]:
fromsklearnimportmetrics
defmeasure_performance(X,y,clf,show_accuracy=True,
show_classification_report=True,
show_confusion_matrix=True):
y_pred=clf.predict(X)
ifshow_accuracy:
print"Accuracy:{0:.3f}".format(metrics.accuracy_score(y,y_pred)),"\n"

ifshow_classification_report:
print"Classification report"
printmetrics.classification_report(y,y_pred),"\n"

ifshow_confusion_matrix:
print"Confusion matrix"
printmetrics.confusion_matrix(y,y_pred),"\n"

measure_performance(X_test,y_test,clf,show_classification_report=True,show_confusion_matrix=True)

Accuracy:0.834

Classification report
precision recall f1-score support

0 0.85 0.88 0.86 134
1 0.81 0.76 0.79 89

avg / total 0.83 0.83 0.83 223


Confusion matrix
[[118 16]
[ 21 68]]


  • 使用交叉验证来评估模型
In [8]:
fromsklearnimportcross_validation
scores1=cross_validation.cross_val_score(clf,X,y,cv=10)
scores1
Out[8]:

array([ 0.82222222, 0.82222222, 0.7752809 , 0.87640449, 0.82022472,
0.76404494, 0.7752809 , 0.76404494, 0.83146067, 0.78409091])

第三步:决策树画图

  • 需要安装GraphViz'
In [9]:
importpydot,StringIO
dot_data=StringIO.StringIO()
In [14]:
tree.export_graphviz(clf,out_file=dot_data,feature_names=['age','sex','1st_class','2nd_class','3rd_class'])
dot_data.getvalue()
pydot.graph_from_dot_data(dot_data.getvalue())
graph=pydot.graph_from_dot_data(dot_data.getvalue())
#graph.write_png('titanic.png')
#from IPython.core.display import Image
#Image(filename='titanic.png')

第四步:使用随机森林进行比较

In [11]:
fromsklearn.ensembleimportRandomForestClassifier
clf2=RandomForestClassifier(n_estimators=1000,random_state=33)
clf2=clf2.fit(X_train,y_train)
scores2=cross_validation.cross_val_score(clf2,X,y,cv=10)
clf2.feature_importances_
Out[11]:

array([ 0.05526809, 0.02266161, 0.08156048, 0.46552672, 0.37498309])
In [12]:
scores2.mean(),scores1.mean()
Out[12]:

(0.81262938372488946, 0.80352769265690616)

社会科学的代码和数据工作指南

$
0
0
偶尔在知乎上看到有人推荐了一本小册子:《Code and Data for the Social Sciences:A Practitioner’s Guide》。专门讲非计算机背景的分析研究人员如何归整自己的分析代码和研究数据。看下来还是总结得非常好,很有益于创建高效的工作规范和流程。将其中一些基本的规则摘要如下:

Automate
(A) Automate everything that can be automated.
(B) Write a single script that executes all code from beginning to end.

Version Control
(A) Store code and data under version control.
(B) Run the whole directory before checking it back in.

Directories
(A) Separate directories by function.
(B) Separate files into inputs and outputs.
(C) Make directories portable.

\input CSV
\code R, SQL
\output pic, ppt
\temp
readme.txt

Keys
(A) Store cleaned data in tables with unique, non-missing keys.
(B) Keep data normalized as far into your code pipeline as you can

Abstraction
(A) Abstract to eliminate redundancy.
(B) Abstract to improve clarity.
(C) Otherwise, don't abstract.

Documentation
(A) Don't write documentation you will not maintain.
(B) Code should be self-documenting.

Management
(A) Manage tasks with a task management system.
(B) E-mail is not a task management system.

python中的主成分分析


小试python的网页数据抓取

seaborn画图初步

德国坦克问题的简单解答

$
0
0
德国坦克问题是一个经典的统计估计问题,不清楚的同学可以自行google。最简单的思路是将坦克总数X看做是一个X面的骰子。我们对骰子的面数不确定,但可以根据出现的点数来对X的取值分布做推断。推断方法就是贝叶斯方法。

假设我们对坦克总数有[500, 1000, 1500, 2000, 3000]五种可能的估计,先验估计为均匀分布,之后我们观察到战场上坦克编号出现有[4, 180, 75, 1007, 1003, 1500]

尝试估计这五种可能的后验概率分布如下:
500: 0.0
1000: 0.0
1500: 0.837
2000: 0.149
3000: 0.013

python 代码如下:

用pymc实施MCMC

用深度学习做手写识别

Viewing all 85 articles
Browse latest View live