文章目錄
- 目錄
- 1.比賽相關介紹
- 1.1 比賽介紹
- 1.2 數據集介紹
- 1.3 評價標準介紹
- 1.4 個人理解
- 2. 解決方案
- 2.1 統計用戶和event信息
- 2.2 計算用戶相似度
- 2.3 用戶社交關系信息處理
- 2.4 構建event和event相似度數據
- 2.5 活躍度/event熱度數據
- 2.6 構建特征
- 2.7 模型構建和預測
- 3. 遇到的問題
- 4. 總結
目錄
kaggle比賽官網鏈接
下載好的數據集鏈接(百度云,提取碼:ino3)
1.比賽相關介紹
1.1 比賽介紹
根據user actions, event metadata, and demographic information(社交信息)預測用戶對哪個event感興趣
1.2 數據集介紹
共有六個文件:train.csv,test.csv, users.csv,user_friends.csv,events.csv和 event_attendees.csv。
- train.csv 有六列: user,event, invite,timestamp,interested和not_interested。 Test.csv 包含與train.csv相同的列,但interested和not_interested除外。每行對應于在我們的應用程序中向用戶顯示的事件。 event是一個標識我們系統中事件的id。 user是表示系統中用戶的id。 invite 是一個二進制變量,指示用戶是否已被邀請參加該事件。 timestamp是ISO-8601 UTC時間字符串,表示用戶在我們的應用程序中看到事件時的大致時間(+/- 2小時)。 有興趣是一個二進制變量,指示用戶是否單擊了此事件的“感興趣”按鈕; 如果用戶單擊了“興趣”,則為1;如果用戶未單擊該按鈕,則為0。類似地, not_interested是一個二進制變量,指示用戶是否點擊了此事件的“Not Interested”按鈕; 如果用戶單擊按鈕則為1,否則為0。用戶可能會看到一個事件,并且單擊既不感興趣也不感興趣,因此有些行包含0,0作為 感興趣的值,not_interested。
- users.csv包含有關我們的一些用戶(包括列車和測試文件中出現的所有用戶)的人口統計數據,它包含以下列: user_id, locale, birthyear, gender, joinedAt, location和 timezone。 user_id是我們系統中用戶的ID。 locale是一個表示用戶區域設置的字符串,其格式應為 language _ territory。birthyear是一個4位整數,表示用戶出生的年份。 性別是男性還是女性,具體取決于用戶的性別。 joinedAt是ISO-8601 UTC時間字符串,表示用戶首次使用我們的應用程序時。 location 是表示用戶位置的字符串(如果已知)。timezone是一個有符號整數,表示用戶的UTC偏移量(以分鐘為單位)。
- user_friends.csv包含有關此用戶的社交數據,包含兩列:user和friends。 user是我們系統中用戶的id,而 friends是用戶朋友ID的空格分隔列表。
- events.csv 包含有關我們系統中事件的數據,并且有110列。前九列是 event_id,user_id,start_time,city,state,zip,country, lat和lng。 event_id是事件的id,user_id 是創建事件的用戶的id。 城市, 州, 郵編和 國家/地區代表有關場地位置的更多詳細信息(如果已知)。 lat 和lng 是代表場地的緯度和經度坐標的浮點數,四舍五入到小數點后三位。 start_time 是ISO-8601 UTC時間字符串,表示事件計劃何時開始。最后101列需要更多解釋; 首先,我們確定了在我們事件的大型隨機子集的名稱或描述中出現的100個最常見的詞干(通過Porter Stemming獲得)。最后101列是count_1, count_2,…, count_100, count_other,其中 count_N是一個整數,表示第N個最常見詞干出現在此事件的名稱或描述中的次數。 count_other 是其余詞的統計,其莖不是100個最常見的詞干之一。
- event_attendees.csv包含有關哪些用戶參加了各種事件的信息,并包含以下列: event_id,yes,maybe,invite和no。event_id 標識事件。是,也許, 邀請,并且沒有以空格分隔的用戶ID列表,表示用戶表示他們要去,可能去,被邀請或不去參加活動。
從數據介紹主要有3類數據
1.用戶的歷史數據 => 對event是否感興趣/是否參加
2.用戶社交數據 => 朋友圈
3.event相關的數據 => event相關的信息
簡單思考
1.要把更多維度的信息納入考量
2.協同過濾是基于 用戶-event 歷史交互數
3.需要把社交數據 和 event相關信息 作為影響最后結果的因素納入考量
4.視作分類模型, 每一個人 感興趣/不感興趣 是target, 其他影響結果的是feature
5.影響結果的feature包括由協同過濾產出的推薦度
初步思路簡圖
1.3 評價標準介紹
-
對于測試集中的每個用戶,提交事件列表。這些事件為模型預測出的用戶最感興趣到用戶最不感興趣的排序。
-
此競賽的評估指標是前200個推薦的平均精度(任何一個用戶的最大事件數為116,因此200不會產生有意義的限制)。您可以在 Kaggle wiki上找到有關此評估指標的更多信息 。
-
可以從數據頁面下載樣本提交文件。提交文件的格式應如下:
有一個標題:“用戶,事件”
包含兩列
用戶:按排序順序的用戶ID
事件:以空格分隔的推薦事件列表,從用戶最感興趣的事件列表到用戶最不感興趣的事件列表
提交樣本的前幾行:
用戶,事??件
1776192,2877501688 1024025121 4078218285 2972??428928 3025444328 1823369186 2514143386
3044012,2529072432 1532377761 1390707377 1502284248 3072478280 1918771225
4236494,152418051 4203627753 2790605371 799782433 823015621 2352676247 110357109
1.4 個人理解
- 我們需要從users.csv,user_friends.csv,events.csv和 event_attendees.csv文件提取出一些對預測用戶是否會對某些事件感興趣的特征。
- 最終我們需要實現一個模型能夠輸出每個用戶對所有事件的一個感興趣程度,并根據感興趣程度對事件進行降序排序輸出。
2. 解決方案
具體代碼
2.1 統計用戶和event信息
- 1.讀取train.csv和test.csv文件
- 2.統計出用戶和事件信息,構建用戶-索引字典和事件-索引字典
- 3.構建用戶-事件字典和事件-用戶字典
- 4.構建用戶-事件-興趣矩陣
- 5.構建關聯用戶字典和關聯事件字典。
2.2 計算用戶相似度
- 1.讀取user.csv文件
- 2.對user數據結構中的每一列進行處理,主要是將字符型的數據轉換為數值型的數據,其中locale(locale庫進行處理),joinedAt(datetime進行事件處理),location(pycountry進行編碼)。
- 3.將處理后的特征進行歸一化處理。
- 4.通過scipy.spatial.distance庫中的函數計算每兩個用戶之間的相似度,從而構成一個用戶相似矩陣。
2.3 用戶社交關系信息處理
- 1.讀取user_friends.csv文件
- 2.統計每個用戶其朋友的數量(如果你有更多的朋友,可能你性格外向,更容易參加各種活動)
- 3.統計每個用戶其朋友參與事件的情況,構建用戶-用戶朋友參與事件情況矩陣。(如果你朋友會參加某個活動,可能你也會跟隨去參加一下)
2.4 構建event和event相似度數據
- 1.讀取events.csv文件
- 2.將數據按照屬性是否有具體的意義劃分為兩個矩陣
- 3.對具有意義的屬性列進行hash處理,其余的列復制即可。
- 4.對上面的2個矩陣進行歸一化處理
- 5.對上面兩個矩陣分別計算用戶-event和event-event相識度,構建兩個相似度矩陣。
2.5 活躍度/event熱度數據
- 1.讀取event_attendees.csv文件
- 2.統計每個活動參加和不參加的人數,從而計算出互動的活躍度。
2.6 構建特征
- 1.讀取之前幾個步驟保存下來的文件
- 2.基于之前的得到的特征,根據User-based協同過濾,得到event的推薦度;
- 3.根據基于物品的協同過濾,得到Event的推薦度;
- 4.基于用戶的朋友個數來推斷用戶的社交程度。朋友對用戶的影響
- 5.活動本身的熱度
- 6.把前面user-based協同過濾和item-based協同過濾以及各種熱度和影響度作為特征組合在一起生成新的train,用于分類器分類使用。
2.7 模型構建和預測
- 讀取前面保存好的訓練集進行模型的訓練(XGBT)
- 進行交叉驗證,判斷模型的性能
- 使用模型對測試集上的用戶進行預測。
3. 遇到的問題
- 由于電腦性能有限,所以在統計用戶和時間信息的時候,我們只關注在train和test兩個文件中出現的用戶和事件,其余的不作考慮,因為我們最終是要對通過對train中的數據的學習,然后對test中用戶的預測。其他的沒有出現的用戶則不用考慮。如果電腦的性能允許的話,最好是對所有的用戶都進行考慮。否則會出現用戶的一些朋友在不在考慮的用戶范圍內。
- 再用文件user.csv文件計算用戶相似度矩陣的時候,我們需要對該文件中的一些類型屬性進行處理,尤其是國家屬性和時間屬性。其中國家屬性不能簡單使用one-hot進行處理,否則矩陣會非常的稀疏,應該使用pycountry庫對其進行編碼處理。時間屬性則需要將年月進行提出。在將特征數據都轉換為數值型的數據后,需要對特征數據進行歸一化處理,然后使用scipy對每個用戶兩兩之間計算相似性(向量的相似性)
- 時間屬性特征一定要單獨處理
- 有具體含義的特征和沒有具體含義的特征需要單獨進行處理
- 構建event-event相似矩陣的時候,也要對特征進行處理(類別性的數據,數值型的數據)
4. 總結
- 了解問題
- 問題分析
- 通過查閱資料,了解要解決的問題是什么(分類還是回歸)
- 通過查閱文檔,了解給出的數據中每個屬性代表的意義。
- 結合實際的生活和自己的理解,給出初步的解決方案。
2.初步想法:
- 1.通過查閱資料發現本文解決的問題是一個推薦問題,需要我們輸出TOPN.
- 2.從給出的數據可以看出,除了傳統的基于用戶的協同過濾和基于物品(活動)的協同過濾外,還應該利用用戶的朋友圈的信息
3.具體方案:
- 1.基于user.csv文件,得出用戶-用戶之間的相似度矩陣
- 方法1:通過歷史行為,找出關聯用戶
- 方法2:通過用戶的信息,即該數據集中其他的屬性信息,通過度量不同用戶之間向量的距離作為用戶之間的相似度。
- 2.基于event,得出event-event之間的相似度矩陣和用戶-event的相似度矩陣。
- 方法1:基于用戶的歷史信息,找出關聯的事件和用戶關聯的事件
- 方法2:基于事件的屬性,即數據中其他屬性的信息,衡量不同事件的向量的距離作為事件與事件之間的相似度。
- 3.基于friend.csv文件,得出用戶的朋友數目和用戶朋友的活躍度
- 用戶的朋友數目越多,則其越外向,越有可能參與活動
- 用戶朋友都是那種樂意參加活動的人,那么用戶自己參加活動的可能性也會很高。
- 4.基于event_attendees.csv文件得出互動的活躍度
- 活躍度越高的事件,用戶參加的可能性越大。
4.具體實施:
- 1.數據清洗
- 類別數據轉換為數值型的數據
- 事件數據進行拆分
- 缺失數據進行填充
- 2.處理用戶和活動之間的關聯數據
- 得到用戶列表(不重復)
- 得到活動列表(不重復)
- 得到用戶和活動的的關聯數據。
- 3.用戶與用戶之間的相似度矩陣
- 通過用戶信息計算用戶之間的相似性
- 通過用戶的活動行為計算用戶之間的相似性(如果兩個用戶參加的活動好多都相同,那么這兩個用戶之間相似)
- 4.構建event 和 event之間的相似度矩陣
- 通過event的屬性信息計算event之間的相似性
- 通過用戶參與活動的歷史信息計算event之間的相似性。(相似的用戶購買的產品也相似)
- 5.用戶社交關系挖掘
- 統計每個用戶的朋友信息
- 統計每個用戶朋友活躍度信息(參加活動總數/總的朋友數)
- 6.統計event熱度
- 統計每個活動參與的人數信息作為活動的熱度標準
- 7.串起所有的數據處理和準備流程
- 計算上訴的特征,并進行保存
- 8.構建特征
- 讀取上訴保存的特征
- 基于用戶-用戶的相似度矩陣,得出基于用戶的活動推薦度
- 基于活動-活動的相似度矩陣,得出基于活動的活動推薦度
- 合并所有的特征,并進行保存
- 9.建模與預測
- 模型訓練
- 參數調節
- 模型評估
- 進行預測