网址: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(