完整代码: https://github.com/cindycindyhi/kaggle-Titanic

特征工程系列:

Titanic系列之原始数据分析和数据处理

Titanic系列之数据变换

Titanic系列之派生属性&维归约

之前的三篇博文已经进行了一次还算完整的特征工程,分析字符串类型的变量获取新变量,对数值变量进行规范化,获取派生属性并进行维规约。现在我们已经有了一个特征集,可以进行训练模型了。

由于这是一个分类问题,可以使用L1 SVM 随机森林等分类算法,随机森林是一个非常简单而且实用的分类模型,可调的变量很少。它的一个非常重要的变量是树的个数,树的个数增加到一定大小后会使耗时加大,但是精度不会增加很多。

经过之前的特征工程,现在已经有237个特征,数目过多的特征会使模型过拟合,幸运的是,随机森林在训练之后可以产生一个各个特征重要性的数据集,我们可以利用这个数据集,确定一个阈值,选出来对模型训练帮助最大的一些属性,这里使用的随机森林的参数都是默认值。

     X = input_df.values[:, 1::]
y = input_df.values[:, 0]
survived_weight = .75
y_weights = np.array([survived_weight if s == 0 else 1 for s in y]) print "Rough fitting a RandomForest to determine feature importance..."
forest = RandomForestClassifier(oob_score=True, n_estimators=10000)
forest.fit(X, y, sample_weight=y_weights)
feature_importance = forest.feature_importances_
feature_importance = 100.0 * (feature_importance / feature_importance.max()) fi_threshold = 18
important_idx = np.where(feature_importance > fi_threshold)[0]
important_features = features_list[important_idx]
print "\n", important_features.shape[0], "Important features(>", \
fi_threshold, "% of max importance)...\n"#, \
#important_features
sorted_idx = np.argsort(feature_importance[important_idx])[::-1]
#get the figure about important features
pos = np.arange(sorted_idx.shape[0]) + .5
plt.subplot(1, 2, 2)
plt.title('Feature Importance')
plt.barh(pos, feature_importance[important_idx][sorted_idx[::-1]], \
color='r',align='center')
plt.yticks(pos, important_features[sorted_idx[::-1]])
plt.xlabel('Relative Importance')
plt.draw()
plt.show()

代码有点长,但主要分成两块,一是模型训练,二是根据训练得到的特征重要性筛选重要特征并画图。

得到的特征重要性大于18的属性如下图所示:

可以看到Tiltle_Mr Title_id Gender这三个属性相当重要。而与Title有关的属性都是我们对姓名进行分析得到的,可见一些字符串属性中可能会藏有非常重要的信息,在特种工程中要非常重视而不是将其抛弃。因为我们的原始属性非常少,所以产生的重要属性大都是原始属性的数学组合,派生变量可能并不是必需的,这主要和模型有关,但大多数时候派生变量是没有什么坏处的。对于随机森林这种训练数据想对容易的模型来说,可能一些原始的属性直接用来进行训练也会产生很好的效果,但是作为一道学习题,当然是什么处理办法都要尝试一遍,积累经验啦。

对于随机森林如何得到变脸重要性的,可以看一下scikit learn 的官方文档 scikit-learn.org/stable/auto_examples/ensemble/plot_forest_importances.html#example-ensemble-plot-forest-importances-py

当然在得到重要的特征后,我们就要把不重要的特征去掉了,以提高模型的训练速度(阈值可调的小一点,以保留更多的特征)

     X = X[:, important_idx][:, sorted_idx]
submit_df = submit_df.iloc[:,important_idx].iloc[:,sorted_idx]

现在我们就得到了最终的数据集,终于可以正式用来训练模型了。

上面部分都是用的随机森林的默认参数,但是模型的参数是可调的,我们要调整参数以获得更好的训练。scikit learn 提供了两种参数优化的方法,也是其他工具通用的方法,一是GridSearch,另一个是RandomizedSearch。在这两种情况下,都可以指定每个参数的取值范围,创建一个字典。将参数字典提供给search方法,它就会执行模型所指定的值的组合。对于GridSearch,它测试参数每一个可能的组合。 RandomizedSearch允许指定有多少不同的组合要测试,然后随机选择组合。如果正在使用模型关键参数很多,RandomizedSearch很有用可以帮助节省时间。

 sqrtfeat = int(np.sqrt(X.shape[1]))
minsampsplit = int(X.shape[0]*0.015)
# (adapted from http://scikit-learn.org/stable/auto_examples/randomized_search.html)
def report(grid_scores, n_top=5):
params = None
top_scores = sorted(grid_scores, key=itemgetter(1), reverse=True)[:n_top]
for i, score in enumerate(top_scores):
print("Parameters with rank: {0}".format(i + 1))
print("Mean validation score: {0:.4f} (std: {1:.4f})".format(
score.mean_validation_score, np.std(score.cv_validation_scores)))
print("Parameters: {0}".format(score.parameters))
print("") if params == None:
params = score.parameters return params
# Simple grid test
grid_test1 = { "n_estimators" : [1000, 2500, 5000],
"criterion" : ["gini", "entropy"],
"max_features" : [sqrtfeat-1, sqrtfeat, sqrtfeat+1],
"max_depth" : [5, 10, 25],
"min_samples_split" : [2, 5, 10,minsampsplit ] } forest = RandomForestClassifier(oob_score=True) print "Hyperparameter optimization using GridSearchCV..."
grid_search = GridSearchCV(forest, grid_test1, n_jobs=-1, cv=10)
grid_search.fit(X, y)
best_params_from_grid_search = scorereport.report(grid_search.grid_scores_)

经训练得到的参数为    params_score = { "n_estimators"      : 10000,   "max_features"      : sqrtfeat,   "min_samples_split" : minsampsplit },结果还是很符合经验结果预测的。

怎么评价这个训练后的模型呢? Learning Curves。《机器学习实战》这本书里有讲,Andrew Ng的公开课里也讲过。主要是偏差方差折衷与测试误差和训练误差的关系。我们应该调整模型来达到测试误差的最小值。sklearn.learning_curve模块可以完成这个功能。 Learning Curves曲线最后表明我们的模型需要更多的数据训练。

在训练时要注意的是,因为幸存者相对未幸存的人数较少,所以数据是不均衡的,可以通过上抽样或下抽样或者调整样本的权重,来获得均衡的训练样本。

然后我们就可以用forest来预测测试集了,bingo!

kaggle数据挖掘竞赛初步--Titanic<随机森林&特征重要性>的更多相关文章

  1. kaggle数据挖掘竞赛初步--Titanic<数据变换>

    完整代码: https://github.com/cindycindyhi/kaggle-Titanic 特征工程系列: Titanic系列之原始数据分析和数据处理 Titanic系列之数据变换 Ti ...

  2. kaggle数据挖掘竞赛初步--Titanic<派生属性&维归约>

    完整代码: https://github.com/cindycindyhi/kaggle-Titanic 特征工程系列: Titanic系列之原始数据分析和数据处理 Titanic系列之数据变换 Ti ...

  3. kaggle数据挖掘竞赛初步--Titanic<原始数据分析&缺失值处理>

    Titanic是kaggle上的一道just for fun的题,没有奖金,但是数据整洁,拿来练手最好不过啦. 这道题给的数据是泰坦尼克号上的乘客的信息,预测乘客是否幸存.这是个二元分类的机器学习问题 ...

  4. CIKM Competition数据挖掘竞赛夺冠算法陈运文

    CIKM Competition数据挖掘竞赛夺冠算法陈运文 背景 CIKM Cup(或者称为CIKM Competition)是ACM CIKM举办的国际数据挖掘竞赛的名称.CIKM全称是Intern ...

  5. 使用sklearn进行数据挖掘-房价预测(4)—数据预处理

    在使用机器算法之前,我们先把数据做下预处理,先把特征和标签拆分出来 housing = strat_train_set.drop("median_house_value",axis ...

  6. R学习笔记 第五篇:数据变换和清理

    在使用R的分组操作之前,首先要了解R语言包,包实质上是实现特定功能的,预先写好的代码库(library),R拥有大量的软件包,许多包都是由某一领域的专家编写的,但并不是所有的包都有很高的质量的,在使用 ...

  7. R实战 第六篇:数据变换(aggregate+dplyr)

    数据分析的工作,80%的时间耗费在处理数据上,而数据处理的主要过程可以分为:分离-操作-结合(Split-Apply-Combine),也就是说,首先,把数据根据特定的字段分组,每个分组都是独立的:然 ...

  8. 【干货】Kaggle 数据挖掘比赛经验分享(mark 专业的数据建模过程)

    简介 Kaggle 于 2010 年创立,专注数据科学,机器学习竞赛的举办,是全球最大的数据科学社区和数据竞赛平台.笔者从 2013 年开始,陆续参加了多场 Kaggle上面举办的比赛,相继获得了 C ...

  9. 数据挖掘竞赛kaggle初战——泰坦尼克号生还预测

    1.题目 这道题目的地址在https://www.kaggle.com/c/titanic,题目要求大致是给出一部分泰坦尼克号乘船人员的信息与最后生还情况,利用这些数据,使用机器学习的算法,来分析预测 ...

随机推荐

  1. 【转】Git图形化界面客户端大汇总

    原文网址:http://my.oschina.net/amstrong/blog/159114 目录[-] 一.TortoiseGit - The coolest Interface to Git V ...

  2. 【转】创建SVN仓库的步骤

    转载地址:http://www.cnblogs.com/ivan0626/p/3783053.html   今天在客户现场联调,两个开发人员之间的代码想用SVN来管理,所以就临时在本地机器上搭建一个S ...

  3. 浅析call和apply

    call, apply都属于Function.prototype的一个方法,它是JavaScript引擎内在实现的,因为属于Function.prototype,所以每个Function对象实例,也就 ...

  4. Uva 1630 折叠串

    题目链接:https://uva.onlinejudge.org/external/16/1630.pdf 题意:折叠串,给一个字符串,相同部分可以折叠,折叠可以嵌套.求最短长度的一种折叠方法.括号和 ...

  5. Java的日期工具类

    package com.tech.jin.util; import java.text.DateFormat; import java.text.ParseException; import java ...

  6. SuiteScript > RecordType internalID采集步骤与结果

    当你碰到一个有很多sub Fields的id需要map到js文件的时候,是不是想到一个个复制到js文件中?建立成Object,library起来,方便不同的module中共享. 一个复制,很烦,很浪费 ...

  7. Life is short

    相信不少码农曾看过类似“life is short, use Python”等之类略带调侃意味的小段子(譬如我),而其也并非不无道理.每门编程语言都是合理的存在,都有它们的优点,及缺陷. 码农们也大多 ...

  8. 初识CEF

    介绍 CEF全称Chromium Embedded Framework,是一个基于Google Chromium 的开源项目.Google Chromium项目主要是为Google Chrome应用开 ...

  9. cmd部分提权常用命令

    ipconfig 显示本地IP地址 net start telnet 开telnet服务 net use z:127.0.0.1c$ 映射对方的C盘 net user 查看所有用户列表 net use ...

  10. shutdown的简单小应用

    关于shutdown的操作命令在此不做详细叙述 1.WIN+R ,输入cmd即打开cmd命令界面 2.输入shutdown /help,出现下图 这里介绍一个关于shutdown的小应用: 比如我们的 ...