【Kaggle】用随机森林分类算法解决Biologial Response问题

Kaggle搞起来

Kaggle比赛多依靠机器来自动处理,机器学习几乎是必须要的技能。开始搞Kaggle需要的机器学习技能并不深入,只是需要对于机器学习的常见几个方法有基本了解即可,比如说对于一个问题,你可以认识到它是个classification的问题啊还是regression的问题啊,为什么机器可以根据你输入的一个矩阵来算出来分类结果啊。
其实有时候真的在于是不是愿意踏出那一步,一旦踏出了那一步,做与不做真的是天壤之别。
hacker的方式就是通过不断的尝试来学习,所以,搞机器学习,不实践,等于屁事没做。

Biological Response比赛

题目描述

根据分子的化学性质预测生物反应
这个比赛给出了csv格式的数据,每一行对应一个分子,第一列描述了实际的生物反应(分别为类别0和类别1),其余的列是通过分子的特性(比如样本大小、形状和元素构成等)得到的分子描述子,该描述子已经被归一化处理了。

第一次提交

该比赛是一个二元分类问题,其数据经过了特征提取和选择,使得预处理工作更加简单,虽然这个比赛已经结束了,但仍然可以提交解决方案,这样就可以看到你和世界上最好的数据科学家的比较了。
这里,我使用随机森林的算法来进行训练和预测,虽然随机森林是一个比较高级的分类器,但是由于sklearn库,这让该算法的使用变得很简单。
这里我们首先不需要知道这些技术蕴含的数学原理是什么,做实验让我们了解这个算法或工具的工作状况。下面就是运行这个程序,然后将生成的结果提交上Kaggle。

from sklearn.ensemble import RandomForestClassifier
from numpy import genfromtxt, savetxt

def main():
    #create the training & test sets, skipping the header row with [1:]
    dataset = genfromtxt(open('Data/train.csv','r'), delimiter=',', dtype='f8')[1:]    
    target = [x[0] for x in dataset]
    train = [x[1:] for x in dataset]
    test = genfromtxt(open('Data/test.csv','r'), delimiter=',', dtype='f8')[1:]

    #create and train the random forest
    #multi-core CPUs can use: rf = RandomForestClassifier(n_estimators=100, n_jobs=2)
    rf = RandomForestClassifier(n_estimators=100)
    rf.fit(train, target)
    predicted_probs = [[index + 1, x[1]] for index, x in enumerate(rf.predict_proba(test))]

    savetxt('Data/submission.csv', predicted_probs, delimiter=',', fmt='%d,%f', 
            header='MoleculeId,PredictedProbability', comments = '')

if __name__=="__main__":
    main()

评估和交叉检验

如果我们要使用梯度树提升(Gradient Tree Boosting)的方法来代替随机森林算法,或者用更加简单的线性模型。
在这个过程中,从sklearn导入方法并生成提交文件是很简单的,但是如何比较其性能成为了关键问题。如果对模型作了一个调整就提交一次是不实际的。所以我们要依次做两件事:

定义评估函数
交叉检验

你总是需要一些评估函数来决定你的模型执行效果好坏。理想上,这些评估函数最好和Kaggle的评估度量是一样的。在这个问题的比赛中,评估度量是log-loss函数。

import scipy as sp
def llfun(act, pred):
    epsilon = 1e-15
    pred = sp.maximum(epsilon, pred)
    pred = sp.minimum(1-epsilon, pred)
    ll = sum(act*sp.log(pred) + sp.subtract(1,act)*sp.log(sp.subtract(1,pred)))
    ll = ll * -1.0/len(act)
    return ll

最后,我们需要数据来测试我们的模型。当我们第一次提交结果的时候,Kaggle使用log-loss函数比较了你的预测结果和真实世界的结果,没有测试数据的情况下,我们该如何在本地测试我们的模型呢?
交叉验证是一种解决的办法。

交叉检验是一种简单的技术,其使用训练数据的一部分数据进行测试。在sklearn中,它构建了生成交叉验证集的一套工具。
在下面的代码中,构建了10个交叉验证集合,其中将10%的训练数据储备下来,测试算法结果。

from sklearn.ensemble import RandomForestClassifier
from sklearn import cross_validation
import logloss
import numpy as np

def main():
    #read in  data, parse into training and target sets
    dataset = np.genfromtxt(open('Data/train.csv','r'), delimiter=',', dtype='f8')[1:]    
    target = np.array([x[0] for x in dataset])
    train = np.array([x[1:] for x in dataset])

    #In this case we'll use a random forest, but this could be any classifier
    cfr = RandomForestClassifier(n_estimators=100)

    #Simple K-Fold cross validation. 5 folds.
    cv = cross_validation.KFold(len(train), k=5, indices=False)

    #iterate through the training and test cross validation segments and
    #run the classifier on each one, aggregating the results into a list
    results = []
    for traincv, testcv in cv:
        probas = cfr.fit(train[traincv], target[traincv]).predict_proba(train[testcv])
        results.append( logloss.llfun(target[testcv], [x[1] for x in probas]) )

    #print out the mean of the cross-validated results
    print "Results: " + str( np.array(results).mean() )

if __name__=="__main__":
    main()

这里值得一提的是,交叉验证的结果可能和Kaggle给你的打分不一致,这是因为:

随机森林的随机成分会使每次结果不一样;
实际的测试数据有可能偏离训练数据,尤其是数据量小的情况下,训练数据可能无法体现数据分布的整体特征;
验证方式的不同实现也会使得结果有差异

补充:Linux下python科学计算环境的安装

用python进行科学计算主要需要三个包:numpy、scipy、scikit-learn、matplotlib。

安装scipy

可以下载python的包管理工具pip进行安装,但是在安装scipy的过程中遇到一点问题。
Scipy需要LAPACK和BLAS的支持。
这两个数学库是很多linux科学计算软件需要调用的。
LAPACK,其名为Linear Algebra PACKage的缩写,是用Fortran语言编写的用于数值计算的函数集。它提供了丰富的工具函数,可用于诸如解多元线性方程、线性系统方程组的最小平方解、计算特征向量、用于计算矩阵QR分解的Householder转换、以及奇异值分解等问题。
BLAS,全称Basic Linear Algebra Subprograms,即基础线性代数子程序库,里面拥有大量已经编写好的关于线性代数运算的程序。
安装LAPACK和BLAS的过程:

  1. 下载lapack.tgz包,解压到本地
  2. 进入LAPACK文件夹
  3. 将make.inc.example复制为make.inc。该文件为编译配置文件。
  4. 通过make blaslib命令编译BLAS
  5. 通过make lapacklib命令编译LAPACK
  6. 最终得到两个lib文件:librefblas.a和liblapack.a
    补充:这是一个fortran库,需要gfortran的支持,我通过sudo apt-get install gfortran-4.8和sudo apt-get install gfortran来安装fortran的编译器

我在mint系统下,使用sudo apt-get install liblapack-dev也可以很容易的安装,省去了编译的麻烦。
这么试了几次,使用pip install scipy还是有问题,提示是找不到Python.h头文件。
最后找了一个安装scipy最简易的方案,使用sudo apt-get install python-scipy,这样可以一键安装scipy。因为这里会分析软件依赖关系,将需要安装的额外软件包都一并安装,省去了一个一个安装的复杂问题。

安装matplotlib

在linux下安装matplotlib远比在windows中安装要麻烦,我首先下载了源码包进行安装。
使用python setup.py install的时候提示需要freetype和png,于是我使用apt-get安装了libpng-dev和libfreetype6-dev。

出现"error trying to exec 'cc1plus': execvp: No such file or directory"问题,解决方案是sudo apt-get install build-essential。

不过最后还是调整了软件源,使用sudo apt-get install python-matplotlib来安装的。安装结束后试验了一下,发现还需要安装python-tk,于是又使用apt-get安装了一下,最终可以正常的使用了。

eclipse开发环境

下载了免安装版的eclipse之后,可以解压到/usr/local/目录中。
然后创建桌面快捷方式,sudo vim /usr/share/applications/eclipse.desktop
属于下面文本:

[Desktop Entry]
Name=Eclipse
Comment=Eclipse SDK
Encoding=UTF-8
Exec=/usr/local/eclipse/eclipse
Icon=/usr/local/eclipse/icon.xpm
Terminal=false
Type=Application
Categories=Application;Development;

将该文件复制到桌面就可以从桌面快捷方式上打开eclipse了。
打开eclipse之后,安装pydev再进行相关配置就可以正常工作了。

转载请注明作者Jason Ding及其出处
GitCafe博客主页(http://jasonding1354.gitcafe.io/)
Github博客主页(http://jasonding1354.github.io/)
CSDN博客(http://blog.csdn.net/jasonding1354)
简书主页(//www.greatytc.com/users/2bd9b48f6ea8/latest_articles)
百度搜索jasonding1354进入我的博客主页

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 210,914评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 89,935评论 2 383
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,531评论 0 345
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,309评论 1 282
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,381评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,730评论 1 289
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,882评论 3 404
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,643评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,095评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,448评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,566评论 1 339
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,253评论 4 328
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,829评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,715评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,945评论 1 264
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,248评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,440评论 2 348

推荐阅读更多精彩内容

  • linux和windows下安装python拓展包-pycharm、numpy、scipy、matplotlib、...
    hzyido阅读 81,227评论 2 10
  • 一、文件/文件夹管理 ls 列出当前目录文件(不包括隐含文件)ls -a 列出当前目录文件(包括隐含文件)l...
    路痴千行阅读 2,384评论 0 5
  • 一、文件/文件夹管理 ls 列出当前目录文件(不包括隐含文件) ls -a 列出当前目录文件(包括隐含文件) ls...
    会飞的鱼Coo阅读 4,485评论 1 23
  • 我有一个单纯的童年,它像一粒尘土,一朵花,一阵清风,一条小溪;也可以像一只猫一条狗或一只小鸡仔;也可以像一朵云,一...
    煜烟阅读 254评论 0 2
  • 从下午就开始捣鼓这个优秀家长PK表格,一直捣鼓到现在也没弄明白,最后还是孩子他爸弄好的,我可是不一般的笨...
    李玺辰妈妈阅读 111评论 0 2