針對原Kaggle作者的處理,我們共可以得到11個自變數(bathroom~price)和1個應變數(interest_level)。如圖1所示。
由於原作者所取的自變數我們認為不夠有解釋意涵,且預測成效不彰,因此這篇文章將講述我們做的後續處理及結果。
圖2為我們處理資料的整套流程,以下將分成資料前處理、訓練模型、與模型評估三部分進行說明。
資料前處理:分為特徵處理、資料切分、處理資料不平衡、標準化四步驟。
A-1.特徵處理:新增特徵變數
查看原始資料集,可以發現features和description兩欄位裡面都含有文字。在features欄位裡面的文字可以想成hashtag,每筆資料會有不同hashtag、不同筆資料也可能有相同的hashtag。description欄位裡面則是單純句子形式,需要用進階一點的詞向量技術來做分析,因此我們這裡僅針對features欄位做分析處理。
找出上述69個出現頻率 > 100的字詞,我們接下來要將這些字詞都成為新增的欄位,並成為二元變數欄位(也就是dummy variable)。舉例來說,創建一個名為Elevator的欄位,每筆資料中的features裡若有出現該字詞,Elevator的欄位就填上1,反之填上0。
轉成二元類別變數(dummy variable)可以使用sklearn相關的one hot encoding套件,也能自己寫函數。在此介紹自己寫函數的方法,如圖3-5。
定義好函數之後,再將上述出現頻率 > 100的字詞取出設成list形式。再使用for迴圈一個一個將那些字詞設成二元類別變數欄位。
產出結果如圖3-7所示。實際上共有69個,在此因版面關係列出12個變數,但其餘變數形式都一樣。
A-2特徵處理:刪除特徵變數
因為仔細查看資料集說明,發現created的時間點是房屋上線的日期,而並非完工日期。若得出的結論為顯著影響房屋查詢量,也難以解釋其中意涵,故在此予以刪除。num_features欄位是原作者對features欄位做的資料轉換,因我們上面已做了不同方式的處理,因此這欄位也不予採用。
A-3.整理後的資料集格式
整理後我們可得到以下欄位變數,應變數仍是interest_level,其他均為自變數。
A-4特徵篩選
從圖3-8可看出變數多達76個,這容易造成資料維度過大,容易造成維度的詛咒(詳見維基百科)。縮減維度的方法有很多種,不論是特徵提取(ex.PCA)或是特徵篩選都是可行的方式。但PCA會造成原始特徵變數的流失,使我們在解釋資料時較難以闡釋該特徵變數對應變數的影響。因此我們使用SelectFromModel這個套件來幫我們挑選重要特徵。
由下圖3-9可找出每個特徵的重要度分數。
再經由圖3-10的程式碼,透過threshold這個參數設置重要度分數門檻,即能找出重要度大於標準的特徵。在此例,即所選出的特徵,重要度分數都大於0.01。
由上述程式碼,我們可以得出以下表格的資訊,總共篩選出17個重要變數。
A5.最終整理後的資料集格式
圖3-12即是我們將要丟入模型裡的變數。自變數為(bathrooms~Laundry in Unit),應變數仍為interest_level。
B.資料切分
切分為訓練集與測試集,常用的比例為8:2。(9:1與7:3均有人使用)
指定random_state = 0,可使每次切分的資料集為同一份。
C.處理資料不平衡
將訓練集的應變數類別數量作視覺化,可看出三種類別有很懸殊的數量差異。如果直接將這樣的資料丟進模型,訓練出來的模型很可能會造成預測都是偏向low類別(因訓練集該類別的資料最多)。故較好的方式是生成較少數量的類別資料,再丟進模型訓練。在此介紹三種方法:RandomOverSampler、SMOTE、ADASYN。
C1.RandomOverSampler
依照low總數比例去複製生成high, medium,使各資料總數平衡。
洗亂整體的順序,保持模型的訓練效果。
C2.SMOTE
SMOTE原理簡介:
1.設定採樣倍率N,選定樣本需要生成N個合成樣本
2.設定一個近鄰值K,針對該樣本找出K個近鄰樣本並從中隨機挑選一個
3.公式:X_new=X_chosen+(X_nearest-X_chosen )∗δ; δ∈[0,1]
C3.ADASYN
ADASYN原理簡介:
與SMOTE類似,但額外考量原始資料分布情況,為不同少數類樣本依照比例去生成不同數量的新樣本。
完成上面的資料不平衡處理,我們會得到三種資料集,分別是透過RandomOverSampler、SMOTE、ADASYN生成的資料集。
D.標準化:避免有一些值較大的變數成為dominated variable
標準化注意事項:
- 要在切資料後:否則將汙染testing set。
- dummy variable不用做標準化:因已在-3~3範圍內,做了反而會更糟,失去變數解釋意義。
- 不一定每個model都要用到:如線性回歸,參數大小就會彌補變數值的不同,就不用標準化。
最後將標準化的連續欄位與不用標準化的類別欄位合成,即成一個資料集。前面說到會有三種資料(分別為RandomOverSampler,SMOTE,和ADASYN),三種資料只在生成資料的過程有異,後面標準化及欄位合併的程式碼都是通用的。
以上就完成了資料前處理的部分囉!接者我們會在下一篇運用這裡所生成的三個資料集做後續的分析。
參考資料:
- 特徵選用參考資料:https://bit.ly/39ce0jR
- SMOTE參考資料:https://medium.com/%E6%95%B8%E5%AD%B8-%E4%BA%BA%E5%B7%A5%E6%99%BA%E6%85%A7%E8%88%87%E8%9F%92%E8%9B%87/smote-enn-%E8%A7%A3%E6%B1%BA%E6%95%B8%E6%93%9A%E4%B8%8D%E5%B9%B3%E8%A1%A1%E5%BB%BA%E6%A8%A1%E7%9A%84%E6%8E%A1%E6%A8%A3%E6%96%B9%E6%B3%95-cdb6324b711e
- ADASYN參考資料:https://bit.ly/35o6yAW 、https://bit.ly/3q4Iuez
作者:陳政廷、王裕萍、謝豐檍(臺灣行銷研究特邀作者)、鍾皓軒(臺灣行銷研究有限公司創辦人)