1. 程式人生 > >一起學習如何用LightGBM做決策(DomainSelection)

一起學習如何用LightGBM做決策(DomainSelection)

可能很多朋友都聽說過LightGBM和GBDT,這裡的GB代表的是梯度提升,也許有很多的朋友瞭解提升演算法,在我的理解看來,梯度提升就是將許多弱的分類器聯絡在一起最終組合成一個強的分類器。LightGBM是微軟開源的,網上也有中文的教程,這篇博文主要就是介紹一下如何用lightGBM來做決策,講述一下具體的流程,希望對大家有所幫助。
首先,我們要知道LightGBM所支援的資料格式其實是和SVM一樣的,也是傳入的是一組組向量,每一組向量的第一位是標籤位,後面所有的都是這組資料的特徵。大概長這個樣子:
LightGBM資料格式
說到這裡,我來說明一下決策樹在這個專案中的作用,就是一整個互動系統分成很多類別,最終根據使用者的意圖來出一個最終的類別,首先我們會進行一些粗分類處理,來判斷使用者的話語可能會出的結果,至於如何粗分類,我在之前的博文

SVM做文字分類詳細操作 有介紹到分類的方法,在粗分類之後,我們會淘汰出一些可能出的類別,剩下的類別我們再來進行決策,決策到底出哪一個類,這裡的決策過程,我們就用到了LightGBM。
知道了大概的原理之後,很多朋友就會有疑問,給LightGBM訓練的資料的這些維度,也就是訓練資料的特徵是怎麼來的?其實這些維度(特徵)也是我們人為定義的,我們會把區分度較高的一些特徵選擇出來作為向量的維度,將這些特徵的得分塞到所對應的維度中去,在這裡可以給大家看看大概是如何定義向量的特徵維度的:
定義特徵維度
我截取了一段程式碼,這是一段配置檔案,我們首先看domain,這裡定義了用下面這些特徵維度的類別,可以看到有weather類(天氣類)、remind類(提醒類)、sysprofile類(系統畫像類)等等,也就是你想決策的類別都可以配置進來。group_type我們可以暫且先不用管,然後後面就是feature項,feature項就是我們人為所選出的特徵維度,這個group中定義的特徵項有CONFIDENCE,這個表示query-reply relevance,也就是回覆的相關度;QUALITY,表示這個類別是否有reply,返回值為0或者1;SLOTS表示這個query命中的槽位數;KEYWORDS,表示關鍵詞的數量;SHORT_TERM_INTEREST,表示使用者的短期興趣,看最近是否訪問服務,初始值為1,按照輪次來進行衰減。LONG_TERM_INTEREST,表示使用者的長期興趣,也可以理解成使用者的習慣。INTENT,這個表示決策之前粗分類的得分;DIF_INTENT,表示命中意圖分類得分與其他類別最大意圖得分的差值。SLU_SCORE,表示Parser命中槽位的加權得分。SLU_RATIO,表示parser命中字數的比例,關於parser的內容,我之前有寫過一篇博文
語義解析Parser使用者手冊
專門有介紹過;HIT_PATTERN,表示是否命中某種固定模式,輸出的值為0或者1。這就是這些特徵的解釋,當然這些也是我們人為挑選的一些特徵,這些特徵也是具有這些類別代表性的一些特徵,當然選擇特徵的時候,我們可以選擇自己人為有代表性的有區分度的特徵來進行決策。說完這些,我們再來看看後面的這個pooling,這個NO_POOLING表示不共享維度,不共享維度表示每個類別都有自己獨享的維度,因為有些類別區分度並不高,如果共享維度的話,就很難區分出來,這裡說的不共享維度,舉個栗子,這裡有5個domain和11個feature,那麼維度就是5*11=55,在輸出的向量中1-11維代表天氣的特徵,12-22表示提醒類的特徵以此類推,其他維度全部填0,所以得到的天氣向量只會在1-11維有值後面的44個維度值都為0。除了這些之外,我們為了區分一些難以區分的類別,我們還在向量的末尾新增一些獨立的additional feature來區分一些容易混淆的類別。
在我們決策之前,我們需要準備資料呀,要準備好LightGBM能夠識別的資料格式,在這裡我先來大概演示一下如何獲取LightGBM能夠識別的格式的資料。首先我們需要大量的語料是吧,語料是從我們智慧語音互動系統的中控中獲取到的。我這裡就舉個栗子,不方便放出所有的語料了:
語料栗子

如圖所示,第一列表示某一個類別的語料,然後table之後寫入這個類別代表的標籤,最後一列是userID,其中最重要的是語料和所對應的標籤,這個過程可能需要人工標註。然後我們將這個放入我們的中控跑結果,可以從中控的日誌中得到如下結果:
結果日誌
我們可以看一下中控跑出來的結果日誌,中控把相對應的特徵值塞入到了對應的維度上,有的朋友就懵逼了,怎麼我7條語料跑出了28條日誌,這裡我解釋一下,系統會隨機給語料標註幾個標籤來出一個負類的結果,因為我們後面要用到binary classification,所以標籤只有1和0,仔細看看資料,在語料標註錯誤的標籤的時候,後面的第一位就是0,如果語料對應的標籤是正確的話,那麼後面第一位標籤位就是1,表示正類,這樣一來我們正負語料就是1:3的比例,方便我們後續的訓練。當然這個格式的資料不能直接用於訓練的,因為LightGBM不能處理中文資料,我們需要的是從label位開始的數字資料,所以我們需要的是將標籤位前面的資料都去掉,去掉之後就是前面貼出來的資料格式的圖片。
我這裡用的LightGBM是微軟開源的,我們可以直接拿上面的資料跑裡面的python檔案,就拿advanced_example.py為例,我們可以訓練出LightGBM模型:
我們可以跑advanced_example.py,但是我們需要修改一下里面的引數,這是我設定的引數,如何調參,我們稍後再說:

params = {
    'boosting_type': 'gbdt',
    'objective': 'binary',
    'metric': 'binary_logloss',
    'num_leaves': 63,
    'num_trees' : 100,
    'learning_rate': 0.1,
    'feature_fraction': 0.8,
    'bagging_fraction': 0.8,
    'bagging_freq': 5,
    'verbose': 0
}

跑完這個LightGBM之後,會同時生成3個檔案model.txt、model.json、model.pkl,我們一起來看看model.txt檔案,裡面是100棵樹,還有我們的一些特徵權重等等。我們可以用測試語料看看這個模型的準確率和召回率:

./lightgbm config=predict.conf

用的是以上的命令,但是我們需要把我們生成的model.txt檔案和我們的測試語料配置進predict.conf中去,執行完predict操作之後,就會生成一個預測結果LightGBM_predict_result.txt ,我們將這個預測的結果和我們的測試語料進行比較,可以得到如下的結果:
預測結果
可以看到正類和負類的準確率和召回率都還是比較高的,可以看出這個LightGBM訓練出的決策模型還是比較好的。整個過程就是通過決策樹模型的總和和非零的類別特徵,得到一個模型得分,這個得分就是num_trees個決策樹得分的總和,最後出一個得分最高的類別作為決策的結果輸出。
最後我們來說一說調參,調參也是決策過程中很重要的一部分,一般來說,我們用LightGBM官方資料就可以訓練出一個優秀的模型,可以在官方給的引數附近進行微調,可以讓模型的效果更佳,判斷一個模型是否優秀,我們可以通過正負類的準確率和召回率來衡量。下面我來說一下幾個常用的引數如何調優:

  1. num_trees:這個表示決策樹迭代的次數,在訓練過程中,我設定的預設值為100,一般來說,num_trees太小的情況下,迭代次數不足,容易出現欠擬合;num_trees太大的時候,迭代次數過多,容易出現過擬合的狀態。在實際的調參的情況下,num_trees需要和學習率learning_rate綜合考慮。
  2. learning_rate:學習率,也稱作步長,表示每一個弱學習器的權重縮減係數,一般預設為0.1,也可以從一些小的數值開始調,結合num_trees一起來調優。
  3. num_leaves:最大的葉子節點數,通過限制num_leaves,演算法會在最大葉子節點數內生成最優的決策樹,防止過擬合。

除了上述的這些引數,還有一些引數可以參考LightGBM的官方文件的預設值,在預設值的左右進行引數調優就可以了。以上就是整個運用LightGBM來進行決策的整體流程,希望可以對大家對LightGBM的理解和運用有所幫助,本人能力有限,文中如有紕漏,請各位朋友不吝指教,如有轉載,也請標明出處,謝謝。