比赛代码5(NFFM baseline )

代码地址

作者思路:

作者的重点放在了模型的训练上,而数据的特征处理则没有太多关照,只处理了两列特征。在神经网络模型的训练上作者用了K折交叉验证的方法。

代码块:

第一块是download数据,这里就不介绍了

第二块处理float特征

def make_bucket(data,num=10):
#用来定义float特征编码的边界,如若bins=[5,10,15],则若特征值为[7,9,12],则编码为[1,1,2]
#既是定义float编码的规则
    data.sort()
    bins=[]
    for i in range(num):
        bins.append(data[int(len(data)*(i+1)//num)-1])
    return bins
float_features=['Census_SystemVolumeTotalCapacity','Census_PrimaryDiskTotalCapacity']
for f in float_features:
	#填充缺失值
    train[f]=train[f].fillna(1e10)
    test[f]=test[f].fillna(1e10)
    data=list(train[f])+list(test[f])
    bins=make_bucket(data,num=50)
    #给特征编码过程
    train[f]=np.digitize(train[f],bins=bins)
    test[f]=np.digitize(test[f],bins=bins)
#用变量存储特征的名称
features=train.columns.tolist()[1:-1]

之后定义模型的参数(这里运用的是神经网络)

hparam=tf.contrib.training.HParams(
            model='nffm',
            norm=True,
            batch_norm_decay=0.9,
            hidden_size=[128,128],
            k=8,
            hash_ids=int(2e5),
            batch_size=1024,
            optimizer="adam",
            learning_rate=0.001,
            num_display_steps=1000,
            num_eval_steps=1000,
            epoch=1,
            metric='auc',
            init_method='uniform',
            init_value=0.1,
            feature_nums=len(features),
            kfold=5)

之后训练模型

#将从0到train中的样本数量,作为一个集合
index=set(range(train.shape[0]))
#这里是存储要训练的样本,用集合来存储,存储5块,既是用K折来随机训练样本,而且没有重复训练的样本
K_fold=[]
for i in range(hparam.kfold):
    if i == hparam.kfold-1:
    	#若已经到了最后一次抽取,则直接将index的剩余部分直接传给tmp
        tmp=index
    else:
        tmp=random.sample(index,int(1.0/hparam.kfold*train.shape[0]))
        #随机在index中找出五分之一的index值给tmp
    index=index-set(tmp)
    #在总的index中删去已经存储的index
    print("Number:",len(tmp))
    #存储随机抽出来的index值,一个集合为一块,一共存储5块
    K_fold.append(tmp)
    

for i in range(hparam.kfold):
    print("Fold",i)
    #读出记录中某一次随机记录的index值
    dev_index=K_fold[i]
    #在这一块中再随机缩小一倍,存储其index值
    dev_index=random.sample(dev_index,int(0.1*len(dev_index)))
    train_index=[]
    #用除了i和J相等外的K_fold里面的index值来训练模型
    for j in range(hparam.kfold):
        if j!=i:
            train_index+=K_fold[j]
    #用之前定义好的参数创建好一个model
    model=ctrNet.build_model(hparam)
    model.train(train_data=(train.iloc[train_index][features],train.iloc[train_index]['HasDetections']),\
                dev_data=(train.iloc[dev_index][features],train.iloc[dev_index]['HasDetections']))
    print("Training Done! Inference...")
    #记录用测试集测试的结果
    if i==0:
        preds=model.infer(dev_data=(test[features],test['HasDetections']))/hparam.kfold
    else:
        preds+=model.infer(dev_data=(test[features],test['HasDetections']))/hparam.kfold

最后记录结果

pythonsubmission = pd.read_csv('../input/sample_submission.csv')
submission['HasDetections'] = preds
submission.to_csv('nffm_submission.csv', index=False)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值