【Shopee I’m the Best Coder Challenge! 2020】[Open] 2nd Place 參賽心得與解法分享

梁文宣(Shiuan)
11 min readDec 2, 2020

--

2020 Shopee Best Coder競賽《全台最大數據分析競賽上線啦》

參賽動機

  • 了解其他行業面對的資料命題與Solution
  • 學習如何在時間壓力下用程式語言解決陌生問題
  • 蝦皮是個不錯的公司... (You know what I mean)

競賽簡介

在此引用台灣蝦皮官方說法:

I’m the Best Coder! Challenge 2020 此競賽為一日數據分析競賽,參賽者在現場分析複雜的問題陳述並檢查實際數據資料庫以解決實際遇到的商業問題。

Shopee 技術團隊設計了數據分析相關問題,參與者必須分析資料庫並從中得出有效結論,並在指定的時間內解決問題。

參加者提供對於數據思維、程式應用感興趣之參賽者實際體驗及線上解決商業問題。

由於今年6~8月才報名了2020 Shopee Code League馬拉松競賽,8次競賽全程都能線上完成,因此對這次比賽「實體Hackthon x Kaggle評分」的設計感到特別疑惑:「為什麼已經花錢把比賽架在Kaggle了、還要花大錢辦租場地辦實體競賽?」(錢太多?)

個人認為猜測兩個原因:

  1. 透過實體活動擴大HR招募聲量
  2. 只招募Shopee TW → 在疫情下能實體競賽的應是能在台灣工作的人

賽前準備

1. WorkShop

雖然賽前有提供幾堂課程,但由於工作繁忙沒有時間上。

不過也透過課程內容可以端倪出:題目難度應該頂多到機器學習,不會有深度學習相關的題目

Workshop課程內容
Shopee為競賽提供之免費課程內容

2. 模擬賽

我們在賽前一週與另外一隊友軍辦一場模擬賽

在賽前說明會中我們得知有兩個重點:

  • 機器學習能幫助解決問題,主辦單位更樂見使用有創意的方法
  • 比賽只有兩小時

事此,我們做出3個決定,並透過模擬賽來試驗。

  1. 我們需要在賽前準備好Template、一些常用的整變數function
  2. 因為時間只有兩小時,我們全力準備ML題目,不考慮DL算法
  3. 必須事前角色分工各司其職避免重工,妥善利用這2小時。

角色分工

起初我們將團隊分為4個角色:

任務分工草稿

A. 時程掌控:掌握各成員進度、任務配發

B. 商業分析:理解題意、使用domain想創新變數

C. 程式主Own:準備ML template、盡可能快速產出baseline、統整所有變數與code

D. 程式Support:輔助C幫忙產出程式碼

以上每個角色除了描述內容外,都還要整變數 → 變數為王、調參為輔

透過模擬賽,我們能驗證這4個role的分工是否有效、並找出各自適合的角色 → 很多隱藏的性格在時間壓力下會表露出來,藉此找到適合自己的角色

經過2次模擬賽後,最終我們把B與C的角色融合(同樣2人),並由A場控及分派任務,由C主hold程式pipeline

競賽日

由於當天競賽下午開始,我們這組早上提前約出來在附近餐廳,整理一些程式碼、順便熱身暖手,下午進場時看到滿滿的coder還是蠻緊張興奮的。

2020/11/21 Shopee Best Coder 競賽當日(南港展覽館)

Business Objectives

透過5個月的Shopee交易資料、用戶背景,預測下個月誰會是Shopee的高價值顧客

高價值用戶的定義為每月總GMV(網站成交總金額) 在前百分之30的用戶。 例如,如果用戶貢獻的GMV大於第70個百分位數門檻,則標記為1,其他則標記為0。

Kaggle競賽描述

Task

Predict high-value users in August 2020.

Each user will only have one label which represents whether they are high-value user or not.For each userid, We define label 0 as normal users and label 1 as high-value users

簡單來說就是個二元分類問題,Shopee想要透過預測模型提前知道:「誰會是下個月的Top30% revenue contributors」。競賽網址

競賽中

看完題目的同時C成員便開始套用分類問題的template,剩餘3人開始EDA。

Beginning:

A, B, D 3 人負責讀題目、理解資料,C 負責合併資料、Fit template code,確定吃進去模型的資料該長什麼樣子

1st Sync:

經過15分鐘釐清training 與 testing 預測的資料樣貌,我們制定一個模型可能會吃的格式。

  1. perchase_detail
銷售資料表,團隊認為最能判斷是否為高價值的資料

經過初步分析銷售資料表schema,我提出透過透過groupby + unstack的方式製作每個user的每月份的消費變數,讓模型training吃每個ID(row) x 各個月的消費變數(整成columns)

同時我們也從另外2個dataset做變數

2. user_info

3. login

整完的Dataframe如下

Group by customer後,計算每個月的銷量變成變數( total_2, total_3 分別代表2月/3月總銷量)

2nd Sync:

將所有資料做成簡易變數後,我們直接執行Baseline model,用Xgboost跑出來約0.66,此時排名第三,距離第一0.70有一小段距離。雖然已經超乎預期,但也表示還有進步空間。

feature importance

根據feature importance 發現近期顧客表現更重要:新註冊顧客、近期購買量變化率。

我們的策略是透過feature impotance解讀、執行更多特徵工程優化模型、而非投入hyper parameter調參,畢竟時間只有兩小時、又要避免private score overfitting,我們選擇把重心放在製作新變數。

最終模型新增了60+個變數

因此我們決定將現有變數帶入更多時間上的變化率,最後在兩小時結束前,僅透過4次entry便取得Public Score 0.70308第三名

Private score 揭曉前 Kaggle競賽排名第三

競賽終

最後很幸運的在Private score擠上了第二名,其實從分數上也看到前幾名咬得很緊,運氣不好差個0.01一毛錢都拿不到。

Kaggle Private Score 0.69278

賽後回顧:

在賽後興奮之餘,我們組內也各自分享心得,大家如出一轍的認同這次比賽的關鍵在於有效合作

  • 適性分工:

面對陌生問題的當下,知道自己扮演的角色是什麼。以我們組員而言,可以分成3種個性:

創新:熟悉python、feature engineer產出新變數 → 適合rookie(我)

謹慎:了解變數意義及修正dirty data、熟悉domain、有business acumen→ 我們隊長

抗壓、老練:能隨時被中斷、再回到崗位、熟悉code整合 → 我們的扛霸子

我們也是透過2次的賽前模擬賽,熟悉彼此在壓力下的個性反應、找到屬於自己適合的角色。

  • 隨時同步(Always Sync)

組員之間隨時了解彼此進度、卡的點,並隨時遞交結果(主要由A來掌控各自任務)。因為只有兩小時,切忌埋頭苦幹。記得自己曾在模擬賽時為了一個變數刻了1小時,結果還沒成效。因此在時間壓力下非常需要隨時sync、任務排程優化

上述兩點其實都是透過模擬賽得出的因此整體而言,充分的賽前準備是我們這次得名的一大關鍵。

短短兩小時很難建出什麼厲害的模型、特徵變數,我們認為主辦單位更想要測試的是團隊合作能力,畢竟在職場上很多時候有效合作才是決定一個專案能否成功的關鍵

完整程式碼可參考:

https://github.com/NTU-Sherlock/Shopee-Best-Coder-2020--Open-User-Spending-Prediction/blob/main/Code.ipynb

預測了,然後呢?

「我知道你的模型很準,但所以我該怎麼用你的結果?」

身為一個在數據分析打滾的菜鳥,在進到職場初期,執行分析案時最常遇到的挑戰是:「So what?我該怎麼做?」

能用預測模型解決資料命題是一回事,但這個資料命題背後能有什麼商業應用,則是另一個難題。

回到競賽目標「預測2020年8月的高價值用戶」,一個好的BA/Data Scientist需要...

  1. 要能擬定出一個策略行動
  • 「我們要對未來的高價值用戶做...」

2. 將這個行動目標narrow down成資料命題

  • 「預測8月份Top30% revenue用戶」

而這場比賽我們直接省略了策略行動、資料命題的過程,反倒是:

「儘管預測Top30%revenue就對了,其他的不用考慮」

真實世界很少會有這種情境,建模預測往往只是一個專案的一小環節。

因此在此不妨試想下列2個問題:

  1. 如果你知道某個顧客下個月會是高價值用戶,你現在會對他做什麼行動?
  2. 你會用Top30%銷售額定義高價值嗎?還是會想用什麼其他指標?

把答案回覆給我也好,留在心裡也好,但僅記這會是比提昇AUC還更困難的一件事。

後記

距離第一次參加數據競賽已經過了4年了,回想大三參加的第一場2016 SAS&玉山資料競賽打開這條路的大門,再到2017NTU hackthon現場的不知所措,當下驚慌到只能打開Kaggle Titanic Competition 裝忙......

這4年之間只要有任何相關競賽消息就是先參加再說,前前後後參加了10+場資料競賽都毫無消息,可以說是靠著愈挫愈勇、也可以說是自不量力的莽撞。這次終於順利拿下競賽獎項,總算給了投入數據分析4年的我一點rewards&recognition。

當然,即便沒得名,我未來應該也會頑固的繼續精進資料分析能力,但這次比賽帶來的激勵,肯定是Data science這條漫漫道路上一個振奮人心的ice cream。

感謝你認真的讀完這篇文章,你的支持會是我持續寫作的動力
• 如果你覺得這篇文章不錯,請給我 1~4 個『掌聲』
• 如果這篇文章對你有幫助請給我 5 個以上『掌聲』
• 如果你喜歡這篇文章也歡迎分享與追蹤持續關注我的最新文章

最後給願意看到這邊的你:

很感謝願意看到這邊的你。我現在已經從朝九晚五進公司的金融白領,轉職為遠端上班的幣圈人,目標朝心靈與財富皆自由的創作者邁進。

白天的我是一名資料科學家,晚上則化身為自由創作者,記錄職涯成長、個人觀點、生活反思。
最近我已經從朝九晚五的上班族生活,轉職到一個工時彈性的遠距工作者,展開更自由的職涯,並開始經營《自由宣言》電子報。
《自由宣言》電子報內容包含:1. 資料科學的職涯、遠距辦公經驗談
2. 自學課程推薦&心得
3. 時事觀點、有料Podcast分享
4. 我的自由創作(e.g. 自我反思、夢的解析)
邀請您訂閱加入,跟我一起打造自由人生。

不想錯過的讀者,誠摯邀請你/妳加入我的電子報

--

--

梁文宣(Shiuan)

白天的我是一名資料科學家,晚上則化身為自由創作者,記錄職涯成長、個人觀點、生活反思。 最近我已經從朝九晚五的上班族生活,轉職到一個工時彈性的遠距工作者,展開更自由的職涯,並開始經營《自由宣言》電子報。https://hustling-pioneer-3508.ck.page