一個query屬不屬於音樂,這和咱們對音樂的理解有很大的關係,須要進行產品上的定義。如你會唱歌嗎,劉德華,換一首音樂,如何讓孩子愛上學習等,既能夠屬於音樂也能夠不屬於音樂。對音樂的理解最終落到標註數據上,繼而來影響咱們的打分模型給出高分或者低分。html
咱們對query進行了不少的清理、轉換、知識查詢、類似度計算、拼音轉換、糾錯、句型輔助等工做,因此要從裏面找到對query是否歸屬於音樂領域有影響的特徵。咱們目前抽取了slot數、各slot抽取狀況、slot的組合、總體類似度、資源熱度、歌手職業、標籤數、標籤強度、主幹query長度、音樂日誌、句型得分、意圖詞得分等特徵,特徵還在增長。java
服務爲了配合抽特徵的須要進行了改造,針對特定的deviceid,返回中間計算過程當中的各特徵值。python
在上機器學習模型前,咱們是用人工規則來進行的打分,針對各類狀況寫了複雜的if-else,是一步步的決策過程,因此選打分模型時,天然選擇了決策樹(GBDT)。離線模型的訓練使用了python xgboost。windows
標註數據:咱們共標註了近5萬條數據,音樂近2萬,其餘領域數據近3萬作爲反例。經過服務解析,將query轉換成特徵集,libsvm格式(label \t id:value \t id:value)。bash
0 0:0.0000 1:0.0000 2:0.0000 3:0.0000 4:0.0000 5:0.0000 6:0.5000 7:0.0000 .. 0 0:0.0000 1:0.0000 2:0.0000 3:0.0000 4:0.0000 5:0.0000 6:1.0000 7:0.0000 .. 1 0:1.0000 1:1.0000 2:0.0000 3:0.0000 4:1.0000 5:0.0000 6:0.7000 7:0.0000 ..
訓練集/測試集拆分:訓練集佔數據集的比例通常爲2/3 - 4/5,而且須要保證訓練集/測試集中的類別平衡(正負比例和數據集中的一致)。咱們隨機抽取了1/5的數據做爲測試集。機器學習
調節參數:xgboost支持對eta(學習率)、max_depth(樹的最大深度)、lambda(L2正則化因子)等,使用了模擬退火對參數進行調優,給每一個參數指定起取值範圍、步長。訓練過程當中,每次隨機選擇一個參數對其增長或減少一個步長,訓練一個模型算出其在測試集上的精度作爲模型的評價值。學習
樣本補充:測試調節過程當中,會碰到一些case特徵沒有被學到(想讓這一類case打分高,卻打了低分),這時就人工補充必定量的這類數據到訓練集中,再從新訓練模型。我是對沒有學到的case給重複增長了10條。測試
另外:日誌
gbdt支持一個樣本丟失部分特徵,對於不存在的特徵,咱們進行了丟棄,以避免干擾選擇。htm
爲了保證特徵名和特徵索引的一致,在離線訓練的時候,把特徵統一存在了一個文件中;在線服務抽取特徵時用了枚舉定義。更好的辦法,能夠寫一個thrift定義,保證在線離線的統一。
xgboost提供的java版xgboost4j須要依賴底層本地實現的支持,用的過程當中windows沒有編譯成功。因爲xgboot導出的模型有可讀的文本版本,就使用了組裏自實現的加載模型決策樹java代碼。
booster[0]: 0:[wholeSim<0.80175] yes=1,no=2,missing=1,gain=9265.91,cover=18714.5 1:[intentScore<0.95] yes=3,no=4,missing=3,gain=972.265,cover=12050.5 3:[tagSim<0.6795] yes=7,no=8,missing=7,gain=465.15,cover=11553.5 7:[rank<0.97265] yes=13,no=14,missing=13,gain=389.613,cover=11183.5
在模型打分後,保留了一些規則(如slot正向/負向得分,用於修復緊急case。
後續會繼續增長特徵,另外想引入語言模型,對抽取的slot用entity名代替,而後來訓練出一個word embedding或者其餘的語言模型。
參考:http://xgboost.readthedocs.io/en/latest/python/python_intro.html#install-xgboost