林楠又敲了两个小时代码。
等他把基础特征都提取完,天已经黑透了。宿舍里亮着灯,窗外一片漆黑。
他伸了个懒腰,脖子咔嚓响了一声。
“卧槽。”他小声骂了一句,揉了揉后颈。
手机又震了。
这次不是陈屿,是小组群消息。
陈屿:“特征工程都差不多了吧?明天下午三点,教学楼302,讨论模型选择。”
沈清言:“收到。”
王浩:“收到。”
林楠盯着屏幕看了几秒,打字:“收到。”
发完消息,他把手机扔桌上,站起来去洗漱。
水龙头哗哗响。
他看着镜子里的自己——黑发,女生的脸,眼神有点疲惫。
明天要讨论模型。
他最近看了不少文献,觉得XGBoost可能更好。但沈清言那种学霸,肯定有自己的想法。
到时候会不会吵起来?
林楠摇摇头,把脸擦干,回床上躺下。
管他呢,到时候再说。
***
第二天下午,林楠提前十分钟到了302教室。
教室里空荡荡的,就他一个人。
他把笔记本拿出来,翻开昨天整理的笔记。上面密密麻麻记着XGBoost的优点缺点,还有几个参考文献。
门开了。
沈清言走进来,背着那个永远干净的书包,穿着白衬衫,袖子挽到手肘。
他看到林楠,点了下头:“早。”
“早。”林楠回了一句。
沈清言在对面坐下,拿出自己的笔记本。翻开,里面是打印的论文,用荧光笔划得花花绿绿。
林楠瞄了一眼,看到几个关键词:逻辑回归、聚类分析、可解释性。
果然。
王浩也来了,笑嘻嘻地打招呼:“两位大佬这么早啊。”
“你也不晚。”沈清言说。
“嘿嘿,我怕迟到被你们骂。”
王浩在林楠旁边坐下,掏出手机开始刷。
又过了两分钟,陈屿推门进来。
他今天穿了件灰色卫衣,头发有点乱,像是刚从床上爬起来。
“都到了?”他扫了一眼,在沈清言旁边坐下。
“刚到。”沈清言说。
陈屿把书包放桌上,掏出电脑:“那开始吧。特征工程都搞定了?”
“我这边好了。”林楠说。
“我也是。”沈清言说。
王浩举手:“我也……应该好了吧,按你们给的代码跑的。”
陈屿点头:“行。那接下来就是模型选择。都什么想法?”
教室里安静了几秒。
沈清言先开口:“我建议用传统的回归模型,结合聚类。”
他翻开笔记本,推到桌子中间:“这是几篇论文,都用了类似的方法。优点是可解释性强,结果容易分析,而且实现简单。”
林楠看着那些论文标题,确实都是顶会的文章。
“但是……”他小声说。
沈清言抬眼看他:“你说。”
林楠深吸一口气,把自己的笔记本也推过去:“我看了最近的一些研究,集成学习模型,比如XGBoost,在预测精度上可能更好。”
他指着自己整理的表格:“尤其是在用户行为预测这种问题上,树模型能处理非线性关系,而且抗过拟合能力强。”
沈清言皱眉:“但可解释性差。教授说了,最终报告要写清楚分析过程。”
“可以加特征重要性分析。”林楠说,“也能看出哪些特征重要。”
“那不够直观。”沈清言摇头,“回归模型可以直接给出系数,每个特征的影响一目了然。”
“可是精度……”
“精度差一点没关系,我们这个项目重点不是拼算法,是分析过程。”
“但预测准一点总没错吧?”
两个人你一句我一句,语速越来越快。
王浩在旁边听得直眨眼,左看看右看看,不敢插话。
陈屿一直没说话,靠在椅背上,手指轻轻敲着桌面。
等林楠和沈清言都停下来喘气的时候,他才开口。
“都说完了?”
林楠点头。
沈清言也点头。
“行。”陈屿坐直身体,“那咱们一条一条理。”
他看向沈清言:“你的方案,优点是可解释性强,实现简单,对吧?”
“对。”
“缺点呢?”
沈清言想了想:“可能精度不够高,尤其是面对复杂模式的时候。”
陈屿记下来,又看向林楠:“你的方案,优点是预测精度可能更高,能处理复杂关系。”
林楠点头。
“缺点?”
“实现复杂一点,可解释性差,而且……”林楠顿了顿,“我没实际做过,可能会踩坑。”
“时间呢?”陈屿问,“两种方案,大概各需要多久?”
沈清言算了算:“我的方案,三天能出初步结果。”
林楠犹豫了一下:“XGBoost……我可能需要五天,还得调参。”
教室里又安静了。
王浩小声说:“那……咱们用哪个?”
没人回答。
林楠看着自己的笔记,心里有点堵。
他知道沈清言说得有道理。这个项目不是算法比赛,教授要看的是分析过程。可解释性确实重要。
但他就是觉得,XGBoost可能更好。
而且……他花了那么多时间看文献,整理了那么多资料。
要是就这么被否了,总觉得……
“我有个想法。”陈屿突然说。
三个人都看向他。
“沈清言的方案,作为基线模型。”陈屿说,“林楠的方案,作为优化尝试。”
沈清言挑眉:“什么意思?”
“就是两个都做。”陈屿说,“沈清言按你的思路,三天出初步结果,咱们先有个东西可以分析。林楠同时做XGBoost,作为对比。最后看哪个效果好,或者能不能融合。”
他顿了顿:“这样既保证了进度,又给了新技术尝试的机会。”
王浩一拍大腿:“这个好啊!两全其美!”
沈清言想了想,看向林楠:“你觉得呢?”
林楠愣了下。
他没想到陈屿会提出这种方案。
“我……可以。”他说,“但我可能需要帮忙,有些地方我不太熟。”
“我可以帮你。”陈屿说,“XGBoost我做过。”
林楠看向他。
陈屿表情很自然,就像在说“今天天气不错”。
“那就这么定了。”沈清言合上笔记本,“我没意见。”
“我也没意见。”王浩举手。
林楠点头:“好。”
“那分工。”陈屿拿出手机,“沈清言负责回归模型和聚类,王浩辅助,主要做可视化部分。林楠和我负责XGBoost,林楠主做,我辅助调试。”
他看向林楠:“有问题随时找我。”
林楠又点头:“嗯。”
“行,散会。”陈屿站起来,“沈清言,你今天能开始吗?”
“可以。”
“林楠,你那边需要什么资料,发群里。”
“好。”
“王浩,你盯着点时间,别摸鱼。”
“哎呀组长,我啥时候摸鱼了……”
几个人收拾东西往外走。
林楠走在最后,把笔记本塞进书包。
陈屿在门口等他。
“一起走?”他问。
林楠愣了一下:“啊?哦,好。”
两个人并排走下楼梯。
教学楼里人来人往,都是刚下课的学生。
“刚才讨论的时候,”陈屿突然说,“你讲得挺好。”
林楠脚步一顿。
“条理清楚,论据也足。”陈屿继续说,“看得出来花时间了。”
林楠耳朵有点热。
“没有……就是看了点文献。”
“能主动看文献,提新想法,已经很不错了。”陈屿说,“很多组都是组长说啥就是啥。”
林楠不知道该说什么。
他低着头,盯着脚下的台阶。
“对了,”陈屿又说,“跟教授汇报的事,我去说。”
林楠抬头:“啊?”
“技术路线确定,得跟教授说一下。”陈屿说,“我去汇报就行,你不用管。”
“可是……”
“你专心做模型。”陈屿停下脚步,看着他,“沟通的事我来。”
林楠张了张嘴。
他想说,我可以自己去。
他想说,不能总让你帮忙。
但话到嘴边,又咽回去了。
因为他确实……不太想跟教授面对面说话。
每次去见教授,他都紧张,怕说错话,怕被问住。
陈屿好像看出来了。
“就这样。”他说,“有问题吗?”
林楠摇头:“没。”
“那行。”陈屿继续往前走,“晚上我把XGBoost的示例代码发你,你可以参考。”
“谢谢。”
“客气什么。”
走出教学楼,外面阳光很好。
林楠眯了眯眼。
“我去图书馆。”陈屿说,“你呢?”
“我回宿舍。”
“行,晚上联系。”
陈屿挥挥手,朝图书馆方向走了。
林楠站在原地,看着他背影。
心里有种很奇怪的感觉。
像是……松了口气。
又像是……有点过意不去。
他摇摇头,往宿舍走。
路上碰到苏晓。
“楠楠!”苏晓跑过来,“干嘛呢?一脸呆样。”
“刚开完会。”林楠说。
“项目啊?”苏晓挽住他胳膊,“顺利吗?”
“还行。”
“陈屿呢?他没欺负你吧?”
林楠笑了:“他欺负我干嘛?”
“那可说不准。”苏晓眨眨眼,“不过我看他最近对你挺上心的。”
林楠心里一跳:“别瞎说。”
“我哪儿瞎说了。”苏晓撇嘴,“他以前可没这么热心帮人做项目。”
“那是因为他是组长。”
“组长咋了?组长就得管这么细?”
林楠不说话了。
苏晓看他那样,也不逗他了:“行了行了,不说了。吃饭去不?”
“还不饿。”
“那我先去食堂了。拜拜!”
苏晓蹦蹦跳跳走了。
林楠回到宿舍,关上门。
他把书包扔桌上,坐到椅子上。
发了会儿呆。
然后打开电脑,登录邮箱。
陈屿的邮件已经发过来了。
附件里是一个压缩包,解压后是几个Python文件,还有详细的注释。
林楠点开一个文件,一行行看。
代码写得很干净,注释也清楚。
他看了一会儿,开始动手改。
把自己的数据加载进去,调整特征。
敲代码的时候,他脑子里又冒出刚才开会的情景。
沈清言冷静的分析。
陈屿提出的折中方案。
还有最后那句话——“你讲得挺好”。
林楠停下打字,看着屏幕。
他忽然觉得,自己好像……没那么害怕了。
以前他总怕说错话,怕被人笑话,怕自己的意见不值钱。
所以能不说就不说,能躲就躲。
但今天,他把自己想的说出来了。
虽然紧张,虽然磕巴。
但说出来了。
而且……有人听。
还有人肯定。
林楠继续敲代码。
嘴角不自觉地扬起来。
***
晚上八点,林楠给陈屿发消息。
“代码跑通了,但准确率不高,只有70%。”
陈屿秒回:“参数调了吗?”
“调了几个,效果不明显。”
“特征呢?有没有试过不同的组合?”
“还没。”
“明天我看看。今天先休息吧。”
林楠看着这句话,想了想,打字:“你今天帮我跟教授汇报,教授怎么说?”
“没说什么,就说按我们的方案做。”
“他没问什么?”
“问了几个技术细节,我回答了。”
林楠盯着屏幕。
他想问,教授有没有问为什么选XGBoost。
他想问,教授有没有质疑他们的方案。
但他没问。
因为他知道,就算问了,陈屿也会说“没事”。
这个人就是这样。
该扛的事,他默默扛了。
该帮的忙,他自然就帮了。
不会邀功,不会抱怨。
林楠打字:“谢谢。”
陈屿回了个表情包,一只猫在点头。
林楠笑了。
他关掉聊天窗口,继续看代码。
又调了两个参数,准确率提到72%。
还是不高。
但他不着急了。
慢慢来,总能搞定的。
***
第二天下午,陈屿来宿舍找林楠。
敲门声响起的时候,林楠正趴在桌子上睡觉。
他昨晚熬到两点,早上又早起上课,中午实在撑不住,回来补觉。
“谁啊……”他迷迷糊糊爬起来,去开门。
门外是陈屿。
“睡着了?”陈屿看他眼睛都睁不开。
“嗯……刚醒。”林楠揉揉眼睛,“进来吧。”
陈屿走进来,把书包放桌上。
林楠去洗手间洗了把脸,清醒了点。
“代码我看了。”陈屿打开电脑,“问题可能出在特征工程上。”
林楠凑过去看。
陈屿指着屏幕:“你看这个消费金额特征,你直接用的原始值,但数据分布偏得厉害,大部分是小额消费,少数几个大额消费会把模型带偏。”
“那怎么处理?”
“取对数,或者分桶。”陈屿说,“试试。”
林楠坐下,开始改代码。
陈屿拉过旁边的椅子,坐在他旁边看。
宿舍里很安静,只有敲键盘的声音。
林楠改完,重新跑模型。
准确率涨到75%。
“好点了。”他说。
“再看看其他特征。”陈屿凑近屏幕,“这个消费时段,你分成早中晚了?”
“嗯。”
“可以再细一点,比如分成六个时段。”
“行。”
林楠继续改。
陈屿就在旁边看着,偶尔指一下哪里可以优化。
两个人的距离很近。
林楠能闻到陈屿身上洗衣液的味道,很淡,很干净。
他手指顿了一下。
“怎么了?”陈屿问。
“没、没什么。”林楠赶紧继续敲。
又调了几个特征,准确率慢慢爬到78%。
“差不多了。”陈屿说,“剩下的得靠调参和交叉验证。”
“嗯。”
林楠保存代码,伸了个懒腰。
一转头,发现陈屿正看着他。
“干嘛?”林楠下意识摸脸,“我脸上有东西?”
“没有。”陈屿说,“就是觉得,你认真做事的时候,挺像样的。”
林楠耳朵又热了。
“什么像样不像样的……”
“就是夸你。”陈屿站起来,“走,吃饭去。”
“现在?”
“都六点了,你不饿?”
林楠看了眼时间,还真是。
他站起来,拿上手机和钥匙:“走吧。”
两个人下楼。
食堂里人很多,排队打饭。
打好饭找位置,转了一圈才找到个角落的桌子。
坐下,开吃。
陈屿吃饭很快,但不算粗鲁。
林楠小口小口吃,时不时偷瞄他一眼。
“看我干嘛?”陈屿突然问。
林楠呛了一下:“谁看你了!”
“那你老往我这边瞟。”
“我……我看那边窗口人多不多。”
陈屿笑了,没拆穿他。
吃完饭,陈屿说要去买水。
林楠说我也去。
小卖部门口,陈屿拿了两瓶矿泉水,付钱。
递给林楠一瓶。
“谢谢。”
“客气。”
两个人往回走。
天已经黑了,路灯亮起来。
“林楠。”陈屿突然叫他的名字。
“嗯?”
“以后有想法,就像今天这样,直接说。”陈屿说,“不用怕。”
林楠脚步慢下来。
“我……没怕。”
“没怕?”陈屿看他,“开会的时候,你手都在抖。”
林楠愣住。
他以为自己藏得很好。
“我看见了。”陈屿说,“但你说得挺好,所以没关系。”
林楠不知道该说什么。
他低头看着手里的矿泉水瓶。
“沈清言那个人,就是那样。”陈屿继续说,“他对事不对人,你跟他争技术,他不会生气。”
“我知道。”
“但你还是紧张。”
林楠不说话了。
是啊,他还是紧张。
紧张被人否定,紧张被人笑话。
紧张自己那点好不容易攒起来的自信,一下子就被打碎。
“慢慢来。”陈屿说,“多说几次就好了。”
林楠抬头看他。
路灯的光照在陈屿脸上,轮廓很柔和。
“你……”林楠犹豫了一下,“你为什么帮我?”
陈屿挑眉:“什么为什么?”
“就是……”林楠组织语言,“帮我跟教授汇报,帮我调代码,现在还……鼓励我。”
陈屿想了想。
“因为你是组员。”他说,“组员做得好,项目才能成。”
“就这样?”
“不然呢?”
林楠不说话了。
他觉得陈屿没说实话。
但又不知道该怎么问。
“行了,别想那么多。”陈屿拍拍他肩膀,“回去早点休息,明天继续。”
“嗯。”
走到宿舍楼下,两个人分开。
林楠上楼,回到宿舍。
关上门,他靠在门板上,发了会儿呆。
然后拿出手机,打开和陈屿的聊天窗口。
他想说点什么。
但打了几个字,又删了。
最后只发了句:“明天见。”
陈屿回:“明天见。”
林楠放下手机,去洗漱。
镜子里的自己,眼睛亮亮的。
他看了几秒,忽然笑了。
笑得有点傻。
但他不在乎。
今天,他提出了自己的想法。
今天,他的想法被采纳了。
今天,有人肯定了他。
虽然只是个小项目,虽然只是几句话。
但对他来说,很重要。
非常非常重要。
林楠关掉水龙头,擦干脸。
回到桌前,打开电脑。
他要继续调参。
要把准确率提到80%以上。
要让陈屿看看,他林楠,也能把事做好。
窗外,夜色渐深。
宿舍楼里灯火通明。
敲键盘的声音,轻轻响着。