Titanic是kaggle上一个练手的比赛,kaggle平台提供一部分人的特征,以及是否遇难,目的是预测另一部分人是否遇难。目前抽工作之余,断断续续弄了点,成绩为0.79426。
在这个比赛过程中,接触并了解了一些数据挖掘比赛的基本流程,现记录一下。

1. 分析数据

  1. 因为数据量比较小,train有800多条数据,test有400多条数据,因此这里用了execl的数据透视表分析。
  2. 同时python提供pandas库,可以很好的分析数据。

2. 缺失值填充

关于Age,Fare,Embarked三个字段有缺失,官方给了个利用中位数或者众数的做法,同样的我们也可以利用随机森林等机器学习模型来填补缺失值。当然这里我采用的官方的做法,效果不错。

##利用众数填充Embarked缺失值
prodata.Embarked[ prodata.Embarked.isnull() ] = prodata.Embarked.dropna().mode().values ##利用中位数填充Age缺失值 median_age = prodata['Age'].dropna().median()
prodata.loc[ (prodata.Age.isnull()), 'Age'] = median_age ##根据Pclass将人分成3组,然后利用每组的中位数填充Fare缺失值 median_fare = numpy.zeros(3)
for f in range(0,3):
median_fare[f] = prodata[prodata.Pclass == f+1 ]['Fare'].dropna().median()
for f in range(0,3):
prodata.loc[ (prodata.Fare.isnull()) & (prodata.Pclass == f+1 ), 'Fare'] = median_fare[f]

3. 数据处理

3.1 转换为虚拟变量

数据中常常有无法比较大小的值,比如Embarked代表去哪个地方,这个时候如果要使用lr这类的模型,我们需要将Embarked变为虚拟变量,也是哑变量。
举个例子:Embarked这里取得3种值,假设为A、B、C。这里我们就可以用2个新特征标识Embarked,分别是Embarked_A、Embarked_B。

Embarked = “A” => Embarked_A = 1 Embarked_B = 0

Embarked = “B” => Embarked_A = 0 Embarked_B = 1

Embarked = “C” => Embarked_A = 0 Embarked_B = 0

这里不能再添加一个新的特征Embarked_C,原因是如果在添加一个特征会使得特征完全共线性,导致模型无法估计。具体详细见虚拟变量陷阱

##将Embarked转换为哑变量
dummies_df = pandas.get_dummies(prodata.Embarked)
dummies_df = dummies_df.rename(columns=lambda x:'Embarked_'+str(x))
prodata = pandas.concat([prodata,dummies_df.iloc[:,:-1]],axis=1)

3.2 归一化

归一化的方法有很多,比如线性函数归一化,Z-score标准化。后者要求原始数据分布为正态分布。

##标准化归一化Age
prodata['Age_Scaled'] = preprocessing.StandardScaler().fit_transform(prodata.Age)

3.3 离散化(分区间)

将数值类的数据划分成几个区间,这里采用的分位数划分pandas.qcut。

##将Age分成6个区间,然后变化成区间id
Age_bin = pandas.qcut(prodata.Age, 6)
prodata['Age_bin_id'] = pandas.factorize(Age_bin)[0]+1

3.4 数据平滑

因为Fare这一列有一些为0的数据,因此对等于0的部分,稍微做一些平滑处理。

##平滑处理Fare为0的数据
prodata['Fare'][numpy.where(prodata['Fare']==0)[0]] = prodata['Fare'][prodata.Fare.nonzero()[0] ].min() / 100

4. 提炼高级特征

  1. 参照了别人的博客,从Name里面提炼了一些Mr,Mrs等特征,然后转换成哑变量。
  2. 对一些特征进行加减乘除,在下一步降维,以及特征筛选的时候使用。

5. 降维以及特征筛选

5.1 PCA降维

参照博客,对lr使用了PCA降维,但是效果并不好。

X = prodata.values[:, 1::]
y = prodata.values[:, 0]
variance_pct = .99
pca = PCA(n_components=variance_pct)
X_transformed = pca.fit_transform(X,y)
pcaDataFrame = pandas.DataFrame(X_transformed)

5.2 特征筛选

针对如此多的特征,这里可以根据随机森林在训练之后产生的一个特征重要性来筛选特征。

forest = forest.fit( train_data[0::,1::], train_data[0::,0] )
feature_importance = forest.feature_importances_
feature_importance = 100.0 * (feature_importance / feature_importance.max())
fi_threshold = 10
important_idx = numpy.where(feature_importance > fi_threshold)[0]
important_features = prodata[''][important_idx]
print "\n", important_features.shape[0], "Important features(>", \
fi_threshold, "% of max importance)...\n"#, \
important_features
sorted_idx = numpy.argsort(feature_importance[important_idx])[::-1]
get the figure about important features
pos = numpy.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()
train_df = train_df.iloc[:, important_idx].iloc[:, sorted_idx].values
test_df = test_df.iloc[:,important_idx

6. 交叉验证

sklearn自带有cross_validation,可以进行交叉验证。具体的cross_validation用法参考:Cross-validation: evaluating estimator performance

cross_validation.cross_val_score(lr,train_data[0::,1::],train_data[0::,0],cv=5,scoring='precision')

7. 参考资料:

  1. 【原】关于使用sklearn进行数据预处理 —— 归一化/标准化/正则化: http://www.cnblogs.com/chaosimple/p/4153167.html
  2. kaggle数据挖掘竞赛初步:
    http://www.cnblogs.com/north-north/p/4353365.html
    http://www.cnblogs.com/north-north/p/4354775.html
    http://www.cnblogs.com/north-north/p/4358084.html
    http://www.cnblogs.com/north-north/p/4360121.html
  3. Kaggle系列——Titanic 80%+精确度纪录:http://blog.csdn.net/yobobobo/article/details/48194021
  4. wiki 哑变量:https://en.m.wikipedia.org/wiki/Dummy_variable_%28statistics%29
  5. PCA:http://sebastianraschka.com/Articles/2014_pca_step_by_step.html
  6. scikit-learn中PCA的使用方法: http://blog.csdn.net/u012162613/article/details/42192293
  7. 干货:结合Scikit-learn介绍几种常用的特征选择方法:http://dataunion.org/14072.html?utm_source=tuicool
  8. Cross-validation: evaluating estimator performance:http://scikit-learn.org/stable/modules/cross_validation.html

20151007kaggle Titanic心得的更多相关文章

  1. kaggle Titanic心得

    Titanic是kaggle上一个练手的比赛,kaggle平台提供一部分人的特征,以及是否遇难,目的是预测另一部分人是否遇难.目前抽工作之余,断断续续弄了点,成绩为0.79426.在这个比赛过程中,接 ...

  2. kaggle入门项目:Titanic存亡预测(二)数据处理

    原kaggle比赛地址:https://www.kaggle.com/c/titanic 原kernel地址:A Data Science Framework: To Achieve 99% Accu ...

  3. kaggle入门项目:Titanic存亡预测 (一)比赛简介

    自从入了数据挖掘的坑,就在不停的看视频刷书,但是总觉得实在太过抽象,在结束了coursera上Andrew Ng 教授的机器学习课程还有刷完一整本集体智慧编程后更加迷茫了,所以需要一个实践项目来扎实之 ...

  4. 我的MYSQL学习心得(一) 简单语法

    我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据类型 我的MYSQL学习心得(五) 运 ...

  5. NoSql数据库使用半年后在设计上面的一些心得

    NoSql数据库这个概念听闻许久了,也陆续看到很多公司和产品都在使用,优缺点似乎都被分析的清清楚楚.但我心里一直存有一个疑惑,它的出现究竟是为了解决什么问题? 这个疑惑非常大,为此我看了很多分析文章, ...

  6. 我的MYSQL学习心得(二) 数据类型宽度

    我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据类型 我的MYSQL学习心得(五) 运 ...

  7. 我的MYSQL学习心得(三) 查看字段长度

    我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(四) 数据类型 我的MYSQL学习心得(五) 运 ...

  8. 我的MYSQL学习心得(四) 数据类型

    我的MYSQL学习心得(四) 数据类型 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(五) 运 ...

  9. 我的MYSQL学习心得(五) 运算符

    我的MYSQL学习心得(五) 运算符 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据 ...

随机推荐

  1. HDU 4638 Group(分组)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4638 题意:给出一个数列,若干询问.每次询问区间[L,R]的最少有多少段?每一段是连续的一段且这段内的 ...

  2. MS UI Automation Introduction

    MS UI Automation Introduction 2014-09-17 MS UI Automation是什么 UIA架构 UI自动化模型 UI自动化树概述 UI自动化控件模式概述 UI 自 ...

  3. .NET动态加载用户控件并传值的方法

    ASPX.CS里的代码: VoteChat.GetType().GetProperty("vid").SetValue(VoteChat, model.id.ToString(), ...

  4. STL笔记(1)map

    STL笔记(1)map STL之map ZZ from http://hi.baidu.com/liyanyang/blog/item/d5c87e1eb3ba06f41bd576cf.html 1. ...

  5. web工程中web.xml元素加载顺序以及配置实例

    简介 web.xml是web工程的配置文件,容器加载web工程时,会首先从WEB-INF中查询web.xml,并加载其中的配置信息,可以将web.xml认为是web工程的入口. web.xml中包含有 ...

  6. laravel小抄

    原文地址:http://cheats.jesse-obrien.ca/ Artisan // Displays help for a given command php artisan --help ...

  7. jQuery1.9+中删除了live以后的替代方法

    .live() removed The .live() method has been deprecated since jQuery 1.7 and has been removed in 1.9. ...

  8. LA 3027 Corporative Network

    这题感觉和 POJ 1988 Cube Stacking 很像,在路径压缩的同时递归出来的时候跟新distant数组 我发现我一直WA的原因是,命令结束是以字母o结束的,而不是数字0!! //#def ...

  9. 漫游Kafka实战篇之搭建Kafka运行环境

    接下来一步一步搭建Kafka运行环境. Step 1: 下载Kafka 点击下载最新的版本并解压. > tar -xzf kafka_2.9.2-0.8.1.1.tgz > cd kafk ...

  10. Codeforces 435 A Queue on Bus Stop

    题意:给出n队人坐车,车每次只能装载m人,并且同一队的人必须坐同一辆车,问最少需要多少辆车 自己写的时候想的是从前往后扫,看多少队的人的和小于m为同一辆车,再接着扫 不过写出来不对 后来发现把每一队的 ...