2019大数据挑战赛(特征工程部分代码)

2019年的大数据挑战赛吸引了近5000名参赛者,主要为研究生。比赛流程包括预选赛、初赛、复赛和决赛,对参赛者的代码能力、思考能力、学习能力和团队协作提出高要求。通过初赛的选手能使用在线GPU资源,但需优化代码以避免算力浪费。本文分享了特征工程的部分代码,作为个人学习和未来参考的记录。
摘要由CSDN通过智能技术生成

在这里插入图片描述

网址:2019大数据挑战赛

一些感想:
大数据挑战赛比赛还是挺有含金量的,从参加的人数来说总人数将近5000,多数为高校在读研究生,比赛分预选赛 -> 初赛 -> 复赛 -> 决赛,预选赛通过才能进入正式赛,正式赛每个阶段数据规模又不同、通过初赛的可以使用在线平台GPU算力,当然数据规模也增长到10亿,相对来说算力还是比较紧张,这时候需要对自己写的代码做优化合理分配算力资源,不能出现GPU占用过高卡掉、和算力利用不起来这种情况。然后就是参赛人的能力问题了,这个比赛还是需要多人协作才比较好点,毕竟在这种竞争激烈的赛事中想法多一点总是好的。同时对个人代码能力、思考能力、快速学习能力、协作能力、经验都有很大的要求,总之这个比赛在很大程度上也让我学到了很多东西 O(∩_∩)O

以下仅为特征工程部分代码,主要是一些方法函数,下次使用可以有印象即可,代码比较多,整理起来比较麻烦,仅为自己记录用,有时间会继续详细整理,若有人参考,见谅 <(^-^)>

def get_qAUC(qid_set,Y_pred,Y_test):
    valid1 = pd.DataFrame()
    valid1['query_id'] = qid_set
    valid1["pred_prob"] = Y_pred
    valid1['label'] = Y_test
    vg = valid1.groupby(['query_id'])
    aucs = []
    for i in vg:
        tmpdf = i[1] 
        if len(tmpdf['label'].unique()) != 2:
            aucs.append(0.5)
            continue
        fpr, tpr, thresholds = roc_curve(tmpdf['label'], tmpdf['pred_prob'], pos_label=1)
        aucs.append(auc(fpr, tpr))
    qAUC = np.average(aucs)
    return qAUC
def selectSampleOne(dta, threshold=0.2):
    '''
    根据阈值选择数据样本集,主要是一个query下的title点击个数和总的title数比值作为阈值。
    Input: dta, DataFrame对象; threshold 阈值 默认0.2
    OutPut: 过滤后的DataFrame对象
    
    主要方法是分组计算比值拼接 根据条件筛选
    '''
    lab_mean = dta[['query_id', 'label']].groupby('query_id').mean().rename(columns={
   'label':'lab_mean'})
    dta = pd.merge(dta, lab_mean, on='query_id', how='left')
    dta = dta[(dta['lab_mean'] >= threshold)]
    del dta['lab_mean']
    return dta
def selectSampleTwo(dta, threshold=0.2):
    '''
    根据阈值选择数据样本集,主要是一个query下的title点击个数和总的title数比值作为阈值。
    Input: dta, DataFrame对象; threshold 阈值 默认0.2
    OutPut: 过滤后的DataFrame对象
    
    主要方法是索引计算
    '''
    groupbyed = dta[['query_id', 'label']].groupby('query_id').mean()
    index = groupbyed.index
    lab_mean = groupbyed['label'].values
    
    select = []
    for _ in range(len(lab_mean)):
        if lab_mean[_] > threshold:
            select.append(index[_])

    dta = dta[(np.isin(dta.query_id, np.array(select)))]
    
    return dta
def XGBoostONELR3(X_train, X_test, Y_train, Y_test, X_train_lr, Y_train_lr):
    XGB = xgb.XGBClassifier(nthread=14, learning_rate=0.08, n_estimators=100)
    XGB.fit(X_train, Y_train)
    print('XGB 训练结束------>')
    OHE = OneHotEncoder()
    OHE.fit(XGB.apply(X_train))
    print('ONE 训练结束------>')
    
    ploy = PolynomialFeatures(degree=2).fit(X_train_lr)
    print('ploy 训练结束------>')
    tran = np.hstack((OHE.transform(XGB.apply(X_train_lr)).toarray(),ploy.transform(X_train_lr)))
    print('hstack 训练结束------>')
    LR = LogisticRegression(n_jobs=14, C=0.06, penalty='l1')
    LR.fit(tran, Y_train_lr)
    del tran
    print('LR 训练结束------>')
    
    Y_pred = LR.predict_proba(np.hstack((OHE.transform(XGB.apply(X_test)).toarray(),ploy.transform(X_test))))[:, 1]
    print('XGBoost + LogisticRegression: log_loss', log_loss(Y_test, Y_pred))
    return XGB, OHE, LR, ploy
# query点击率
def query_ctr(df):
    item = "query"
    temp = df.groupby(item,as_index=False)['label'].agg({
   item+'_click':'sum', item+'_count':'count'})
    temp[item+'_ctr'] = temp[item+'_click']/(temp[item+'_count'])
    df = pd.merge(df, temp, on=item, how='left')
    
    return df
## 文本特征
# query、title长度
def get_length(row):
    temp = len(row.strip().split(' '))
    return temp
    
# 判断query是否为title的子集,求交集,差集,对称差集
def get_subset(row):
    temp1 = set(row['query'].strip().split(' '))
    temp2 = row['title'].strip().split(' ')
    
    if temp1.issubset(temp2):
        return 1
    else:
        return 0

def get_inter_length(row):
    temp1 = set(row['query'].strip().split(' '))
    temp2 = set(row['title'].strip().split(' '))
    
    inter_length = len(temp1 & temp2) # 交集
    
    return inter_length

def get_differ_length(row):
    temp1 = set(row['query'].strip().split(
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值