Kaggle Titanic Competition-第四部分

接下来继续第四部分,即特征工程中的派生变量。

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

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

举个常见的例子,从电话号码中我们可以提取国家或地区代码,从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'
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值