[Kaggle] How to kaggle?
成立于2010年的Kaggle是一个进行数据发掘和预测竞赛的在线平台。与Kaggle合作之后,一家公司可以提供一些数据,进而提出一个问题,Kaggle网站上的计算机科学家和数学家,也就是现在所说的数据科学家,将受领任务,提供潜在的解决方案。
重要的是,参与竞赛的这些科学家并不局限于一个答案,他们可以在截止日期之前修改自己的答案,进而推动自己和整个社区向着最佳答案不断进步。Kaggle联合创始人兼CEO安东尼·高德布卢姆(Anthony Goldbloom)解释说:“准确度不断提升,他们都倾向于同一个解决方案。”
凡是玩数据科学和机器学习的老司机,有两个网站一定不会错过:GitHub 和 Kaggle。前者用来分享,后者进行实战练习。
初识 Kaggle
泰坦尼克生存模型
Ref: New to Data Science?
- what sorts of people were likely to survive.
- In particular, we ask you to apply the tools of machine learning to predict which passengers survived the tragedy.
Practice Skills
- Binary classification
- Python and R basics
一、数据格式
Variable | Definition | Key |
---|---|---|
survival | Survival | 0 = No, 1 = Yes |
pclass | Ticket class | 1 = 1st, 2 = 2nd, 3 = 3rd |
sex | Sex | |
Age | Age in years | |
sibsp | # of siblings / spouses aboard the Titanic | |
parch | # of parents / children aboard the Titanic | |
ticket | Ticket number | |
fare | Passenger fare | |
cabin | Cabin number | |
embarked | Port of Embarkation | C = Cherbourg, Q = Queenstown, S = Southampton |
二、分析预测思路
From: http://www.cnblogs.com/cutd/p/5713520.html
业务熟悉的重要性
我们都知道妇女和儿童更可能被救。因此,年龄
和性别
很可能更好的帮助我们预测。
认为乘客的船层可能会影响结果也是符合逻辑的,因为第一层的船舱更靠近船的甲板。Fare
票价和乘客所住船层相关,而且可能是高度相关的,但是也可能会增加一些额外的信息。
SibSp、Parch
兄弟姐妹、配偶、父母/孩子的数量很可能关系到是否被某一个或很多个人救,会有很多人去帮助你或者有很多人想到你尝试去救你。
像Embarked
登船(也许有一些信息和怎么靠近船的顶部的人的船舱有关),Ticket
票号和Name
名字。
这一步通常是习得相关的领域知识[要对业务比较深入],这对于绝大多数机器学习任务来说非常非常非常的重要。
【特征的重要性有时候要超过模型的选择】
开始分析
以下信息取自于:http://www.cnblogs.com/cutd/tag/kaggle/
一、Pre-processing
读数据,清理数据。
>>> import pandas
>>> import numpy
>>> import matplotlib.pyplot >>> //读数据
>>> titanic = pandas.read_csv("train.csv") >>> //显示数据统计概况
>>> print(titanic.describe())
PassengerId Survived Pclass Age SibSp \
count 891.000000 891.000000 891.000000 714.000000 891.000000
mean 446.000000 0.383838 2.308642 29.699118 0.523008
std 257.353842 0.486592 0.836071 14.526497 1.102743
min 1.000000 0.000000 1.000000 0.420000 0.000000
25% 223.500000 0.000000 2.000000 20.125000 0.000000
50% 446.000000 0.000000 3.000000 28.000000 0.000000
75% 668.500000 1.000000 3.000000 38.000000 1.000000
max 891.000000 1.000000 3.000000 80.000000 8.000000 Parch Fare
count 891.000000 891.000000
mean 0.381594 32.204208
std 0.806057 49.693429
min 0.000000 0.000000
25% 0.000000 7.910400
50% 0.000000 14.454200
75% 0.000000 31.000000
max 6.000000 512.329200 >>> //显示某一列
>>> titanic['Age']
0 22.0
1 38.0
2 26.0
...
888 NaN
889 26.0
890 32.0
Name: Age, dtype: float64 >>> //中值填充缺失值>>> //并赋值回原来的列
>>> titanic['Age'] = titanic['Age'].fillna(titanic['Age'].median()) >>> //非数值列变为数值形式
>>> titanic.loc[titanic['Sex']=='male','Sex'] = 0
>>> titanic.loc[titanic['Sex']=='female','Sex'] = 1 >>> //非数值列有哪几种
>>> print(titanic["Embarked"].unique())
['S' 'C' 'Q' nan]
>>> //缺失值使用最多的非数值类型填充
>>> titanic['Embarked'] = titanic['Embarked'].fillna('S') >>> //非数值列变为数值形式
>>> titanic.loc[titanic['Embarked'] == 'S', 'Embarked'] = 0
>>> titanic.loc[titanic['Embarked'] == 'C', 'Embarked'] = 1
>>> titanic.loc[titanic['Embarked'] == 'Q', 'Embarked'] = 2
清理数据
二、交给机器学习
线性回归的等式如下:(y=mx+b)
仅使用age貌似就能达到还不错的效果。
预测
我们可以使用极好的 scikit-learn
库 来做预测:
# Import the linear regression class
from sklearn.linear_model import LinearRegression
# Sklearn also has a helper that makes it easy to do cross validation
from sklearn.cross_validation import KFold # The columns we'll use to predict the target
predictors = ["Pclass", "Sex", "Age", "SibSp", "Parch", "Fare", "Embarked"] # Initialize our algorithm class
alg = LinearRegression()
# Generate cross validation folds for the titanic dataset. It return the row indices corresponding to train and test.
# We set random_state to ensure we get the same splits every time we run this.
kf = KFold(titanic.shape[0], n_folds=3, random_state=1) predictions = []
for train, test in kf:
# The predictors we're using the train the algorithm. Note how we only take the rows in the train folds.
train_predictors = (titanic[predictors].iloc[train,:])
# The target we're using to train the algorithm.
train_target = titanic["Survived"].iloc[train]
# Training the algorithm using the predictors and target.
alg.fit(train_predictors, train_target)
# We can now make predictions on the test fold
test_predictions = alg.predict(titanic[predictors].iloc[test,:])
predictions.append(test_predictions)
评价
定义误差的度量标准。
从Kaggle竞赛的描述,误差的度量标准是正确预测的百分比。我们将使用这个相同的度量标准来测试我们本地模型的性能。
这个度量标准将基本上是:
(
predictions
中找到的值 vs 他们在titanic['Survived']
的副本中准确对应的值的数量) / (乘客的总数)。
在我们这么做之前,我们需要先将三个预测数据集合并到一个列中。因为每一个预测数据集是一个numpy(python科学计算库[注:真正的科学计算库应该是scipy,而numpy主要是矩阵数组等数据处理运算])数组,我们可以使用一个numpy方法将他们连接到一个列里。
算出predictions
预测值中和titanic["Survived"]
副本中准确相同的值的比例。这个计算结过应该是一个浮点数(小数)并将它赋值给变量accuracy
。
import numpy as np # The predictions are in three separate numpy arrays. Concatenate them into one.
# We concatenate them on axis 0, as they only have one axis.
predictions = np.concatenate(predictions, axis=0) # Map predictions to outcomes (only possible outcomes are 1 and 0)
predictions[predictions > .5] = 1
predictions[predictions <=.5] = 0
accuracy = sum(predictions[predictions == titanic['Survived']])/(titanic['Survived'].count())
三、变得更好 - 逻辑回归
我们有了我们的第一个预测结果!可是结果并不是很好,只有78.3%的正确率。在视频中,我们曾提到一种方式使线性回归的输出值介于0
和1
之间。这种方法叫做逻辑回归。
一个好的方法就是将逻辑回归当成是线性回归的逻辑输出,所以他的值就是0
和1
。用逻辑函数 logit function来完成。输入任何值到逻辑函数都将通过“压缩”极值匹配成0
和1
。这对我们来说非常完美,因为我们只关心两种输出结果。Sklearn
有一个逻辑回归的类我们可以使用。通过使用一个Sklearn
助手函数可以使我们所有的交叉验证和测试变得更简单。
Ref: 逻辑回归与线性回归的区别与联系
四、提交答案
但是我们需要提交一个答案到比赛中。我们需要在测试数据上采取一个和训练数据上一样的校准的步骤来完成这个事情。
如果我们没有校准操作,我们就不能够利用它做出有效的预测。
这些操作要在我们对列所有的改变之前进行。
处理titanic_test
和处理titanic
用同样的方法。
这涉及到:
- 使用训练数据集中的年龄中位数填充“Age”列的的所有缺失值。训练数据集的年龄已经使用完全相同的值替换了缺失年龄(因为值已经不同了,所以这不能作为测试集的中位数)。你应该用
titanic['Age'].median()
去找到中位数。 - 将
Sex
列中的所有male
换成0
,所有female
换成1
。 - 用
S
填充Embarked
列中的所有缺失值。 将
Embarked
列中的S
换成0
,C
换成1
,Q
换成2
。
我们也需要将Fare
列的缺失值替换掉。用.fillna
将测试集中的缺失值用中位数替换掉。训练集中的Fare
列没有缺失值了,但是测试集有时会不同。
- 使用训练数据集中的年龄中位数填充“Age”列的的所有缺失值。训练数据集的年龄已经使用完全相同的值替换了缺失年龄(因为值已经不同了,所以这不能作为测试集的中位数)。你应该用
其实就是同样的预处理,使数据都变得可处理、可操作。
titanic_test = pandas.read_csv("titanic_test.csv")
titanic_test['Age'] = titanic_test['Age'].fillna(titanic_test['Age'].median())
titanic_test['Fare'] = titanic_test['Fare'].fillna(titanic_test['Fare'].median())
titanic_test.loc[titanic_test['Sex'] == 'male','Sex'] = 0
titanic_test.loc[titanic_test['Sex'] == 'female','Sex'] = 1
titanic_test['Embarked'] = titanic_test['Embarked'].fillna('S')
titanic_test.loc[titanic_test['Embarked'] == 'S', 'Embarked'] = 0
titanic_test.loc[titanic_test['Embarked'] == 'C', 'Embarked'] = 1
titanic_test.loc[titanic_test['Embarked'] == 'Q', 'Embarked'] = 2
有了我们需要生成一个比赛提交答案的所有东西之后,生成一个提交文件。
- 首先,我们必须先在训练数据上训练一个算法。
- 然后我们在测试数据集上做一个预测。
- 最后,我们生成一个包含预测和乘客id的csv文件。
# Initialize the algorithm class
alg = LogisticRegression(random_state=1) # Train the algorithm using all the training data
alg.fit(titanic[predictors], titanic["Survived"]) # 1. # Make predictions using the test set.
predictions = alg.predict(titanic_test[predictors]) # 2. # Create a new dataframe with only the columns Kaggle wants from the dataset.
submission = pandas.DataFrame({ # 3.
"PassengerId": titanic_test["PassengerId"],
"Survived": predictions
})
一旦你完成了上面步骤的代码,你就能用 submission.to_csv('kaggle.csv, index=False')
输出一个csv结果。
这将会给你的第一个条件所有需要的东西——虽然这没有给你很好的准确率。(~0.75)
由于我们的预测在不同的数据集上导致在测试集上的分数低于我们在交叉验证上的分数。
在下一个任务中我们将学习如何生成更好的特征和使用更好的模型来提高我们的分数。
开始改进
一、改进特征 - 随机森林
详见:http://www.cnblogs.com/cutd/p/5713525.html
通过求所有树的平均预测值,我们能得到一个更好的整体预测和最小的过拟合。
感谢上帝,sklearn已经实现了一个非常棒的随机森林。(具体在python章节再详谈)
alg = RandomForestClassifier(random_state=1, n_estimators=10, min_samples_split=2, min_samples_leaf=1)
提高随机森林的精度:
- 增加我们使用的树的数量。
- 调整
min_samples_split
和min_samples_leaf
变量来减少过拟合。
二、更多的特征
生成新特征
使用pandas数据框的.apply
方法来生成新特征。
挖掘特征 - 头衔
我们可以从乘客的名字中提取出他们的头衔。头衔的格式是Master.
,Mr.
,Mrs.
。有一些非常常见的头衔,也有一些“长尾理论”中的一次性头衔只有仅仅一个或者两个乘客使用。
- 第一步使用正则表达式提取头衔,
- 然后将每一个唯一头衔匹配成(map)整型数值。
- 之后我们将得到一个准确的和
Title
相对应的数值列。
挖掘特征 - 家族
我们也可以生成一个特征来表示哪些人是一个家族。因为幸存看起来非常依靠你的家族和你旁边的人,这是一个成为好特征的好机会。
为了完成这个任务,我们将通过FamilySize
连接某些人的姓来得到一个家庭编号。然后我们将基于他们的家庭编号给每个人赋值一个代码。
三、找出最好的特征
在任何的机器学习任务中,特征工程都是最重要的部分,有许多的特征可以让我们计算。但是我们也需要找到一种方法来计算出哪个特征是最好的。
一种方法就是使用单特征选择器(univariate feature selection),这种方法的本质是一列一列的遍历计算出和我们想要预测的结果(Survived
)最密切关联的那一列。
和以前一样,sklearn
有一个叫做SelectKBest
的函数 将会帮助我们完成特征选择。这个函数会从数据中选出最好的特征,并且允许我们指定选择的数量。
Goto: [Feature] Feature selection【更为详细】
继续改进
一、改进特征 - 梯度提升(Gradient Boosting)
另外一种方法是以决策树为基础的梯度提升分类器。
提升包含了一个接一个的训练决策树,并且将一个树的误差传入到下一棵树。所以每一颗树都是以它之前的所有树为基础构造的。
不过如果我们建造太多的树会导致过拟合。
- 当你得到了
100
棵左右的树,这会非常容易过拟合和训练出数据集中的怪特征。 - 当我们的数据集极小时,我们将会把树的数量限制在
25
。
- 当你得到了
另外一种防止过拟合的方法就是限制在梯度提升过程中建立的每一棵树的深度。我们将树的高度限制到3
来分避免过拟合。
我们将试图用提升来替换掉我们的随机森林方法并且观察是否会提升我们的预测准确率。
二、改进特征 - 集成(Ensembling)
为了提升我们的预测准确率,我们能做的一件事就是 集成不同的分类器。集成的意思就是我们利用一系列的分类器的信息来生成预测结果而不是仅仅用一个。在实践中,这意味着我们是求他们预测结果的平均值。
通常来说,我们集成越多的越不同的模型,我们结果的准确率就会越高。多样性的意思是模型从不同列生成结果,或者使用一个非常不同的方法来生成预测结果。
- 集成一个随机森林和一个决策树大概不会得到一个非常好的结果,因为他们非常的相似。
- 换句话说,集成一个线性回归和一个随机森林可以工作得非常棒。
一个关于集成的警示就是我们使用的分类器的准确率必须都是差不多的。集成一个分类器的准确率比另外一个差得多将会导致最后的结果也变差。
在这一节中,我们将会集成基于大多数线性预测训练的逻辑回归(有一个线性排序,和Survived
有一些关联)和一个在所有预测元素上训练的梯度提升树。
在我们集成的时候会保持事情的简单——我们将会求我们从分类器中得到的行概率(0~1)的平均值,然后假定所有大于0.5
的匹配成1
,小于等于0.5
的匹配成0
。
三、完成一个提交
做两件事:
在测试集上匹配我们的变化
在测试集上做预测
现在,我们有了一个提交!这应该能让你在排行榜得到0.799
的分数。你可以使用submission.to_csv("kaggle.csv",index=False)
生成一个提交文件。
你任然可以在特征工程上做很多事情:
- 尝试用和船舱相关的特征。
- 观察家庭大小特征是否会有帮助——一个家庭中女性的数量多使全家更可能幸存?
- 乘客的国籍能为其幸存提高什么帮助?
在算法方面我们也有非常多的事情可以做:
- 尝试在集成中加入随机森林分类器。
- 在这个数据上支持向量机也许会很有效。
- 我们可以试试神经网络。
- 提升一个不同的基础分类器也许会更好。
集成方法:
- 多数表决是比概率平均更好的集成方法?
这个数据集很容易过拟合,因为没有很多的数据,所以你将会得到很小的准确率提升。
End.
[Kaggle] How to kaggle?的更多相关文章
- 准备熟悉Kaggle -菜鸟进阶
原文链接http://www.bubuko.com/infodetail-525389.html 1.Kaggle简介 Kaggle是一个数据分析的竞赛平台,网址:https://www.kaggle ...
- 大数据竞赛平台——Kaggle 入门
Reference: http://blog.csdn.net/witnessai1/article/details/52612012 Kaggle是一个数据分析的竞赛平台,网址:https://ww ...
- KAGGLE竟赛
KAGGLE竟赛 关于kaggle的竟赛规则我们勇闯组做出了一些说明,大家可以借鉴一下如何参加kaggle,参加kaggle大赛的一些注意事项,自己参加一些项目,一定会使你的知识量得到质的提升 这是链 ...
- kaggle竞赛入门整理
1.Bike Sharing Demand kaggle: https://www.kaggle.com/c/bike-sharing-demand 目的:根据日期.时间.天气.温度等特征,预测自行车 ...
- Kaggle比赛:从何着手?
介绍 参加Kaggle比赛,我必须有哪些技能呢? 你有没有面对过这样的问题?最少在我大二的时候,我有过.过去我仅仅想象Kaggle比赛的困难度,我就感觉害怕.这种恐惧跟我怕水的感觉相似.怕水,让我无法 ...
- 机器学习英雄访谈录之 Kaggle Kernels 专家:Aakash Nain
目录 机器学习英雄访谈录之 Kaggle Kernels 专家:Aakash Nain 正文 对我的启发 机器学习英雄访谈录之 Kaggle Kernels 专家:Aakash Nain Sanyam ...
- 机器学习(一):记一次k一近邻算法的学习与Kaggle实战
本篇博客是基于以Kaggle中手写数字识别实战为目标,以KNN算法学习为驱动导向来进行讲解. 写这篇博客的原因 什么是KNN kaggle实战 优缺点及其优化方法 总结 参考文献 写这篇博客的原因 写 ...
- 【干货】Kaggle 数据挖掘比赛经验分享(mark 专业的数据建模过程)
简介 Kaggle 于 2010 年创立,专注数据科学,机器学习竞赛的举办,是全球最大的数据科学社区和数据竞赛平台.笔者从 2013 年开始,陆续参加了多场 Kaggle上面举办的比赛,相继获得了 C ...
- Kaggle 数据挖掘比赛经验分享(转)
原作者:陈成龙 简介 Kaggle 于 2010 年创立,专注数据科学,机器学习竞赛的举办,是全球最大的数据科学社区和数据竞赛平台.笔者从 2013 年开始,陆续参加了多场 Kaggle上面举办的比 ...
随机推荐
- SqlServer和Oralce保留几位小数以及当末尾小数为0也显示
需求描述:对数字类型值保留2位小数,当2位小数末尾出现0时也显示 SqlServer处理方法: 1.首先通过Round函数保留2位有效数字,多出的位数值变成0 2.通过Cast函数转成decimal( ...
- mysql中的分区
第18章:分区 目录 18.1. MySQL中的分区概述 18.2. 分区类型 18.2.1. RANGE分区 18.2.2. LIST分区 18.2.3. HASH分区 18.2.4. KEY分区 ...
- Loadrunner12-思考时间设置
1.什么是思考时间 简单来说就是可以在不同的操作之间做停顿,最大程度的模拟用户最真实的操作. 2.如何设置思考时间 函数:lr_think_time(4) 进入Runtime Settings页面,快 ...
- LoadRunner(3)
一.性能测试的策略 重要的:基准测试.并发测试.在线综合场景测试 递增测试.极限测试... 1.基准测试:Benchmark Testing 含义:就是单用户测试,单用户.单测试点.执行n次: 作为后 ...
- UVa1048 Low Cost Air Travel——最短路
很好的一道题呀 思路 状态\(d(i,j)\)表示已经经过了行程单中的\(i\)个城市,目前在城市\(j\)的最小代价,直接建边跑最短路就行了 比如机票为\(ACBD\),行程单为\(CD\),那么对 ...
- BZOJ3887 [Usaco2015 Jan]Grass Cownoisseur[缩点]
首先看得出缩点的套路.跑出DAG之后,考虑怎么用逆行条件.首先可以不用,这样只能待原地不动.用的话,考虑在DAG上向后走,必须得逆行到1号点缩点后所在点的前面,才能再走回去. 于是统计从1号点缩点所在 ...
- Ubuntu本地软件源制作
操作 获取需要的deb包 #执行安装后,安装的包会保存在/var/cache/apt/archives 目录下 apt-get install vim #查看 正在处理用于 man-db (2.8.7 ...
- Google Maps API3 之 Hello World
<html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-e ...
- axios请求提交的form data格式 明明是JSON格式的参数却转成了字符串格式
问题:传的参数成为了字符数格式 解决:把参数的格式转换 const params = new URLSearchParams() params.append('USER_LOGIN', 'admin' ...
- 建造者模式(Builder)---创建型
1 定义域特征 定义:将一个复杂的对象构建与其表示分离,使得同样的构建过程可以创建不同的表示.特征:用户只需要指定需要建造的类型即可,对于中间的细节不考虑. 本质:分离整体构建算法和部件构造.构建一个 ...