近期調參感受:
- 在實際項目中數據和特征對最終的效果貢獻是最大的,所以要花時間打造你的數據流,花時間多想一些特征,特征要算准。
- word2vec、FFM、XgBoost這些算法之所以能得到業界公認,是因為他們在各種數據集上都表現良好,而且對參數不太敏感。
試驗總結:
- FFM優於FM,FM優於LR。
- XGBoost和LightGBM效果幾乎接近,比上述線性模型(多項式模型)好很多,LightGBM訓練速度比XGBoost快。
- 利用LightGBM產生組合特征,再過一層LR/FM/FFM,效果並沒有超越單純的LightGBM。
word2vec
from gensim.models import Word2Vec model = Word2Vec(sentences, size=100, # 特征向量的維度,比200好 window=5, # 前后各取5個詞作為context,增到8效果沒有好轉 min_count=20, # 出現次數低於該頻率的詞直接忽略掉 iter=150, # 迭代次數 hs=0, # hs=1表示hierarchical softmax。負采樣比hierarchical softmax效果好 negative=10, # 如果要采用負采樣,negative表示負采樣時背景噪聲詞的個數。改為20后效果並沒有好轉 workers=8, # 並行數 sample=1e-4, # 對高頻詞進行下采樣,通常取值在(0,1e-5)。調參結果見下表 )
可見下采樣參數sample還是很重要的,由1e-3降為1e-4后,<數據挖掘,機器學習>和<機器學習,深度學習>的相似度得到了明顯改善。
有2個用戶,他們的標簽分別是【java|工程師|python|機器學習|模式識別|算法】、【研究生|機器學習|碩士|it研發】,我們有每個詞的word2vec向量,現在要計算2個詞集的相似度,有3各方法:
- 各詞向量取average。考慮了每個詞的信息
- 各詞向量取max。考慮最顯著特征信息(比較注重關鍵詞,忽略平常詞)
- average的max拼接起來
max法重點強調了“機器學習”這個關鍵詞,得到的相似度比較高。方法3是前2種方法的中和。此處參考基線系統需要受到更多關注:基於詞向量的簡單模型 | ACL 2018論文解讀
XGBoost LightGBM
import xgboost params = { 'booster': 'gbtree', #單個booster是采用線性模型還是樹模型 'objective': 'binary:logistic', #目標函數 'eta': 0.01, # 每個booster設置相同的學習率 'gamma': 0.1, # 對葉節點個數的懲罰系數 'lambda': 2, # L2正則化項系數,控制葉節點的輸出值 'max_depth': 15, 'subsample': 0.7, # 行采樣。是否進行行采樣對效果沒什么影響 'colsample_bytree': 0.7, # 列采樣。不進行列采樣效果會差一點 'min_child_weight': 10, # 葉節點最少樣本數 'silent': 0, # 設置成1則沒有運行信息輸出,最好是設置為0. 'seed': 0, 'eval_metric': 'logloss', 'nthread': 8, # 並行數 'tree_method': 'exact', # 在所有樣本上遍歷可能的分割點。計算量太大,默認使用的是approx,即只在分位點上嘗試分割。exact比approx效果會好一點點 } # num_boost_round:booster的個數,對於tree boost就是樹的個數。每生成一棵樹都會去調用一個callback,比如通過callback可以重置學習率[xgb.callback.reset_learning_rate(custom_rates)] model = xgboost.train(params.items(), train_data, num_boost_round=300, callbacks=[])
使用列采樣技巧后,AUC提升了1個點,其他參數對AUC影響不大。
import lightgbm params = { 'task': 'train', 'boosting_type': 'dart',# gbdt:0.795695; GOSS:0.7917279; dart:0.7985638; rf:0.714062 'objective': 'binary', 'metric': {'binary_logloss', 'auc'}, 'max_bin': 255, 'num_leaves': 500, 'min_data_in_leaf': 10, 'num_iterations': 300, # 300棵樹 'learning_rate': 0.2, # 學習率太大,容易過擬合 'feature_fraction': 0.7, # 列采樣比例 # rf時使用,gbdt也可以使用 # 'bagging_fraction': 0.7, # 行采樣比例,使用rf時這個比例必須小於1 # 'bagging_freq': 5, # 每隔幾輪進行一次行采樣 # GOSS時使用 # 'top_rate':0.3, # 'other_rate':0.3, # dart時使用 'drop_rate':0.7, 'skip_drop':0.7, 'max_drop':5, 'uniform_drop':False, 'xgboost_dart_mode':True, 'drop_seed':4, 'verbose': 0, 'num_threads': 8, } gbm = lightgbm.train(params=params, train_set=train_data, valid_sets=test_data)
boosting_type效果對比:rf<gbdt<goss<dart。
學習率太大,容易過擬合。每輪迭代都打印訓練集和測試集上的AUC,會發現learning_rate>0.2時,比如0.5、1.0,在訓練集上的AUC會比較高,而在測試集上的AUC比較低,learning_rate為0.2時在測試集上的AUC是最高的。
LightGBM在100棵的時候,測試集上的AUC就已經到0.78了,后面的200棵樹只是將AUC提升了1個點。
LightGBM由於是采樣訓練,效果比XGBoost稍差一點,但速度快,能快多少取決采樣的比例,試驗中LightGBM dart耗時是XGBoost的一半。
LightGBM+LR
用LightGBM根節點到每一個葉節點的路徑作為一個組合特征,再輸給LR去訓練。LR拿到的特征數等於所有葉節點的個數,一棵樹有500個葉節點,lightgbm有300棵樹,那一共就有150000個葉節點,維度很高,但實際上一個樣本在一棵樹上只會命中一個葉節點,所以一個樣本上非0的維度等於樹的個數。試驗中我們只取了LightGBM的前100棵樹(別忘了LightGBM在100棵樹的時候AUC是0.78)。另外這里選用LightGBM而不是XGBoost,是因為LightGBM是leaf-wise生長的,max leaf是可以控制的(實際上每棵樹都可以達到max leaf),這樣在給所有葉節點編號時簡單一些,僅此而已,並不是說XGBoost效果不好。
還可以把LightGBM產生的組合特征與原始特征拼接起來,一同輸給LR去訓練。
看來LightGBM已把這些特征學習到極致了,即使LR拿到這些組合特征也學不到更好的效果。線性模型還是敵不過非線性模型。決策樹得到的是特征組合,但還是在原先的特征空間內,而深度學習是創造了新的特征,超越了原始的特征空間。
LR FM FFM
import xlearn ffm_model = xlearn.create_ffm() ffm_model.setTrain(ffm_train_file) ffm_model.setValidate(ffm_test_file) params = { 'task': 'binary', # 二分類。也可以設為reg 'lr': 0.2, # 學習率。adagrad的學習率是自適應的,這個學習率只是初始的學習率 'lambda': 0, # 正則系數 'metric': 'auc', 'opt': 'adagrad', # sgd,ftlr。如果采用ftlr,則還可以指定其他參數alpha, beta, lambda_1, lambda_2 'k':16, # 隱因子個數。FFM中的k可以比FM中的k小很多 'init': 0.5, # 初始化參數 'epoch': 50, 'stop_window': 5, # 連續5輪指標沒有創建新高就停止迭代 } # 不用設置核數,會自動把所有核都利用起來 # ffm_model.disableLockFree() # ffm_model.setQuiet()#迭代時不做evaluation # ffm_model.setOnDisk()#內存容不下所有訓練數據時,數據存到磁盤,每次只加載一個block的數據,在params中可以設置block_size ffm_model.setTXTModel(model_explain_file) ffm_model.fit(params, ffm_model_file)
LR、FM、FFM這3個算法對學習率都比較敏感,需要擴大搜索范圍多嘗試一些學習率。k從4增加到32的過程中AUC是遞增的,另外FFM的k值可以比FM小很多。
- LightGBM+LR/FM/FFM都沒有超越單純的LightGBM
- 除了LightGBM組合特征外,把原始特征也加進來對FM的提升比較明顯,對LR和FFM無提升
- 從FFM可以看到,使用LightGBM組合特征比只使用原始特征有很大的效果提升