[Kaggle] How to kaggle?

成立于2010年的Kaggle是一个进行数据发掘和预测竞赛的在线平台。与Kaggle合做以后,一家公司能够提供一些数据,进而提出一个问题,Kaggle网站上的计算机科学家和数学家,也就是如今所说的数据科学家,将受领任务,提供潜在的解决方案。html

重要的是,参与竞赛的这些科学家并不局限于一个答案,他们能够在截止日期以前修改本身的答案,进而推进本身和整个社区向着最佳答案不断进步。Kaggle联合创始人兼CEO安东尼·高德布卢姆(Anthony Goldbloom)解释说:“准确度不断提高,他们都倾向于同一个解决方案。python

凡是玩数据科学和机器学习的老司机,有两个网站必定不会错过:GitHub Kaggle。前者用来分享,后者进行实战练习。git

 

 

 

初识 Kaggle


泰坦尼克生存模型

Ref: New to Data Science?正则表达式

  1. what sorts of people were likely to survive. 
  2. 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

 

1、数据格式

 

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

 

 

2、分析预测思路

From: http://www.cnblogs.com/cutd/p/5713520.htmlexpress

业务熟悉的重要性

咱们都知道妇女和儿童更可能被救。所以,年龄性别极可能更好的帮助咱们预测。数组

认为乘客的船层可能会影响结果也是符合逻辑的,由于第一层的船舱更靠近船的甲板。Fare票价和乘客所住船层相关,并且多是高度相关的,可是也可能会增长一些额外的信息。网络

SibSp、Parch兄弟姐妹、配偶、父母/孩子的数量极可能关系到是否被某一个或不少我的救,会有不少人去帮助你或者有不少人想到你尝试去救你。app

Embarked登船(也许有一些信息和怎么靠近船的顶部的人的船舱有关),Ticket票号和Name名字。dom

这一步一般是习得相关的领域知识[要对业务比较深刻],这对于绝大多数机器学习任务来讲很是很是很是的重要。

【特征的重要性有时候要超过模型的选择】

 

 

开始分析

如下信息取自于:http://www.cnblogs.com/cutd/tag/kaggle/

1、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
清理数据

 

 

 

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

 

 

3、变得更好 - 逻辑回归

咱们有了咱们的第一个预测结果!但是结果并非很好,只有78.3%的正确率。在视频中,咱们曾提到一种方式使线性回归的输出值介于01之间。这种方法叫作逻辑回归
一个好的方法就是将逻辑回归当成是线性回归的逻辑输出,因此他的值就是01。用逻辑函数 logit function来完成。输入任何值到逻辑函数都将经过“压缩”极值匹配成01。这对咱们来讲很是完美,由于咱们只关心两种输出结果。
Sklearn有一个逻辑回归的类咱们可使用。经过使用一个Sklearn助手函数可使咱们全部的交叉验证和测试变得更简单。

Ref: 逻辑回归与线性回归的区别与联系

 

 

4、提交答案

可是咱们须要提交一个答案到比赛中。咱们须要在测试数据上采起一个和训练数据上同样的校准的步骤来完成这个事情。

若是咱们没有校准操做,咱们就不可以利用它作出有效的预测。
这些操做要在咱们对列全部的改变以前进行。


处理titanic_test和处理titanic用一样的方法。
这涉及到:

    • 使用训练数据集中的年龄中位数填充“Age”列的的全部缺失值。训练数据集的年龄已经使用彻底相同的值替换了缺失年龄(由于值已经不一样了,因此这不能做为测试集的中位数)。你应该用titanic['Age'].median()去找到中位数。
    • Sex列中的全部male换成0,全部female换成1
    • S填充Embarked列中的全部缺失值。
    • Embarked列中的S换成0C换成1Q换成2
      咱们也须要将Fare列的缺失值替换掉。用.fillna将测试集中的缺失值用中位数替换掉。训练集中的Fare列没有缺失值了,可是测试集有时会不一样。

 

其实就是一样的预处理,使数据都变得可处理、可操做。

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

 

有了咱们须要生成一个比赛提交答案的全部东西以后,生成一个提交文件。

    1. 首先,咱们必须先在训练数据上训练一个算法
    2. 而后咱们在测试数据集上作一个预测
    3. 最后,咱们生成一个包含预测和乘客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)

因为咱们的预测在不一样的数据集上致使在测试集上的分数低于咱们在交叉验证上的分数。

在下一个任务中咱们将学习如何生成更好的特征和使用更好的模型来提升咱们的分数。

 

 

开始改进

1、改进特征 - 随机森林

详见: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_splitmin_samples_leaf变量来减小过拟合。

 

 

2、更多的特征

生成新特征

使用pandas数据框的.apply 方法来生成新特征。

挖掘特征 - 头衔

咱们能够从乘客的名字中提取出他们的头衔。头衔的格式是Master.,Mr.,Mrs.。有一些很是常见的头衔,也有一些“长尾理论”中的一次性头衔只有仅仅一个或者两个乘客使用。

  1. 第一步使用正则表达式提取头衔,
  2. 而后将每个惟一头衔匹配成(map)整型数值。
  3. 以后咱们将获得一个准确的和Title相对应的数值列。

挖掘特征 - 家族

咱们也能够生成一个特征来表示哪些人是一个家族。由于幸存看起来很是依靠你的家族和你旁边的人,这是一个成为好特征的好机会。
为了完成这个任务,咱们将经过FamilySize链接某些人的姓来获得一个家庭编号。而后咱们将基于他们的家庭编号给每一个人赋值一个代码。

 

 

3、找出最好的特征

在任何的机器学习任务中,特征工程都是最重要的部分,有许多的特征可让咱们计算。可是咱们也须要找到一种方法来计算出哪一个特征是最好的。
一种方法就是使用单特征选择器(univariate feature selection),这种方法的本质是一列一列的遍历计算出和咱们想要预测的结果(Survived)最密切关联的那一列。
和之前同样,sklearn有一个叫作SelectKBest的函数 将会帮助咱们完成特征选择。这个函数会从数据中选出最好的特征,而且容许咱们指定选择的数量。 

Goto: [Feature] Feature selection【更为详细】

 

 

 

继续改进

1、改进特征 - 梯度提高(Gradient Boosting)

另一种方法是以决策树为基础的梯度提高分类器

提高包含了一个接一个的训练决策树,而且将一个树的偏差传入到下一棵树。因此每一颗树都是以它以前的全部树为基础构造的。

不过若是咱们建造太多的树会致使过拟合。

    • 当你获得了100棵左右的树,这会很是容易过拟合和训练出数据集中的怪特征。
    • 当咱们的数据集极小时,咱们将会把树的数量限制在25

另一种防止过拟合的方法就是限制在梯度提高过程当中创建的每一棵树的深度。咱们将树的高度限制到3来分避免过拟合。
咱们将试图用提高来替换掉咱们的随机森林方法而且观察是否会提高咱们的预测准确率。

 

 

2、改进特征 - 集成(Ensembling)

为了提高咱们的预测准确率,咱们能作的一件事就是 集成不一样的分类器。集成的意思就是咱们利用一系列的分类器的信息来生成预测结果而不是仅仅用一个。在实践中,这意味着咱们是求他们预测结果的平均值。
一般来讲,咱们集成越多的越不一样的模型,咱们结果的准确率就会越高。多样性的意思是模型从不一样列生成结果,或者使用一个很是不一样的方法来生成预测结果。

    • 集成一个随机森林和一个决策树大概不会获得一个很是好的结果,由于他们很是的类似。
    • 换句话说,集成一个线性回归和一个随机森林能够工做得很是棒。

一个关于集成的警示就是咱们使用的分类器的准确率必须都是差很少的。集成一个分类器的准确率比另一个差得多将会致使最后的结果也变差。

在这一节中,咱们将会集成基于大多数线性预测训练的逻辑回归(有一个线性排序,和Survived有一些关联)和一个在全部预测元素上训练的梯度提高树。
在咱们集成的时候会保持事情的简单——咱们将会求咱们从分类器中获得的行几率(0~1)的平均值,而后假定全部大于0.5的匹配成1,小于等于0.5的匹配成0

 

 

3、完成一个提交

作两件事:

    • 在测试集上匹配咱们的变化

    • 在测试集上作预测

如今,咱们有了一个提交!这应该能让你在排行榜获得0.799的分数。你可使用submission.to_csv("kaggle.csv",index=False)生成一个提交文件。
你任然能够在特征工程上作不少事情:

    • 尝试用和船舱相关的特征。
    • 观察家庭大小特征是否会有帮助——一个家庭中女性的数量多使全家更可能幸存?
    • 乘客的国籍能为其幸存提升什么帮助?

在算法方面咱们也有很是多的事情能够作:

    • 尝试在集成中加入随机森林分类器。
    • 在这个数据上支持向量机也许会颇有效。
    • 咱们能够试试神经网络
    • 提高一个不一样的基础分类器也许会更好。

集成方法:

    • 多数表决是比几率平均更好的集成方法?

这个数据集很容易过拟合,由于没有不少的数据,因此你将会获得很小的准确率提高。

 

End.

相关文章
相关标签/搜索