Kaggle Titanic Competition-第四部分
2016-01-12 13:23
411 查看
接下来继续第四部分,即特征工程中的派生变量。
派生变量,顾名思义,指的就是通过一个或多个已存在的变量而产生出的新的变量。前面,我们已经探讨过如何通过最简单的数据转换来产生有价值的派生变量,现在我们来看看通过更复杂的数据变换得到的一些有意思的派生变量。
特征工程里一项重要的内容就是充分运用观察力和创造力来发现新的特征以适应训练模型。这个过程可以说是数据科学里最应该花时间和精力的一部分了,而最基本的数据变换和交互变量的处理并不需要花费多少时间,这些事情甚至可以自动完成,因此,我们需要利用剩下的时间和精力来从原始数据中发掘出新的变量。
举个常见的例子,从电话号码中我们可以提取国家或地区代码,从GPS坐标中我们可以提取国家/州/城市信息。Titanic数据集很简单,但是对于一些字符串类型的属性,我们可以试试。
Name
Names–也许名字长度越长,意味着地位越高,因此更有可能上救生艇?
Title–一个人如何被称呼往往能告知此人的社会地位(以及性别),这些信息对于能否登上救生艇是有影响的
FamilyID–利用创造力通过联系多个变量,从姓氏以及家庭成员数目识别家庭成员,而产生的一个非常有意思的变量。
Ticket
对于Ticket属性也需要处理,处理之后可以得到一些结论如下:Ticket字段有的全是数字有的是字母和数字的集合;约25%的数据有前缀,前缀共有45种,如果把 . 和 / 去掉的话还剩29种;数字部分也有一定的规律:以1开头的一般是一等舱2开头的是二等舱3开头的是三等舱,4-9开头的大都是三等舱。以上这些数据告诉我们处理Ticket是有意义的,能够发现其内部蕴涵的信息。
派生变量,顾名思义,指的就是通过一个或多个已存在的变量而产生出的新的变量。前面,我们已经探讨过如何通过最简单的数据转换来产生有价值的派生变量,现在我们来看看通过更复杂的数据变换得到的一些有意思的派生变量。
特征工程里一项重要的内容就是充分运用观察力和创造力来发现新的特征以适应训练模型。这个过程可以说是数据科学里最应该花时间和精力的一部分了,而最基本的数据变换和交互变量的处理并不需要花费多少时间,这些事情甚至可以自动完成,因此,我们需要利用剩下的时间和精力来从原始数据中发掘出新的变量。
举个常见的例子,从电话号码中我们可以提取国家或地区代码,从GPS坐标中我们可以提取国家/州/城市信息。Titanic数据集很简单,但是对于一些字符串类型的属性,我们可以试试。
Name
Names–也许名字长度越长,意味着地位越高,因此更有可能上救生艇?
# how many different names do they have? df['Names'] = df['Name'].map(lambda x: len(re.split(' ', x)))
Title–一个人如何被称呼往往能告知此人的社会地位(以及性别),这些信息对于能否登上救生艇是有影响的
# What is each person's title? df['Title'] = df['Name'].map(lambda x: re.compile(", (.*?)\.").findall(x)[0]) # Group low-occuring, related titles together df['Title'][df.Title == 'Jonkheer'] = 'Master' df['Title'][df.Title.isin(['Ms','Mlle'])] = 'Miss' df['Title'][df.Title == 'Mme'] = 'Mrs' df['Title'][df.Title.isin(['Capt', 'Don', 'Major', 'Col', 'Sir'])] = 'Sir' df['Title'][df.Title.isin(['Dona', 'Lady', 'the Countess'])] = 'Lady' # Build binary features df = pd.concat([df, pd.get_dummies(df['Title']).rename(columns=lambda x: 'Title_' + str(x))], axis=1)
FamilyID–利用创造力通过联系多个变量,从姓氏以及家庭成员数目识别家庭成员,而产生的一个非常有意思的变量。
Ticket
对于Ticket属性也需要处理,处理之后可以得到一些结论如下:Ticket字段有的全是数字有的是字母和数字的集合;约25%的数据有前缀,前缀共有45种,如果把 . 和 / 去掉的话还剩29种;数字部分也有一定的规律:以1开头的一般是一等舱2开头的是二等舱3开头的是三等舱,4-9开头的大都是三等舱。以上这些数据告诉我们处理Ticket是有意义的,能够发现其内部蕴涵的信息。
def processTicket(): global df # extract and massage the ticket prefix df['TicketPrefix'] = df['Ticket'].map( lambda x : getTicketPrefix(x.upper())) df['TicketPrefix'] = df['TicketPrefix'].map( lambda x: re.sub('[\.?\/?]', '', x) ) df['TicketPrefix'] = df['TicketPrefix'].map( lambda x: re.sub('STON', 'SOTON', x) ) # create binary features for each prefix prefixes = pd.get_dummies(df['TicketPrefix']).rename(columns=lambda x: 'TicketPrefix_' + str(x)) df = pd.concat([df, prefixes], axis=1) # factorize the prefix to create a numerical categorical variable df['TicketPrefixId'] = pd.factorize(df['TicketPrefix'])[0] # extract the ticket number df['TicketNumber'] = df['Ticket'].map( lambda x: getTicketNumber(x) ) # create a feature for the number of digits in the ticket number df['TicketNumberDigits'] = df['TicketNumber'].map( lambda x: len(x) ).astype(np.int) # create a feature for the starting number of the ticket number df['TicketNumberStart'] = df['TicketNumber'].map( lambda x: x[0:1] ).astype(np.int) # The prefix and (probably) number themselves aren't useful df.drop(['TicketPrefix', 'TicketNumber'], axis=1, inplace=True) def getTicketPrefix(ticket): match = re.compile("([a-zA-Z\.\/]+)").search(ticket) if match: return match.group() else: return 'U' def getTicketNumber(ticket): match = re.compile("([\d]+$)").search(ticket) if match: return match.group() else: return '0'
相关文章推荐
- 用Python从零实现贝叶斯分类器的机器学习的教程
- My Machine Learning
- 机器学习---学习首页 3ff0
- 反向传播(Backpropagation)算法的数学原理
- 也谈 机器学习到底有没有用 ?
- 量子计算机编程原理简介 和 机器学习
- 初识机器学习算法有哪些?
- 10个关于人工智能和机器学习的有趣开源项目
- 机器学习实践中应避免的7种常见错误
- 机器学习书单
- 北美常用的机器学习/自然语言处理/语音处理经典书籍
- 如何提升COBOL系统代码分析效率
- 自动编程体系设想(一)
- 自动编程体系设想(一)
- 支持向量机(SVM)算法概述
- 神经网络初步学习手记
- 常用的分类评估--基于R语言
- 开始spark之旅
- spark的几点备忘
- 关于机器学习的学习笔记(一):机器学习概念