问题的提出

泰坦尼克号Titanic的故事众人皆知。我们拿到了泰坦尼克号上的乘客数据的一部分——训练集train.csv,数据集在这里。

数据描述

这个数据集包含以下特征(Feature):

  • PassengerId => 乘客编号;
  • Survived => 获救情况(1为获救,0为未获救);
  • Pclass => 乘客等级(1等舱位,2等舱位,3等舱位);
  • Name => 姓名,字符串型(String);
  • Sex => 性别(male,female),字符串型(String);
  • Age => 年龄,浮点数型(Double);
  • SibSp => 兄弟姐妹及配偶在船数,整数型(Integer);
  • Parch => 父母及子女在船数,整数型(Integer);
  • Ticket => 船票编号,字符串型(String);
  • Fare => 船票价格,浮点数型(Double);
  • Cabin => 乘客船舱,字符串型(String);
  • Embarked => 出发港口(C = Cherbourg;Q = Queenstown;S = Southampton),字符串型(String)。
    可以 把特征分为两类:目标变量和特征项。因为这个数据集的分析目标是预测乘客的获救与否,所以目标变量(也称因变量)为“Survived”,其余变量都为特征项(也称自变量)。目标变量的取值只有两个:“0”和“1”。其中,“0”表示死亡,“1”表示获救,所以这是一个二分类问题。对于分类问题,在KNIME中要求特征项都为字符型。所以要对特征项进行数据预处理,整理为模型需要的数据类型。

数据预处理

  1. 创建工作流,添加文件读取节点
    (1)添加CSV Reader文件读取节点。因为数据原文件为csv文件,所以选择CSV Reader节点。在“Node Repository”的搜索框中输入“CSV Reader”,选择“IO”=>“Reader”下的“CSV Reader”,然后将其拖入工作流编辑器窗口。
    (2)配置CSV Reader节点。在工作流编辑器窗口中双击CSV Reader节点,打开“Configure”,点击Browse,在工作区中选择要输入的泰坦尼克号“train.csv”数据文件,勾选“Has Row Header”,其他的默认配置。然后,点击“OK”。
    (3)执行CSV Reader节点并查看执行结果。

    可以清晰地看到“Age”和“Cabin”两个特征项有缺失值,其他的特征项没有缺失值。此外,“PassengerID”、“Survived”、“Pclass”、“SibSp”、“Parch”特征项都为整数型(Integer),需要把他们变成字符串型(String)。“Age”和“Fare”为浮点数型(Double),需要进行数据离散化。
  2. 数据类型转换
    (1)添加Number to String节点。开始数据清洗,首先把“PassengerID”、“Survived”、“Pclass”、“SibSp”、“Parch”的整数型(Integer)特征项都转换成字符串型(String)。在“Node Repository” 的搜索框中输入“Number to String”,选择“Manipulation”=>“Column”=>“Convert & Replace”下的“Number to String”,然后将其拖入工作流编辑器窗口。
    (2)连接CSV Reader和Number to String节点。
    (3)配置Number to String节点。
    在工作流编辑器窗口中双击Number to String节点,打开“Configure”,在“Exclude”中选择“Age”和“Fare”,排除这两项特征。然后,点击“OK”。
    (4)执行Number to String节点。
    (5)查看Number to String节点的执行结果。右键单击Number to String节点,选择 “Transformed input”,可以看到“PassengerID”、“Survived”、Pclass”、“SibSp”、“Parch”特征项都转换成字符串型(String),特征名之前都有代表String的“S”符号。
  3. 数据初步统计
    (1)添加Statistics节点,对数据进行初步了解。在“Node Repository”中的搜索框中输入“Statistics”,选择“Analytics”=>“Statistics”下的“Statistics”,然后将其拖入工作流编辑器窗口。
    (2)连接Number to String节点和Statistics节点。
    (3)配置Statistics节点。在工作流编辑器窗口中双击Statistics节点,打开“Configure”。在“Include”中选择所有的特征字段,其他的默认配置。然后,点击“OK”。
    (4)执行Statistics节点。
    (5)查看Statistics节点的执行结果。右键单击Statistics节点,选择“Statistics Table”,可以看到在浮点数型数据“Age”和“Fare”的统计结果。

右键单击Statistics节点,选择“Nominal Histogram Table”,可以看到在字符串型变量的统计结果。

还可以通过在“Nominal Histogram Table”中的“No.Missings”按降序排列 “Sort Descending”,查看各特征项中缺失值的个数。

可以看到,“Cabin”、Age”、“Embarked”三列分别存在687、177、2个缺失值。
4. 字符串型变量与目标变量的关系
(1)添加Crosstab节点。开始探索每个特征项与目标变量的关系,把特征项分为数值型特征项和字符串型特征项两类。其中,字符串型特征项需要用到Crosstab节点。数值型特征项需要用到数据可视化方法,使用Conditional Box Plot节点绘制分组箱型图。
首先,探索字符串型变量与目标变量的关系。在“Node Repository”中的搜索框中输入“Crosstab”,选择“Analytics”=>“Statistics”下的“Crosstab(local)”,然后将其拖入工作流编辑器窗口。
(2)连接Number To String和Crosstab(local)节点。
(3)配置Crosstab(local)节点。
探索每个字符串型数据的特征项与目标变量“Survived”的关系。通过分析可以知道,乘客编码“PassengerID”、乘客姓名“Name”及乘客船票号码“Ticket”不会影响乘客的获救率。因此这三个字符串型变量与目标变量关系不用分析。
乘客等级“Pclass”包含1/2/3三个特征值,分别代表1等舱,2等舱,3等舱;乘客等级“Pclass”应该会影响目标变量“Survived”,影响乘客的获救率。
在工作流编辑器窗口中双击“Crosstab(local)”节点,打开“Configure”,“Row variable”设置为乘客等级“Pclass”,“Column variable”设置为“Survived”,“Weight column”设置为“None”。然后,点击“OK”。

(4)执行并查看Crosstab(local)节点的结果。右键单击Crosstab(local)节点,选择“Execute and OpenViews”,会自动弹出结果。
5. 数值型变量与目标变量的关系
(1)添加Conditional Box Plot节点。数值型变量与目标变量的关系可以通过分组箱型图来分析。在“Node Repository”中的搜索框中输入“Conditional Box Plot”,选择“Views”=>“JavaScript”下的“Conditional Box Plot”,然后将其拖入工作流编辑器窗口。
(2)连接Number To String节点和Conditional Box Plot节点。
(3)配置Conditional Box Plot节点。
探索“Age”和“Fare”两个数值型变量与目标变量“Survived”的关系。在工作流编辑器窗口中双击Conditional Box Plot节点,打开“Configure”,把“Category Column”设置为“Survived”,在右边绿色框中选择“Age”和“Fare”两列。在“Selected Column”中设置为“Age”,其他的默认设置。然后,点击“OK”,可以查看到“Age”特征项与目标变量“Survived”的关系。
“Fare”数值型数据的特征项与目标变量“Survived”的关系,则把“Selected Column”设置为“Fare”即可,其他参数不变。
(4)执行并查看Conditional Box Plot节点。
6. 乘客船舱信息提取
(1)添加String Manipulation节点。
Carbin为乘客船舱信息,跟熟知的火车票类似,首个字母决定了船舱的位置,也很大程度上可以反映船票价格和乘客的身份、等级。因此,需要把乘客船舱的首个字母提取出来。在“Node Repository”的搜索框中输入“String Manipulation”,选择“Manipulation”=>“Column”=>“Convert & Replace”=>“String Manipulation”,然后将其拖入工作流编辑器窗口。
(2)连接Number To String节点和String Manipulation节点。
(3)配置String Manipulation节点。
在工作流编辑器窗口中双击String Manipulation节点,打开“Configure”,在“Function”中找到substr函数,在“Expression”中生成“substr(CarbinCarbinCarbin, 0,1)”的表达式。在“Append Column”中输入提取乘客船舱信息后保存的列名“New_Cabin”。然后,点击“OK”。

(4)执行String Manipulation节点。
(5)查看String Manipulation节点的执行结果。右键单击String Manipulation节点,选择“Appended table”,可以看到在原数据集上新增一列“New_Cabin”。
7. 缺失值处理
(1)添加Missing Value节点。
现在开始处理“Cabin”、“Age”、“Embarked”特征项中的缺失值。在本例中,“Age”为连续型数据,可以用中位数或平均值填充;“Embarked”为离散型、字符串型数据,且缺失值只有2个,可用众数填充;“Cabin”也为离散型、字符串型数据,但缺失值687个,可以考虑把缺失值作为特征中的取值,另成一类。
在“Node Repository”中的搜索框中输入“Missing Value”,选择“Manipulation”=>“Column”=>“Transform”=>“Missing Value”,然后将其拖入工作流编辑器窗口。
(2)连接String Manipulation节点和Missing Value节点。
(3)配置Missing Value节点。
在工作流编辑器窗口中双击Missing Value节点,打开“Configure”,在“Column Settings”把“Age”中的缺失值用中位数(Median)来填充,把“Embarked”中的缺失值用众数(Most Frequent Value)来填充,把“New_Cabin”中的缺失值用“NAN”来填充,也就是把缺失值作为特征中的一个取值,另成一类。然后,点击“OK”。
(4)执行Missing Value节点。
(5)查看Missing Value节点的执行结果。右键单击Missing Value节点,选择“Output table”,可以看到“New_Cabin”中的缺失值被“NAN”填充了。
8. 缺失值处理后对数据统计
(1)如前所述,添加、连接、配置、执行数据初步统计Statistics节点。可以看到“Age”、“Cabin”、“Embarked”三个特征项中无缺失值,数据完整。
9. 对船票价格数据离散化
(1) 添加Rule Engine节点。
在前面的数值型数据与获救率的关系分析中,发现获救乘客的船票价格比死亡乘客的船票价格高。因此,船票价格和获救率之间存在关系。船票价格是浮点数型的,将船票价格数据离散化,把连续型数据转换为离散型数据;再根据前面的箱型图,把船票价格划分为[0,10)、[10,50)、[50,100)、[100,+∞)四个区间,用这四个区间代替落入该区间的特征值,增强模型的鲁棒性。这时,需要用到“Rule Engine”节点。
在“Node Repository” 的搜索框中输入“Rule Engine”,选择“Manipulation”=>“Row”=>“Other”下的“Rule Engine”,然后将其拖入工作流编辑器窗口。
(2)连接Missing Value节点和Rule Engine节点。
(3)配置Rule Engine节点。
在工作流编辑器窗口中Rule Engine节点,打开“Configure”,在“Expression”中生成如下的表达式(注意表达式中所有的符号均为英文符号)。
FareFareFare < 10 => “very_low”
FareFareFare < 50 => “low”
FareFareFare < 100 => “middle”
TRUE => “high”
在“Append Column”中数据离散后的特征名称“New_Fare”。然后,点击“OK”。
(4)执行Rule Engine节点。
(5)查看Rule Engine节点的执行结果。右键单击Rule Engine节点,选择“Classified values”,可以看到在原数据集上新增一列“New_Fare”。
10. 对年龄特征数据离散化
(1)添加Rule Engine节点。
泰坦尼克号沉没时秉承“妇女和小孩先走”的原则,所以获救与否与年龄段有关系。因此,将年龄特征数据离散化,即连续型变量转换为离散型变量,把年龄划分为[0,18)、[18,65)、[65,+∞)三个区间,用这三个区间代替落入该区间的特征值,增强模型的鲁棒性。这时,需要用到“Rule Engine”节点。
在“Node Repository”的搜索框中输入“Rule Engine”,选择“Manipulation”=>“Row”=>“Other”=>“Rule Engine”,然后将其拖入工作流编辑器窗口。
(2)连接前后两个Rule Engine节点。
(3)配置Rule Engine节点。
在工作流编辑器窗口中双击Rule Engine节点,打开“Configure”,在“Expression”中生成如下的表达式(注意表达式中所有的符号均为英文符号)。
AgeAgeAge < 18 => “child”
AgeAgeAge < 65 => “adult”
TRUE => “senior”
在“Append Column”中输入新增列的列名,“New_Age”。然后,点击“OK”。
(4)执行Rule Engine节点。
(5)查看Rule Engine节点的执行结果。右键单击Rule Engine节点,选择“Classified values”,可以看到新增的列“New_Age”。
11. 导出工作流
选中“File”“Export KNIME Workflow…”,选择一个导出路径,将工作流命名为clearData.knwf。

KNIME数据预处理相关推荐

  1. 机器学习项目中的数据预处理与数据整理之比较

    要点 在常见的机器学习/深度学习项目里,数据准备占去整个分析管道的60%到80%. 市场上有各种用于数据清洗和特征工程的编程语言.框架和工具.它们之间的功能有重叠,也各有权衡. 数据整理是数据预处理的 ...

  2. 机器学习PAL数据预处理

    机器学习PAL数据预处理 本文介绍如何对原始数据进行数据预处理,得到模型训练集和模型预测集. 前提条件 完成数据准备,详情请参见准备数据. 操作步骤 登录PAI控制台. 在左侧导航栏,选择模型开发和训 ...

  3. 深度学习——数据预处理篇

    深度学习--数据预处理篇 文章目录 深度学习--数据预处理篇 一.前言 二.常用的数据预处理方法 零均值化(中心化) 数据归一化(normalization) 主成分分析(PCA.Principal ...

  4. 目标检测之Faster-RCNN的pytorch代码详解(数据预处理篇)

    首先贴上代码原作者的github:https://github.com/chenyuntc/simple-faster-rcnn-pytorch(非代码作者,博文只解释代码) 今天看完了simple- ...

  5. 第七篇:数据预处理(四) - 数据归约(PCA/EFA为例)

    前言 这部分也许是数据预处理最为关键的一个阶段. 如何对数据降维是一个很有挑战,很有深度的话题,很多理论书本均有详细深入的讲解分析. 本文仅介绍主成分分析法(PCA)和探索性因子分析法(EFA),并给 ...

  6. 数据预处理--噪声_为什么数据对您的业务很重要-以及如何处理数据

    数据预处理--噪声 YES! Data is extremely important for your business. 是! 数据对您的业务极为重要. A human body has five ...

  7. 数据预处理(完整步骤)

    原文:http://dataunion.org/5009.html 一:为什么要预处理数据? (1)现实世界的数据是肮脏的(不完整,含噪声,不一致) (2)没有高质量的数据,就没有高质量的挖掘结果(高 ...

  8. 3D目标检测深度学习方法数据预处理综述

    作者 | 蒋天元 来源 | 3D视觉工坊(ID: QYong_2014) 这一篇的内容主要要讲一点在深度学习的3D目标检测网络中,我们都采用了哪些数据预处理的方法,主要讲两个方面的知识,第一个是rep ...

  9. 整理一份详细的数据预处理方法

    作者:lswbjtu https://zhuanlan.zhihu.com/p/51131210 编辑:机器学习算法与Python实战 为什么数据处理很重要? 熟悉数据挖掘和机器学习的小伙伴们都知道, ...

最新文章

  1. MySQL/ACCESS导出一句话拿WebShell后门命令
  2. [SQL]死锁处理语句
  3. RHEL5 下使用syslog-ng构建集中型日志服务器
  4. hadoop hive hbase 集群搭建
  5. linux结束ping进程,linux常用命令
  6. 前端面试题--重要基础知识回顾(一)
  7. 学习Java,容易被你忽略的小细节(2)
  8. 前端学习(3218):批量传递props
  9. Arduino PID自整定库
  10. es6 队列_快速学习ES6(下)
  11. 结合使用 Oracle Coherence 和 Spring Batch 进行高性能数据处理
  12. 修改 oracle 数据库 TNSLSNR.exe 占用 8080 端口
  13. 使用鼠标右击Gite Bash Here 将本地文件上传到 GitHub
  14. Codevs 4909 寂寞的堆
  15. 关于sysmon的基本使用(1)
  16. 【ROS基础】ROS_c++ 语法记录
  17. mysql 1033_MySQL ERROR 1033 (HY000): Incorrect information in file. 处理一例
  18. 浏览器的作用不只是搜索、浏览网页,它还隐藏着这些功能
  19. Bootstrap之按钮的样式
  20. python 笔记:打开nii格式(nibabel 库)

热门文章

  1. Android中获取流量相关数据的方法
  2. 博士毕业于浸会大学计算机系,香港浸会大学童铁军博士为计算机与信息学院师生作学术报告...
  3. H5跳转小程序 (成功案例)
  4. 面对新技术,这才是软件工程师的正确打开方式
  5. 11-wtm附件管理
  6. Vim安装插件管理器Vundle
  7. photoshop部分
  8. 设计原则之开闭原则详解
  9. java开闭原则 例子_Java设计原则—开闭原则(转)
  10. 某211高校食堂饭菜价格贵得离谱惹争议!学生:吃不起饭了!