【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)

简书主页(http://www.jianshu.com/users/2bd9b48f6ea8/latest_articles)

百度搜索jasonding1354进入我的博客主页

时间: 2024-08-06 00:08:30

【Kaggle】用随机森林分类算法解决Biologial Response问题的相关文章

决策树与随机森林分类算法(Python实现)

一.原理: 决策树:能够利用一些决策结点,使数据根据决策属性进行路径选择,达到分类的目的. 一般决策树常用于DFS配合剪枝,被用于处理一些单一算法问题,但也能进行分类 . 也就是通过每一个结点的决策进行分类,那么关于如何设置这些结点的决策方式: 熵:描述一个集合内元素混乱程度的因素. 熵的衡量公式: ? 公式中的熵值 Entropy 会随着集合中类别数量增加而快速增加,也就是说一个集合中类别越少,那么它的熵就小,整体就越稳定. 对于一个标记数据集,要合理的建立一棵决策树,就需要合理的决定决策结点

mahout 随机森林RF算法

在随机森林中的随机性体现在:1.训练数据的随机性 2. 选择分割属性的随机性 能解决分类与回归问题,并且都有很好的估计表现 1.生成数据说明文件 mahout describe -p input.csv -f input.info-d2 I 3 N I 5 N I 3 C L(执行describe生成数据的说明文件) 2.训练模型 mahout buildforest -d input.csv -ds input.info -sl 5 -p -t 5 -o forest_result(生成随机森

机器学习之路:python 综合分类器 随机森林分类 梯度提升决策树分类 泰坦尼克号幸存者

python3 学习使用随机森林分类器 梯度提升决策树分类 的api,并将他们和单一决策树预测结果做出对比 附上我的git,欢迎大家来参考我其他分类器的代码: https://github.com/linyi0604/MachineLearning 1 import pandas as pd 2 from sklearn.cross_validation import train_test_split 3 from sklearn.feature_extraction import DictVe

tensorflow基础模型之RandomForest(随机森林)算法

随机森林算法原理请参照上篇:随机森林.数据依旧为MNIST数据集. 代码如下: from __future__ import print_function?# Ignore all GPUs, tf random forest does not benefit from it.import os?import tensorflow as tffrom tensorflow.contrib.tensor_forest.python import tensor_forestfrom tensorfl

Spark Random Forest classifier 随机森林分类

1.概述 随机森林是决策树的集合.随机森林是用于分类和回归的最成功的机器学习模型之一.他们结合了许多决策树,以减少过度拟合的风险.像决策树一样,随机森林处理分类特征,扩展到多类分类设置,不需要特征缩放,并且能够捕获非线性和特征交互. spark.mllib支持使用连续和分类功能对二元和多类分类以及进行回归的随机森林. 基础算法 随机森林分别训练一组决策树,因此可以并行进行训练.该算法将随机性注入训练过程中,因此每个决策树都略有不同.合并来自每棵树的预测可以减少预测的方差,从而提高测试数据的性能.

【机器学习基础】随机森林算法

引入 我们回顾一下之前学习的两个算法,Bagging算法中,通过bootstrapping得到不一样的数据,通过这些数据送到一个基本算法之后,得到不同的g,最后对这些g取平均得到G:决策树算法中,通过递归方式建立子树,最终得到一棵完整的树. 这两种算法都有其鲜明的特点,决策树对于不同的数据相对会敏感一些,即其算法的variance很大,而Bagging的特点是通过投票和平均的方式来降低variance的效果.如果将这两种方法结合起来,就是该文要介绍的随机森林,random forest. 1.

机器学习——随机森林算法及原理

1. 随机森林使用背景 1.1 随机森林定义 随机森林是一种比较新的机器学习模型.经典的机器学习模型是神经网络,有半个多世纪的历史了.神经网络预测精确,但是计算量很大.上世纪八十年代Breiman等人发明分类树的算法(Breiman et al. 1984),通过反复二分数据进行分类或回归,计算量大大降低.2001年Breiman把分类树组合成随机森林(Breiman 2001a),即在变量(列)的使用和数据(行)的使用上进行随机化,生成很多分类树,再汇总分类树的结果.随机森林在运算量没有显著提

随机森林(Random Forest)详解(转)

来源: Poll的笔记 cnblogs.com/maybe2030/p/4585705.html 1 什么是随机森林?   作为新兴起的.高度灵活的一种机器学习算法,随机森林(Random Forest,简称RF)拥有广泛的应用前景,从市场营销到医疗保健保险,既可以用来做市场营销模拟的建模,统计客户来源,保留和流失,也可用来预测疾病的风险和病患者的易感性.最初,我是在参加校外竞赛时接触到随机森林算法的.最近几年的国内外大赛,包括2013年百度校园电影推荐系统大赛.2014年阿里巴巴天池大数据竞赛

随机森林(Random Forest)

 阅读目录 ?1 什么是随机森林? ?2 随机森林的特点 ?3 随机森林的相关基础知识 ?4 随机森林的生成 ?5 袋外错误率(oob error) ?6 随机森林工作原理解释的一个简单例子 ?7 随机森林的Python实现 ?8 参考内容 1 什么是随机森林? 作为新兴起的.高度灵活的一种机器学习算法,随机森林(Random Forest,简称RF)拥有广泛的应用前景,从市场营销到医疗保健保险,既可以用来做市场营销模拟的建模,统计客户来源,保留和流失,也可用来预测疾病的风险和病患者的易感性