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

1. 分析数据

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

2. 缺失值填充

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

  1. ##利用众数填充Embarked缺失值
  2. prodata.Embarked[ prodata.Embarked.isnull() ] = prodata.Embarked.dropna().mode().values
  3. ##利用中位数填充Age缺失值
  4. median_age = prodata['Age'].dropna().median()
  5. prodata.loc[ (prodata.Age.isnull()), 'Age'] = median_age
  6. ##根据Pclass将人分成3组,然后利用每组的中位数填充Fare缺失值
  7. median_fare = numpy.zeros(3)
  8. for f in range(0,3):
  9. median_fare[f] = prodata[prodata.Pclass == f+1 ]['Fare'].dropna().median()
  10. for f in range(0,3):
  11. 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,原因是如果在添加一个特征会使得特征完全共线性,导致模型无法估计。具体详细见虚拟变量陷阱

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

3.2 归一化

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

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

3.3 离散化(分区间)

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

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

3.4 数据平滑

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

  1. ##平滑处理Fare为0的数据
  2. 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降维,但是效果并不好。

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

5.2 特征筛选

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

  1. forest = forest.fit( train_data[0::,1::], train_data[0::,0] )
  2. feature_importance = forest.feature_importances_
  3. feature_importance = 100.0 * (feature_importance / feature_importance.max())
  4. fi_threshold = 10
  5. important_idx = numpy.where(feature_importance > fi_threshold)[0]
  6. important_features = prodata[''][important_idx]
  7. print "\n", important_features.shape[0], "Important features(>", \
  8. fi_threshold, "% of max importance)...\n"#, \
  9. important_features
  10. sorted_idx = numpy.argsort(feature_importance[important_idx])[::-1]
  11. get the figure about important features
  12. pos = numpy.arange(sorted_idx.shape[0]) + .5
  13. plt.subplot(1, 2, 2)
  14. plt.title('Feature Importance')
  15. plt.barh(pos, feature_importance[important_idx][sorted_idx[::-1]], \
  16. color='r',align='center')
  17. plt.yticks(pos, important_features[sorted_idx[::-1]])
  18. plt.xlabel('Relative Importance')
  19. plt.draw()
  20. plt.show()
  21. train_df = train_df.iloc[:, important_idx].iloc[:, sorted_idx].values
  22. test_df = test_df.iloc[:,important_idx

6. 交叉验证

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

  1. 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. 选错实施顾问公司 ERP项目九死一生

    今天接到一个朋友的电话,他是一家企业老总.这位老总感到非常头疼的是他的企业选择了一款国际上名气很大的ERP软件,但实施效果却强差人意.他的疑问是"不是说只要选对了ERP产品,谁实施都能成功吗 ...

  2. MINA经典入门例子----Time Server

    原文地址 http://blog.sina.com.cn/s/blog_720bdf0501010b8r.html 貌似java的IO.NIO的入门例子都有相关的Time Server Demo.本例 ...

  3. android漂亮的对话框项目sweet-alert-dialog

      漂亮的对话框 sweet-alert-dialog 项目地址: https://github.com/pedant/sweet-alert-dialog android原生的dialog太生硬了, ...

  4. Bundle对象的使用

    在Android开发中,如果要通过一个Activity启动另外一个Activity,需要调用startActivity()函数,这个函数的参数是一个Intent对象,这个对象通常的初始化方式如下: I ...

  5. LA 3644 X-Plosives

    最简单的并查集 多做做水题,加深一下理解 //#define LOCAL #include <cstdio> + ; int parent[maxn]; int GetParent(int ...

  6. UIPikerView

    UIPikerView的属性 1.   numberOfComponents:返回UIPickerView当前的列数 NSInteger num = _pickerView.numberOfCompo ...

  7. POJ 3308 Paratroopers (对数转换+最小点权覆盖)

    题意 敌人侵略r*c的地图.为了消灭敌人,可以在某一行或者某一列安置超级大炮.每一个大炮可以瞬间消灭这一行(或者列)的敌人.安装消灭第i行的大炮消费是ri.安装消灭第j行的大炮消费是ci现在有n个敌人 ...

  8. Ajaxload动态加载动画生成工具的实现(ajaxload的本地移植)

    前言 前段时间看到一个国外的网站,在线生成ajax loading动画.觉得很实用,于是动起了移植到自己网站的念头(一直以来的习惯,看到好的工具总想着移植到本地好好研究).根据以往移植的经验最终把 这 ...

  9. QCon 2015 阅读笔记 - 其他精选主题

    QCon 2015阅读笔记 QCon 2015 阅读笔记 - 移动开发最佳实践 QCon 2015 阅读笔记 - 团队建设 QCon 2015 阅读笔记 - 其他精选主题 以前分享过两个主题:移动开发 ...

  10. yii 打印sql

    $query = TableModel::find()->where([‘xxx’=>xxx]); var_dump($query->prepare(\Yii::$app->d ...