窗外的鹏城湾在晨雾中若隐若现,但林晨的视线完全聚焦在屏幕上。
阿里云 p100 实例的远程桌面流畅得让人感动。昨晚,他首次用云端算力完成了行业轮动模型的初步训练,回测曲线那道微微上扬的斜率,像一剂强心针注入了他连月来自学 AI 的疲惫身躯。
然而,兴奋过后是更深的清醒——这只是一个模型,一个未经真正实战检验的“玩具”。
“得找块磨刀石”。林晨喃喃自语,手指在键盘上敲入关键字Kaggle进行搜索。
这个全球最大的数据科学竞赛平台,他早有耳闻,却从未真正踏足。
过去十年做跨境电商后台开发,和数据挖掘、机器学习隔着行业壁垒。如今转型 AI,这里成了检验学习成果、接触真实数据与前沿方法的绝佳战场。
注册过程很简单。
用户名他想了想,敲下“dawncoder”——晨曦编码者,寓意着在 AI 黎明时分起步的编程者。
个人简介栏,他犹豫了一下,没有写“前跨境电商工程师”,而是简洁地填上:“AI 自学实践者,专注于金融时间序列分析”。
主页刷新出来,琳琅满目的竞赛项目让他一时眼花缭乱。
有预测房价的,有识别猫狗图片的,有分析信用卡欺诈的,有预测股票走势的……
目光在“股票价格预测”竞赛上停留了几秒,他最终还是挪开了。
自己的投资系统是更复杂的多市场、多策略体系,直接套用单一股价预测竞赛的框架,可能反而会限制思路。他需要的是更通用的数据预处理、特征工程和模型优化经验。
最后,他选择了一个正在进行中的、相对经典的竞赛:“泰坦尼克号幸存者预测”。
数据量适中,问题清晰(根据乘客信息预测是否幸存),社区讨论和公开代码(Kernel)极其丰富,非常适合新手练手。
点击“Join petition”,下载数据集。
压缩包解压后,几个 cSV 文件躺在文件夹里:
train.csv(训练集,包含特征和是否幸存的标签),
test.csv(测试集,只有特征,需要预测结果),
gender_submission.csv(提交格式示例)。
林晨搓了搓手,打开 Jupyter Notebook,新建了一个名为“titanic_Firsttry”的文件。
他先快速浏览数据:乘客 Id、舱位等级、姓名、性别、年龄、同船兄弟姐妹 / 配偶数量、同船父母 / 子女数量、船票号、票价、客舱号、登船港口。幸存情况是二分类(0 / 1)。
“先从最简单的逻辑回归开始”。他自语道,手指开始在单元格里敲入代码。
导入 pandas、numpy、sklearn,读取数据,查看基本信息、缺失值。
“年龄有缺失,客舱号缺失更多,登船港口也有少量缺失……”他一边记录,一边思考处理方法。
对于年龄,他采用了中位数填充;客舱号缺失太多,暂时放弃这个特征,只提取是否有客舱号作为一个二值特征;登船港口用众数填充。
特征工程方面,他根据常识和快速浏览的讨论区提示,做了几项简单处理:
从姓名中提取称呼(mr、mrs、miss 等)作为新特征,将性别映射为数值,将舱位等级(pclass)视为有序分类特征,计算家庭规模(SibSp + parch + 1),并创建是否独自乘船的特征。
“好了,先跑一个基线模型”。
他将处理后的训练集分割出 20% 作为验证集,用标准化后的特征训练了一个逻辑回归模型。
验证集准确率:78.5%。
林晨挑了挑眉。
这个成绩……在他快速查看的公开排行榜上,目前顶尖队伍的准确率已经超过 82%,甚至 83%。
他这个 78.5%,估计排在很后面。
但他没气馁,这本来就是“第一次”。
他开始尝试其他模型:随机森林、支持向量机、梯度提升树(用 sklearn 的 Gradientboostingclassifier)。
调参是门学问,他暂时采用网格搜索(GridSearchcV)进行简单优化,同时注意使用交叉验证避免过拟合。
一番折腾后,随机森林模型在验证集上达到了 80.1% 的准确率。
提升有限,但聊胜于无。
“特征工程可能还是太粗糙了”。他意识到问题。
于是,他点击竞赛页面的“Kernels”标签,按“投票数”排序,找到几个高赞的公开代码。
点开一个标题为“prehensive data exploration with python”的 Kernel,林晨立刻被吸引住了。
作者不仅用精美的可视化(Seaborn 库)深入分析了每个特征与幸存率的关系,还提出了许多他没想到的特征构造思路:
比如根据票价和舱位等级推断社会地位,根据客舱号前缀推断甲板位置,将年龄分段并与其他特征组合,甚至利用姓氏关联家庭成员可能一起遇难或幸存的情况……
另一个专注于模型集成的 Kernel 更是让他大开眼界。
作者没有只用一个模型,而是构建了一个“投票分类器”(Votingclassifier),融合了逻辑回归、随机森林、梯度提升、xGboost 等多个模型的预测结果,并细致地调整了各模型的权重和超参数。
代码中还使用了更高级的交叉验证策略和评估指标(如 AUc-Roc 曲线)。
“原来差距在这里”。
林晨深吸一口气,既有挫败感,更有一种豁然开朗的兴奋。
他之前的做法,就像一个只学会了步枪射击基础动作的新兵,而顶尖选手已经在熟练运用各种特战装备,研究地形,制定协同战术。
他不再急于提交自己那可怜的 80.1% 准确率的预测结果。
而是沉下心来,像一个贪婪的海绵,吸收着这些公开代码中的精华。
他新建了一个 Notebook,开始模仿着进行更细致的数据探索可视化。
年龄分布与幸存率的关系图显示,儿童和老人存活率更高;性别与舱位等级的交叉分析揭示,头等舱的女性存活率极高;家庭规模与存活率呈现复杂的非线性关系……
基于这些洞察,他重新设计特征。
他借鉴思路,创建了“title”(称呼)特征,将“稀有称呼”如“Lady”“countess”等归为一类;根据客舱号首字母推断“deck”(甲板),缺失的单独归类;结合年龄和性别创建“Ageclass”“AgeSex”等交互特征;甚至尝试对票价进行对数变换以缓解偏态分布。
模型方面,他开始尝试简单的堆叠(Stacking)。
用随机森林、Gbdt 和 SVm 作为第一层模型,用逻辑回归作为第二层元模型进行融合。
调参过程更加小心,他学习了使用随机搜索(RandomizedSearchcV)在更大参数空间内高效寻优,并开始关注学习曲线来判断模型是否欠拟合或过拟合。
重新训练,验证集准确率缓缓爬升到 81.3%、81.7%……
他将这个融合模型在完整的训练集上重新训练,然后对测试集进行预测,生成提交文件。
上传,等待系统评分。
页面刷新,结果出现:
public Score(基于测试集部分数据的公开分数)—— 0.8132。准确率约 81.32%。
他立刻去看排行榜。
密密麻麻的名单,他按分数从高到低寻找自己的名字“dawncoder”。
下滑,再下滑……终于在两千多名的位置找到了自己。
排名:2187 / 4896。
几乎垫底的一半。
林晨看着这个数字,沉默了几秒钟。
然后,嘴角却微微弯起了一个弧度。
没有沮丧,反而有一种踏实的释然。
排名固然难看,但这一趟 Kaggle 初体验,价值远超排名本身。
他亲手处理了真实、杂乱、有缺失的数据;实践了从简单到复杂的特征工程;直观感受到了不同模型的特性与调参影响;更重要的是,他打开了视野,看到了真正的数据科学家是如何思考、如何探索、如何集成创新的。
那些公开的 Kernel 就是最好的免费教材,充满了实战智慧和代码艺术。
他关掉排行榜页面,没有继续在这个竞赛上死磕。
他的目标不是成为 Kaggle 专家,而是汲取养分,浇灌自己的“晨曦一号”系统。
“特征工程可以更精细……模型融合思路值得借鉴……尤其是针对时间序列数据,是不是可以构造更有针对性的滞后特征、滚动统计特征”?
林晨的大脑飞速运转,将刚刚学到的思路与自己正在构建的金融量化系统进行映射。
他新建了一个文档,开始记录本次 Kaggle 之行的收获与反思:
数据探索至关重要:可视化不是点缀,是发现规律、指导特征构造的灯塔。
特征即黄金:很多时候,好的特征比复杂的模型更能提升性能,需要结合领域知识(金融、航运等)进行创造性构造。
模型融合的力量:单一模型有天花板,合理集成多个差异化的模型(异质集成)能有效提升鲁棒性和准确率。
调参需系统:网格搜索、随机搜索、贝叶斯优化,工具要会用,更要理解其背后的原理,避免盲目。
社区与分享:Kaggle 最宝贵的不是奖金,而是这个开放、共享、充满顶尖实践智慧的社区。
写完总结,窗外已是午后。
鹏城湾上空的雾气散尽,阳光洒在海面,泛起片片金鳞。
林晨站起身,活动了一下僵硬的脖颈。
排名 2187 的尴尬数字已然抛在脑后,心中充斥的是一种充盈的收获感和清晰的前行方向。
他的“晨曦一号”智能投资系统,或许也该引入这种“竞赛”思维——不是与人竞赛,而是让不同的子策略、不同的模型版本,在历史数据或模拟环境中不断“竞争”“融合”,优胜劣汰,进化出更强的整体。
思路,越来越清晰了。
下一次,或许可以尝试一个时间序列预测相关的竞赛,直接磨砺金融数据分析的刀锋。