kaggle数据挖掘竞赛初步--Titanic<数据变换>
完整代码: https://github.com/cindycindyhi/kaggle-Titanic
特征工程系列:
缺失值填充之后,就要对其他格式有问题的属性进行处理了。比如Sex Embarked这些属性的值都是字符串类型的,而scikit learn中的模型都只能处理数值型的数据,需要将这些原始的字符串类型的数据转为数值型数据。所有数据通常可以分成两种类型:定量与定性。定量的属性(数值属性)通常蕴涵着可排序性,比如在泰坦尼克号数据集中,年龄就是一个定量属性。定性属性(标称 序数 二元属性)的值是一些符号或事务的名称,每个值代表某种类别编码或状态,不是可测量量,是不具有排序意义的,比如Embarked(登船地点)。
一 定性属性的数据变换
对于字符串型的定性属性转换,如果单纯的用数字来代替的化,比如对于Embarked的三个值S Q C分别用1 2 3来代替,模型会把它当成是有顺序的数值属性,对于一些根据距离来确定分类的算法来说,就不能准确运行啦。那么应该怎么将定性属性转为数字呢?
(1)dummy varibles(不知道中文应该说成啥。。虚设属性?)
什么是dummy呢,举个栗子,Emarked属性的取值有三个S Q C,分别代表三个上船地点。dummy这个属性呢,就是向数据集里再加入三个属性暂且命名为Embarked_S Embarkde_Q 和Embarked_C,如果一个人是在S地点上船的,那么这三个属性的值就是(1,0,0),在Q点上船的就是(0,1,0),每个属性都是二元属性,1代表是,0代表否。所以dummy适用于值范围相对较少的属性。
import pandas as pd
#creat dummy varibles from raw data
dummies_df = pd.get_dummies(df.Embarked)
#remana the columns to Embarked_S...
dummies_df = dummies_df.rename(columns=lambda x:'Embarked_'+str(x))
df = pd.concat([df,dummies_df],axis=1)
这样就会3个dummy属性加到数据集里啦,用df.info()看一下:
(2)factorizing(因子分解?)
用dummy可以处理像Embarked这样的值域范围较小的标称属性。对于Cabin(船舱号,A43 B55这种)这种标称属性,用dummy就不好处理了。pandas提供了一个factorize()函数,用以将标称属性的字符串值映射为一个数字,相同的字符串映射为同一个数字。不同于dummy,这种映射最后只生成一个属性。对于Cabin属性,我们可以将其分成两部分,字符串+数字,新建两个属性。对于字符串(A-E & U),可以用factorize()将其处理成数字。
import re
df['CabinLetter'] = df['Cabin'].map( lambda x: re.compile("([a-zA-Z]+)").\
search(x).group() )
df['CabinLetter'] = pd.factorize(df.CabinLetter)[0]
上一步呢,只是把Cabin船舱号前面的字母提出来作为一个新的属性,船舱号中的数字当然也要提出来作为一个新的属性啦。
#plus one for laplace assumption
df['CabinNumber'] = df['Cabin'].map( lambda x: getCabinNumber(x) ).\
astype(int) +1
def getCabinNumber(cabin):
match = re.compile("([0-9]+)").search(cabin)
if match:
return match.group()
else:
return 0
二 定量属性的数据变换
(1)数据规范化
数据规范化通过将数据压缩到一个范围内(通常是0-1或者-1-1)赋予所有属性相等的权重。对于涉及神经网络的分类算法或者基于距离度量的分类和聚类,规范化特别有用。规范化方法有多种,如rescaling logarithmic normalize等,可以在这里找到各种规范化方法的具体实现。但是有些时候并不需要规范化,比如算法使用相似度函数而不是距离函数的时候,比如随机森林,它从不比较一个特征与另一个特征,因此也不许要规范化,关于这个问题,详细信息可以参考这篇文章www.faqs.org/faqs/ai-faq/neural-nets/part2/section-16.html
如果对Age属性进行规范化的话(看最后分类算法使用哪种再确定要不要规范化,如果要规范化的话,其他属性也要处理),代码如下:
if keep_scaled:
scaler = preprocessing.StandardScaler()
df['Age_Scaled'] = scaler.fit_transform(df['Age'])
StandardScaler将数值压缩到[-1,1]区间,计算公式为(2x - max(x) - min(x)) / (max(x) - min(x)).
(2)Binning
就像直方图的bin将数据划分成几块一样,我们也可以将数值属性划分成几个bin,这是一种连续数据离散化的处理方式。我们使用pandas.qcut()函数来离散化连续数据,它使用分位数对数据进行划分,可以得到大小基本相等的bin。以下以Fare(船票价格)为例,对于其他连续属性如Age SibSp等也可以划分成bin。
def processFare():
global df
df['Fare'][df.Fare.isnull()] = df.Fare.dropna().mean()
#zero values divide -- laplace
df['Fare'][np.where(df['Fare']==0)[0]] = df['Fare'][df.Fare.\
nonzero()[0] ].min() / 10
df['Fare_bin'] = pd.qcut(df.Fare, 4)
这样产生的df['Fare_bin']的值是这样的,
0 [0.401, 7.91] 3 (31, 512.329]
1 (31, 512.329] 4 (7.91, 14.454]
2 (7.91, 14.454] 5 (7.91, 14.454]
因为是bin,所以属性都是一个个区间,代表这个数据属于哪个区间。对于这样的数据,我们需要factorize下,转为数值型数据。
df['Fare_bin_id'] = pd.factorize(df.Fare_bin)[0]+1
scaler = preprocessing.StandardScaler()
df['Fare_bin_id_scaled'] = scaler.fit_transform(df.Fare_bin_id)
kaggle数据挖掘竞赛初步--Titanic<数据变换>的更多相关文章
- kaggle数据挖掘竞赛初步--Titanic<派生属性&维归约>
完整代码: https://github.com/cindycindyhi/kaggle-Titanic 特征工程系列: Titanic系列之原始数据分析和数据处理 Titanic系列之数据变换 Ti ...
- kaggle数据挖掘竞赛初步--Titanic<原始数据分析&缺失值处理>
Titanic是kaggle上的一道just for fun的题,没有奖金,但是数据整洁,拿来练手最好不过啦. 这道题给的数据是泰坦尼克号上的乘客的信息,预测乘客是否幸存.这是个二元分类的机器学习问题 ...
- kaggle数据挖掘竞赛初步--Titanic<随机森林&特征重要性>
完整代码: https://github.com/cindycindyhi/kaggle-Titanic 特征工程系列: Titanic系列之原始数据分析和数据处理 Titanic系列之数据变换 Ti ...
- CIKM Competition数据挖掘竞赛夺冠算法陈运文
CIKM Competition数据挖掘竞赛夺冠算法陈运文 背景 CIKM Cup(或者称为CIKM Competition)是ACM CIKM举办的国际数据挖掘竞赛的名称.CIKM全称是Intern ...
- 使用sklearn进行数据挖掘-房价预测(4)—数据预处理
在使用机器算法之前,我们先把数据做下预处理,先把特征和标签拆分出来 housing = strat_train_set.drop("median_house_value",axis ...
- R学习笔记 第五篇:数据变换和清理
在使用R的分组操作之前,首先要了解R语言包,包实质上是实现特定功能的,预先写好的代码库(library),R拥有大量的软件包,许多包都是由某一领域的专家编写的,但并不是所有的包都有很高的质量的,在使用 ...
- R实战 第六篇:数据变换(aggregate+dplyr)
数据分析的工作,80%的时间耗费在处理数据上,而数据处理的主要过程可以分为:分离-操作-结合(Split-Apply-Combine),也就是说,首先,把数据根据特定的字段分组,每个分组都是独立的:然 ...
- 【干货】Kaggle 数据挖掘比赛经验分享(mark 专业的数据建模过程)
简介 Kaggle 于 2010 年创立,专注数据科学,机器学习竞赛的举办,是全球最大的数据科学社区和数据竞赛平台.笔者从 2013 年开始,陆续参加了多场 Kaggle上面举办的比赛,相继获得了 C ...
- 数据挖掘竞赛kaggle初战——泰坦尼克号生还预测
1.题目 这道题目的地址在https://www.kaggle.com/c/titanic,题目要求大致是给出一部分泰坦尼克号乘船人员的信息与最后生还情况,利用这些数据,使用机器学习的算法,来分析预测 ...
随机推荐
- asp.net timer viewstate
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.We ...
- PHP将图片二进制转换
http://www.360doc.com/content/14/0325/10/947551_363526874.shtml
- 第一个python实例--监控cpu
#第一个python实例:监控cpu #/bin/bash/env Python from __future__ import print_function from collections impo ...
- rethinkdb的dataexplorer查询使用
首先安装rethinkdb(只有linux和mac能够安装) $ sudo apt-get install rethinkdb 然后启动: $ rethinkdb 此时8080端口就可以访问本机的数据 ...
- 关于freemaker的一点使用技巧
在做国泰君安2016年中秋送电影票活动中,需要做这样一个手机页面,展示所有中奖用户的中奖信息.如下图: 要求对用户的后记号码中间5位做隐藏处理.最开始的处理方法是在对用户实体的get()方法做处理 / ...
- JAVA程序操作hbase的Maven配置pom.xml文件
由于工作需要,用到Java连接Hbase读写数据.原来的方式是直接将依赖的jar包全部下载下来,然后工程里面引用. 现想重构下,改为使用Maven管理,遇到了各种坑,各种不好使,特总结下. <d ...
- 求System.arraycopy的用法
public class Shuzufuzhi { public static void main(String args[]) { int myArray[]={1,2,3,4,5,6}; in ...
- Github上关于iOS的各种开源项目集合(强烈建议大家收藏,查看,总有一款你需要)
下拉刷新 EGOTableViewPullRefresh - 最早的下拉刷新控件. SVPullToRefresh - 下拉刷新控件. MJRefresh - 仅需一行代码就可以为UITableVie ...
- UIButton的文本与图片的布局
UIButton内部文本和图片的布局是我们日常代码中,不可缺少的部分,按钮默认左边图片右边文本,那要实现左边文本,右边图片,我们该怎么解决呢,上面图片,下面文本又该怎么办呢 其实很简单,今天总结下,目 ...
- SLES 10安装Oracle10gR2笔记
SLES 10安装Oracle10gR2笔记 一. 数据库安装 . 安装C/C++ Compiler gcc --version验证是否安装 . 验证Service Pack版本 SPident –v ...