kaggle Titanic心得
Titanic是kaggle上一个练手的比赛,kaggle平台提供一部分人的特征,以及是否遇难,目的是预测另一部分人是否遇难。目前抽工作之余,断断续续弄了点,成绩为0.79426。
在这个比赛过程中,接触并了解了一些数据挖掘比赛的基本流程,现记录一下。
1. 分析数据
- 因为数据量比较小,train有800多条数据,test有400多条数据,因此这里用了execl的数据透视表分析。
- 同时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标准化。后者要求原始数据分布为正态分布。
##标准化归一化Ageprodata['Age_Scaled'] = preprocessing.StandardScaler().fit_transform(prodata.Age)
3.3 离散化(分区间)
将数值类的数据划分成几个区间,这里采用的分位数划分pandas.qcut。
##将Age分成6个区间,然后变化成区间idAge_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. 提炼高级特征
- 参照了别人的博客,从Name里面提炼了一些Mr,Mrs等特征,然后转换成哑变量。
- 对一些特征进行加减乘除,在下一步降维,以及特征筛选的时候使用。
5. 降维以及特征筛选
5.1 PCA降维
参照博客,对lr使用了PCA降维,但是效果并不好。
X = prodata.values[:, 1::]y = prodata.values[:, 0] variance_pct = .99pca = 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 = 10important_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_featuressorted_idx = numpy.argsort(feature_importance[important_idx])[::-1]get the figure about important featurespos = numpy.arange(sorted_idx.shape[0]) + .5plt.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].valuestest_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. 参考资料:
- 【原】关于使用sklearn进行数据预处理 —— 归一化/标准化/正则化:http://www.cnblogs.com/chaosimple/p/4153167.html
- kaggle数据挖掘竞赛初步:http://www.cnblogs.com/north-north/p/4353365.htmlhttp://www.cnblogs.com/north-north/p/4354775.htmlhttp://www.cnblogs.com/north-north/p/4358084.htmlhttp://www.cnblogs.com/north-north/p/4360121.html
- Kaggle系列——Titanic 80%+精确度纪录:http://blog.csdn.net/yobobobo/article/details/48194021
- wiki 哑变量:https://en.m.wikipedia.org/wiki/Dummy_variable_%28statistics%29
- PCA:http://sebastianraschka.com/Articles/2014_pca_step_by_step.html
- scikit-learn中PCA的使用方法: http://blog.csdn.net/u012162613/article/details/42192293
- 干货:结合Scikit-learn介绍几种常用的特征选择方法:http://dataunion.org/14072.html?utm_source=tuicool
- Cross-validation: evaluating estimator performance:http://scikit-learn.org/stable/modules/cross_validation.html
kaggle Titanic心得的更多相关文章
- kaggle& titanic代码
这两天报名参加了阿里天池的’公交线路客流预测‘赛,就顺便先把以前看的kaggle的titanic的训练赛代码在熟悉下数据的一些处理.题目根据titanic乘客的信息来预测乘客的生还情况.给了titan ...
- 20151007kaggle Titanic心得
Titanic是kaggle上一个练手的比赛,kaggle平台提供一部分人的特征,以及是否遇难,目的是预测另一部分人是否遇难.目前抽工作之余,断断续续弄了点,成绩为0.79426.在这个比赛过程中,接 ...
- Kaggle:Titanic: Machine Learning from Disaster
一直想着抓取股票的变化,偶然的机会在看股票数据抓取的博客看到了kaggle,然后看了看里面的题,感觉挺新颖的,就试了试. 题目如图:给了一个train.csv,现在预测test.csv里面的Passa ...
- Kaggle Titanic补充篇
1.关于年龄Age 除了利用平均数来填充,还可以利用正态分布得到一些随机数来填充,首先得到已知年龄的平均数mean和方差std,然后生成[ mean-std, mean+std ]之间的随机数,然后 ...
- Kaggle Titanic solution 纯规则学习
其实就是把train.csv拿出来看了看,找了找规律,调了调参数而已. 找到如下规律: 1.男的容易死,女的容易活 2.一等舱活,三等舱死 3.老人死,小孩活 4.兄弟姐妹多者死 5.票价高的活 6. ...
- kaggle Titanic
# coding: utf-8 # In[19]: # 0.78468 # In[20]: import numpy as np import pandas as pd import warnings ...
- 逻辑回归应用之Kaggle泰坦尼克之灾(转)
正文:14pt 代码:15px 1 初探数据 先看看我们的数据,长什么样吧.在Data下我们train.csv和test.csv两个文件,分别存着官方给的训练和测试数据. import pandas ...
- Kaggle 泰坦尼克
入门kaggle,开始机器学习应用之旅. 参看一些入门的博客,感觉pandas,sklearn需要熟练掌握,同时也学到了一些很有用的tricks,包括数据分析和机器学习的知识点.下面记录一些有趣的数据 ...
- Survival on the Titanic (泰坦尼克号生存预测)
>> Score 最近用随机森林玩了 Kaggle 的泰坦尼克号项目,顺便记录一下. Kaggle - Titanic: Machine Learning from Disaster On ...
随机推荐
- 浅析SQL Server数据库中的伪列以及伪列的含义
SQL Server中的伪列 下午看QQ群有人在讨论(非聚集)索引的存储,说,对于聚集索引表,非聚集索引存储的是索引键值+聚集索引键值:对于非聚集索引表,索引存储的是索引键值+RowId,这应该是一个 ...
- 成熟的C#网络通信框架介绍——ESFramework通信框架
(转自:http://www.cnblogs.com/zhuweisky/archive/2010/08/12/1798211.html) ESFramework通信框架是一套性能卓越.稳定可靠.强大 ...
- (坑)django test在多线程下的问题
问题描述: 使用django自带的test做测试,尝试去数据库中取数据,主线程中没有问题,非主线程中取不到数据. 示例代码: class MyTestCase(TestCase): def setUp ...
- 关于Ubuntu的ssh免密登录
1.打开"终端窗口",输入"sudo apt-get update"-->回车-->"输入当前登录用户的管理员密码"--> ...
- [刷题]算法竞赛入门经典(第2版) 5-4/UVa10763 - Foreign Exchange
题意:有若干交换生.若干学校,有人希望从A校到B校,有的想从B到C.C到A等等等等.如果有人想从A到B也刚好有人想从B到A,那么可以交换(不允许一对多.多对一).看作后如果有人找不到人交换,那么整个交 ...
- 深入理解IOC
1. IoC理论的背景 我们都知道,在采用面向对象方法设计的软件系统中,它的底层实现都是由N个对象组成的,所有的对象通过彼此的合作,最终实现系统的业务逻辑. 图1:软件系统中耦合的对象 如果我们打开机 ...
- python 冒泡排序,递归
冒泡排序:li = [33, 55, 58, 66, 58, 555,20000000000000000000000, 5555,5555, 5, 6, 62,1]for i in range(1,l ...
- event对应的各种坐标
IE8不支持的PageXY 相对于整个页面鼠标的位置 包括溢出的部分 event.pageX; event.pageY; 所有浏览器支持的: 相对于当前浏览器窗口可视区域的坐标event.clie ...
- 前端架构之路:使用Vue.js开始第一个项目
Vue.js做为目前前端最热门的库之一,为快速构建并开发前端项目多了一种思维模式.本文通过一个简单的实例开始上手Vue.js开发. 一.技术准备 笔者建议在开始项目前,对以下两个技术点进行了解. ...
- 开涛spring3(7.3) - 对JDBC的支持 之 7.3 关系数据库操作对象化
7.3.1 概述 所谓关系数据库对象化其实就是用面向对象方式表示关系数据库操作,从而可以复用. Spring JDBC框架将数据库操作封装为一个RdbmsOperation,该对象是线程安全的.可复 ...