作者思路:
作者的重点放在了模型的训练上,而数据的特征处理则没有太多关照,只处理了两列特征。在神经网络模型的训练上作者用了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)