您的位置:首页 > 其它

Kaggle Titanic Competition-第四部分

2016-01-12 13:23 411 查看
接下来继续第四部分,即特征工程中的派生变量。

派生变量,顾名思义,指的就是通过一个或多个已存在的变量而产生出的新的变量。前面,我们已经探讨过如何通过最简单的数据转换来产生有价值的派生变量,现在我们来看看通过更复杂的数据变换得到的一些有意思的派生变量。

特征工程里一项重要的内容就是充分运用观察力和创造力来发现新的特征以适应训练模型。这个过程可以说是数据科学里最应该花时间和精力的一部分了,而最基本的数据变换和交互变量的处理并不需要花费多少时间,这些事情甚至可以自动完成,因此,我们需要利用剩下的时间和精力来从原始数据中发掘出新的变量。

举个常见的例子,从电话号码中我们可以提取国家或地区代码,从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'
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息