Brandear拍卖数据挖掘竞赛直播(二)
来源: | 作者:姬哀 | 发布时间: 2020-01-03 | 972 次浏览 | 分享到:

  在前一篇中,我们设计了一个基线,即将会员历史收藏过、竞标过的拍卖作为预测,并加入了一些系数。这样的基线取得了线下0.0464、线上0.0516的成绩。

  实际上,对于这样的题目,我们通常采用的方法是先选择一批拍卖作为候选,然后给这些拍卖进行打分。这里我们还是偷个懒,采用lightgbm算法来训练模型。

  那么我们就要构建一个训练集,然后选取一批候选,再提取一些特征,最后训练一个模型。

  以下我们的分析和测试都是基于线下测试集的。





1. 构建训练集

  训练集显然是要在测试集的基础上再向前平移七天。由于测试集的日序是[-14, -8]这7天,那么训练集的日序就应该是[-21, -15]这七天。

線下訓練參照表 = rbind(
	線下氣入追加表[氣入追加日序 >= 線下測試日序 - 7 & 氣入追加日序 < 線下測試日序, .(會員標識, 拍賣標識, 標籤 = 1)]
	, 線下入札表[入札日序 >= 線下測試日序 - 7 & 入札日序 < 線下測試日序, .(會員標識, 拍賣標識, 標籤 = 2)]
)
線下訓練參照表 = 線下訓練參照表[, .(標籤 = max(標籤)), .(會員標識, 拍賣標識)]
線下訓練會員表 = unique(線下訓練參照表[, .(會員標識)], by = NULL)

線下訓練氣入追加表 = 線下氣入追加表[氣入追加日序 < 線下測試日序 - 7]
線下訓練入札表 = 線下入札表[入札日序 < 線下測試日序 - 7]




2. 选取候选

  候选我们可以暂时先选取目前已有的候选。也就是对于每个会员,我们把她历史上竞标过或收藏过的拍卖作为候选。今后我们还可以继续补充候选。





3. 提取特征


  我一直认为用lightgbm是偷懒的做法,例如此时,昨天我们还要思考如何利用好的时间类信息,今天只要交给lightgbm就可以了。于是我们把拍卖表竞标表收藏表中的各种时间以及它们的统计,包括最小值、最大值、极差等等,都加进去。

  注意拍标表中有一个之前被我们忽略的即决标记(SokketsuFlag)列。即决的意思大概就是达到了一定的价格,使得这个拍卖立刻成交。比如说报春同学前一阵看中了一件连衣裙,起价1000元,即决价格10000元;报春同学说她实在是太喜欢这件连衣裙了,便以10000元的价格直接买下了它。(不过这个信息暂时没什么用。)

图3 即决标记

  拍卖表中有一些和价格、金额有关的信息,包括上面的即决标记,我经过测试发现都没有用,不能使成绩提升,原因不明,留待今后思考。于是我把它们都删掉了。

取得資料 = function(某會員表, 某氣入追加表, 某入札表, 某日序)
{
	候選表 = unique(rbind(
		某氣入追加表[, .(會員標識, 拍賣標識)]
		, 某入札表[, .(會員標識, 拍賣標識)]
	), by = NULL)

	候選表 = merge(候選表, 某氣入追加表[, .(
		氣入追加數 = .N
		, 氣入追加之最小日序 = 某日序 - min(氣入追加日序)
		, 氣入追加之最大日序 = 某日序 - max(氣入追加日序)
		, 氣入追加之日序極差 = max(氣入追加日序) - min(氣入追加日序)
		, 氣入追加之削除標記 = 削除標記[氣入追加日序 == max(氣入追加日序)]
	), .(會員標識, 拍賣標識)], by = c("會員標識", "拍賣標識"), all.x = T)

	候選表 = merge(候選表, 某入札表[, .(
		入札數 = .N
		, 入札之最小日序 = 某日序 - min(入札日序)
		, 入札之最大日序 = 某日序 - max(入札日序)
		, 入札之日序極差 = max(入札日序) - min(入札日序)
	), .(會員標識, 拍賣標識)], by = c("會員標識", "拍賣標識"), all.x = T)

	候選表[is.na(候選表)] = 0

	候選表
}




4. 训练模型和预测

  由于我们要考虑两个标签,竞标收藏,我们需要训练两个模型。

線下訓練資料表 = 取得資料(線下訓練會員表, 線下訓練氣入追加表, 線下訓練入札表, 線下測試日序 - 7)
線下訓練資料表 = merge(線下訓練資料表, 線下氣入追加表[氣入追加日序 >= 線下測試日序 - 7 & 氣入追加日序 < 線下測試日序, .(氣入追加標籤 = 1), .(會員標識, 拍賣標識)], all.x = T)
線下訓練資料表 = merge(線下訓練資料表, 線下入札表[入札日序 >= 線下測試日序 - 7 & 入札日序 < 線下測試日序, .(入札標籤 = 1), .(會員標識, 拍賣標識)], all.x = T)
線下訓練資料表[is.na(線下訓練資料表)] = 0
線下訓練資料表 = cbind(線下訓練資料表[, .(會員標識, 拍賣標識, 氣入追加標籤, 入札標籤)], 線下訓練資料表[, -c("會員標識", "拍賣標識", "氣入追加標籤", "入札標籤")])

線下氣入追加模型 = lgb.train(data = lgb.Dataset(data.matrix(線下訓練資料表[, c(-1:-4)]), label = 線下訓練資料表$氣入追加標籤), objective = "binary", nround = 500, learning_rate = 0.01, max_depth = 6, num_leaves = 127, verbosity = -1)
線下入札模型 = lgb.train(data = lgb.Dataset(data.matrix(線下訓練資料表[, c(-1:-4)]), label = 線下訓練資料表$入札標籤), objective = "binary", nround = 500, learning_rate = 0.01, max_depth = 6, num_leaves = 127, verbosity = -1)

  这里的模型参数我直接用了在之前的比赛中常用的模型参数,没怎么认真调整。

  用上面的两个模型可以预测出两个结果,然后我们简单地做一下加权融合。经过测试发现,竞标模型与收藏模型的比为4:1时效果最佳。此时线下成绩大约为0.0505。





5. 评价和提交

  既然线下有提升,那么就可以提交了。

图5 线上成绩

  线上比线下提升得少了一些,一方面说明我可能线下调得太多了,另一方面也说明这个题目不是特别稳定,这场比赛到最后可能还是要看运气。

  今天虽然提升得不多,但是算是搭好了框架,接下来增加更多的特征和候选大概就可以继续提升。那么今天就到这里。代码见hhhttps://https://www.github.com/sang1yu2/BrandearAuction/tree/master/2uction/tr