比赛最终总结
1. 针对 "common_ts" 的数据处理:
common_ts 是 “时间戳” 格式的特征列信息,挖掘数据语义:
① 拆分:针对年、月、日等更小的时间梯度进行新的特征划分,并将其加入特征内部;
② 挖掘数据内涵:时间信息是否具备更深层、更实际的时间语义:如:时间戳数据 是否集中在特定的星期几;
③ 连续性特征:时间信息特征不同于其他普通信息,其连续性不可忽视,通过:滑动窗口等技术可挖掘。
2. 针对 "udmp" 的数据处理:
# 预处理数据:拆分,并转化为独热编码
def udmap_onethot(d):
v = [0] * 9
if d == 'unknown':
return v
d = eval(d)
for i in range(1, 10):
if 'key' + str(i) in d:
v[i - 1] = d['key' + str(i)]
return v
udmap_train = pd.DataFrame(train_data['udmap'].apply(udmap_onethot).tolist(), columns=[f'key{i}' for i in range(1, 10)])
train_data = pd.concat([train_data, udmap_train], axis=1)
udmap_test = pd.DataFrame(test_data['udmap'].apply(udmap_onethot).tolist(), columns=[f'key{i}' for i in range(1, 10)])
test_data = pd.concat([test_data, udmap_test], axis=1)
3. 针对 “数值类” 特征的数据处理:
可以通过寻求最值、频率等方式补充特征;另外值得说明的是,不要忽略一些统计学特征:如中位数,方差等。
4. 特征缩放、标准化、归一化:
① 特征缩放:在本次项目实践中,我运用到 “特征缩放” 的工程技巧,这帮助我取得了一些提升:
代码举例:
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_val_scaled = scaler.transform(X_val)
X_test_scaled = scaler.transform(X_test)
② 标准化及归一化:在做数据特征的比较、挖掘新特征时,有时, “数据尺度” 可能会带来很大影响,通过以上技术可以修正
5. 模型构建 && 交叉验证:
采用 “决策树” 及 “随机森林” 建立模型,最后使用 “交叉验证” 技术,有效提升了一部分 f1 - score。
说明:trick:建议先用较大的的学习率、较小的 k 值去进行训练,最后提分再使用较大的 “k折交叉验证” ,这样实验流程将更为流畅,测试机会将会更多。
6. 避免 “过拟合” ,我做了哪些尝试:
① “过拟合” 的定义:模型过于复杂,泛化能力差(多次实验的平均结果:f1-score 验证集 集中为:0.75;f1-score 训练集接近:0.99,明显过拟合);
② 决策树相关:限制决策树训练深度,调整分裂的叶片数量,早停策略;
③ 特征相关:设置一个阈值,去除贡献度较低的那些特征条目,并重新进行模型迭代训练;
④ 集成模型:通过 “voting” 或 "stacking" 技术,训练并集成多类模型,提升模型决策时的泛化能力;
⑤ 数据增广:之前做过的一个 cv 项目给我的经验,因为可推断:本项目测试集正负样本数极不均衡,可采取:过采样、欠采样、合采本,进行 “样本均衡”。
(推测:15%为正例,85%为负例)
7. 最后说说感想:
这次的训练营是个非常好的平台,比赛难度有梯度,但对新手也十分友好,可以帮助学习者快速入门机器学习竞赛。
可惜这次的实践时间不太够,我跑到一个差不多的分数就开始没管了,但是每次的分享都认真听了,里面确实很多干货,包括我之前忽略的一些信息,都有了更进一步的认知。
希望下次能认真弄个更好的成绩。
另外,上面加粗的字体都是可以深入挖掘的,这些技巧虽未给出相关代码,但是都是我亲身尝试过的可提分策略。