翻译:Getting Started With Python For Data Science

原文链接:http://www.kaggle.com/wiki/GettingStartedWithPythonForDataScience

这篇教程假设读者能够使用python编程,但并不需要数据科学,机器学习或预测模型的知识。在实践中学习是一种黑客品质。

所有这篇教程中的代码都可以在github上找到。

你也许会遇到不熟悉的术语,但是不会对你完成教程形成阻碍。到最后,你可能不会加深对数据科学的理解,但是你会建立起一个环境,在那里你可以轻松的操作不同的数据科学工具甚至在kaggle比赛中得到不错的成绩。更重要的是,你将有一个可以实验并学习更多数据科学知识的环境。

下面是你将会学习的内容:

  • 怎样安装流行的科学计算库和统计学计算库。
  • 使用上述库函数简历一个基准预测模型,并提交。
  • 编写你自己的评估函数,并学习怎样使用交叉验证去证明你自己的想法。

动心了么?我想是的。

1. 建立环境

第一件事,我们需要一个适合科学统计计算的python环境。假设你已经安装了python(还没?强烈推荐python2.7),我们需要三个包,你需要按照顺序安装:

  • numpy - (发音是num - pie)强大的数字型数组,下面两个包都依赖于它。
  • scipy - (sigh - pie) 可以用来进行科学计算,数学运算,也适合实现工程。
  • sklearn - 傻瓜机器学习包

注意:64位的版本可以在这里找到。

点击上面的链接可以到各个工程的项目主页,获取适合你操作系统的安装包,如果你使用的是linux,你可以用pip来安装,如果你用的windows,从二进制包安装会更简单。

同时我推荐安装一个python的ide环境。当然你可以在命令行执行python脚本,但使用一个趁手的环境调试起来会更容易。我使用PyDev,不过ipython也不错。

 

2. 第一次提交

 

Biological Response 比赛是一个二分类问题,并且数据只是一系列数字,所以特征抽取和特征选择并不像其他kaggle比赛那样重要,是非常适合入门学习的数据集。现在下载训练集和测试集。即使这项比赛已经结束了,你依然可以提交并查看你的结果和其他世界各地最好的数据科学家之间的差别。

在下面的代码中,我们会使用一种增强的分类器,叫做random forest,通常情况下即使不对参数进行调整,它也能表现良好。虽然随机森类是一个非常复杂的分类器,由于sklearn将它封装了起来,所以很容易使用。

注意:使用下面这些算法时,你不必理解所有的数学原理。为了理解算法是如何工作,实验是一个非常好的开端。理解模型非常重要,但是不需要在开始的时候就掌握模型,开心的去比赛吧。

下面是代码:

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 = [x[1] for x in rf.predict_proba(test)]

    savetxt('Data/submission.csv', predicted_probs, delimiter=',', fmt='%f')

if __name__=="__main__":
    main()

这时你应该开始运行代码并且把代码写入一个新的名称为makeSubmission.py的python脚本。你的代码的目录结构应该如下:

#  "My Kaggle Folder")
# |
# |---"Data"
# | |
# | |---train.csv
# | |
# | |---test.csv
# |
# |---makeSubmission.py

一旦你运行了脚本,你就会在data目录下发现my_first_submission.csv。现在开始做一件重要的事。提交这个文件到bio-response比赛。

提交了么?你牛逼。你可以停下了-你学习了如何制作一个kaggle entry - 但如果你是个好奇宝宝,我确信你一定想知道如何使用其他的模型,不同的参数,以及其他牛逼闪闪放光芒的功能。继续读下去学习一些可以在本地评估模型的重要技巧,让你不会浪费掉kaggle每天限制的提交次数。

 

3. 评估和交叉验证

我们打算尝试一下sklearn的gradient boosting machine来代替random forest。或者是一些其他简单的线性模型。从sklearn使用这些方法制作提交文件是很简单的,困难的是比较这些模型的效果。换一种模型就提交一次是不显示的,我们需要一种本地的测试方法,为了达到这个目标,我们需要了解两点:

  1. 评估函数
  2. 交叉验证

你总是需要一些评估函数去计算模型的表现。理想的情况下,这些评估方法与kaggle使用的方法相同。比赛的参与者通常将评估的代码贴在论坛里,kaggle在wiki页面详细的描述了度量方法。在bio-response比赛中,评估方法是log-loss,用户Grunthus贴了一个python版的代码。我们不会花费太多时间在这方面(阅读论坛帖子以获得更多信息),只需要将下面代码复制并保存为logloss.py。

 

import scipy as sp
de fllfun(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比赛entry时,kaggle比较你的答案和真实数据在测试集上的结果。没有那些真是数据的时候,我们怎么才能在本地测试我们的模型呢?这就要靠交叉验证来帮忙了。

交叉验证是一项简单的技术,它将数据分块,并保留一部分,同时模型使用另一部分训练。一旦你意识到了这一点,sklearn能帮你做到这些。在sklearn,交叉验证是内建的功能。sklearn文档有很多关于交叉验证的信息。

下面的代码创建了k=10的交叉验证集合。保留每10%的训练集,用于测试random forest模型。

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提供的不一样。有很多原因可能导致这个结果,random forest 有一个随机的过程,并不会每次都产生一样的结果;真是的测试数据与训练数据分布不一致(尤其是当样本量相当小,就像在bio-reponse比赛中一样);评估方法的实现也可能不同。即使你得到了些许不同的结果,你还是可以在本地比较模型的效果,还是可以知道做了哪些改进可以让效果提升。

总结:

教程结束,现在,你拥有了强大的工具,我希望不久后在leaderboard上看到你。

-Chris Clark

posted @ 2013-08-04 15:46  nanpo  阅读(1196)  评论(0编辑  收藏  举报