机器学习:从入门到第一个模型
歡迎大家前往騰訊云技術社區,獲取更多騰訊海量技術實踐干貨哦~
作者:李春曉?
導語:
“從入門到第一個模型”差點就成了“從入門到放棄”。本文是機器學習在運維場景下的一次嘗試,用一個模型實現了業務規律挖掘和異常檢測。這只是一次嘗試,能否上線運轉還有待考究。試了幾個業務的數據,看似有效,心里卻仍然忐忑,擔心哪里出錯或者有未考慮到的坑,將模型介紹如下,請大俠們多多指教,幫忙指出可能存在的問題,一起交流哈。
背景:
業務運維需要對業務基礎體驗指標負責,過去的分析都是基于大數據,統計各個維度及其組合下關鍵指標的表現。比如我們可以統計到不同網絡制式下打開一個app的速度(耗時),也可以獲取不同命令字的成功率。針對移動APP類業務,基于經驗,我們在分析一個指標時都會考慮這些因素:App版本、指標相關的特有維度(比如圖片下載要考慮size、圖片類型; 視頻點播類要考慮視頻類型、播放器類型等)、用戶信息(網絡制式、省份、運營商、城市)等。這些維度綜合作用影響關鍵指標,那么哪些維度組合一定好,哪些一定不好?耗時類指標的表現往往呈現準正態分布趨勢,其長尾永遠存在并且無法消除,這種情況要不要關注? 針對命令字成功率,有些命令字成功率低是常態,要不要告警?過去我們會通過在監控中設置特例來避免告警。有沒有一種方法,能自動識別常態與非常態?在機器學習如火如荼的現在,也許可以試一試。
目標:
挖掘業務潛在規律(針對耗時這類連續值指標,找出引起長尾的因素)
監控業務指標時,找出常態并忽略常態,僅針對突發異常產生告警并給出異常的根因。
之后就是艱苦的屢敗屢戰,從入門到差點放棄,最終搞出第一個模型的奮戰史了。最大的困難是沒寫過代碼,不會python,機器學習理論和代碼都要同步學習;然后就是在基礎薄弱的情況下一開始還太貪心,想要找一個通用的模型,對不同業務、不同指標都可以通用,還可以同時解決兩個目標問題,缺少一個循序漸進入門的過程,難免處處碰壁,遇到問題解決問題,重新學習。好在最終結果還是出來了,不過還是要接受教訓:有了大目標后先定個小目標,理清思路后由點及面,事情會順利很多。
接下來直接介紹模型,過程中走的彎路就忽略掉(因為太多太弱了,有些理論是在遇到問題后再研究才搞明白)。
基本思路:
1.通過學習自動獲取業務規律,對業務表現進行預測(ET算法),預測命中的就是業務規律,沒命中的有可能是異常(請注意,是有可能,而非絕對);
2.將1的結果分別輸入決策樹(DT)進行可視化展示;用預測命中的部分生成業務潛在規律視圖;用未命中的來檢測異常,并展示根因。
步驟簡介(以耗時這個指標為例):
1. 準備兩份不重合的數據,一份用于訓練,一份用于預測
例:視頻播放類業務的維度(如版本,機型,視頻來源,視頻編碼類型等各種已有特征),及耗時數據
2. 將目標問題轉化為分類問題,有可能是常見的二分類,也有可能是多分類,視情況而定
將耗時這種連續性指標轉為離散值,目標是產生三個分類:“極好的/0”,“一般的/1”,“極差的/2”,將耗時按10分位數拆分,取第1份(或者前2份)作為“極好的”樣本,中間幾份為“一般的”的樣本,最后1(或者2)份為“極差的“樣本 。 這里的“極差的”其實就是正態分布的長尾部分。如下圖,第一列是耗時區間(未加人工定義閾值,自動獲取),第二列是樣本量。
3. 特征處理
3.1 特征數值化
這里表現為兩類問題,但處理方式都一樣:
(1)文本轉數值
(2)無序數值需要削掉數值的大小關系,比如Appid這類,本身是無序的,不應該讓算法認為65538>65537
方法:one-hot編碼, 如性別這個特征有三種取值,boy,girl和unknown,轉換為三個特征sex==boy,sex==girl,sex==unknown, 條件滿足將其置為1,否則置為0.
實現方式3種:自己實現;sklearn調包;pandas的get_dummies方法。
One-hot編碼后特征數量會劇烈膨脹,有個特征是手機機型,處理后會增加幾千維,同時也要根據情況考慮是否需要對特征做過于細化的處理。
3.2 特征降維
是否需要降維,視情況而定,我這里做了降維,因為特征太多了,如果不降維,最終的樹會非常龐大,無法突出關鍵因素。
所謂降維,也就是需要提取出特征中對結果起到關鍵影響因素的特征,去掉不重要的信息和多余信息,理論不詳述了,參考:http://sklearn.lzjqsdd.com/modules/feature_selection.html
本文用了ET的feature_importance這個特性做降維,將5000+維的數據降至300左右
4. 用ET算法(隨機森林的變種,ExtraTreesClassifier)訓練一個分類模型(三分類)
4.1 評價模型的指標選取
對于分類算法,我們首先想到的準確性 precision這個指標,但它對于樣本不均衡的場景下是失效的。舉個例子,我們有個二分類(成功和失敗)場景,成功的占比為98%。這種樣本直接輸入訓練模型,必定過擬合,模型會直接忽略失敗的那類,將所有都預測為成功。此時成功率可達98%,但模型其實是無效的。那么應該用什么?
對于二分類,可用roc_auc_score,對于多分類,可用confusion_matrix和classification report
4.2 樣本不均衡問題處理
本文用的例子,顯然0和2的數量非常少,1的數量是大頭。為了不對1這種類型產生過擬合,可對0和2這兩類做過抽樣處理。
常見的有兩類算法:
(1)直接復制少數類樣本
(2)SMOTE過抽樣算法(細節略)
這里兩種算法都用過,最終選了SMOTE,不過本文研究的數據上沒有看出明顯差別。
少數類的過抽樣解決了大類的過擬合問題,同時也帶來了小類的過擬合,不過這里的模型正好需要讓小類過擬合,我們就是要把表現“極好”和“極壞”的部分找出來,表現平平的在異常檢測時加入關注。過擬合這個問題,不用過于恐懼,反而可以利用。舉個例子,“患病”和“不患病”這種分類場景,寧可將“患病”的檢出率高一些。如下圖這個分類報告,對于小類樣本(0和2),我們需要利用recall高的特性,即把它找出來就好;而對于大類樣本,我們需要precision高的特性,用于做異常檢測。
4.3 模型參數選取
Sklearn有現成的GridSearchCV方法可用,可以看看不同參數組合下模型的效果。對于樹類算法,常用的參數就是深度,特征個數;森林類算法加一個樹個數。
Max_depth這個參數需要尤其注意,深度大了,容易過擬合,一般經驗值在15以內。
4.4 模型訓練好后,用測試數據預測,從中提取各個類別預測正確的和不正確的。?
例:
預測正確的部分:獲取預測為0,2,實際也為0,2的樣本標示;
預測錯誤的部分:獲取預測為0和1,實際為2的樣本標示(根據情況調節)
5. 輸入決策樹進行可視化展示,分別做業務規律挖掘和異常檢測
這里DT算法僅用于展示,將不同類別的數據區分開,必要時仍然要設置參數,如min_samples_leaf, min_impurity_decrease,以突出關鍵信息。
還可以通過DecisionTreeClassifier的內置tree_對象將想要找的路徑打出來
以下分別給出例子:
5.1 業務規律挖掘
視頻點播場景,取0和2這兩類預測正確的部分,輸入DT,如下圖,自動找出了業務潛在規律,并一一用大數據統計的方式驗證通過,結論吻合。這個樹的數據相對純凈,因為輸入給它的數據可以理解為必然符合某種規律。
?
5.2. 異常檢測
本文模型還在研究階段,未用線上真實異常數據,而是手工在測試數據某個維度(或者組合)上制造異常來驗證效果。
針對成功率,可以視容忍程度做二分類或者三分類。
二分類:取一個閾值,如99%,低于99%為2,異常,否則為0正常。缺點是如果某個維度上的成功率長期在99%以下,如98%,當它突然下跌時會被當做常態忽略掉,不會告警。
三分類:99%以上為0, 96~99% 為1,低于96%為2,這種方式會更靈活。 三種分類也分別對應其重要性。重點關注,普通關注,忽略。
下圖是一個二分類的例子(手工將平臺為IPH和播放端為client的置為異常):
最后:這里只是一次小嘗試,如果要平臺化上線運轉,還要很多因素要考慮,首要就是模型更新問題(定時更新?避免選取到異常發生時段?),這個將放在下階段去嘗試。
相關閱讀
5分鐘教你玩轉 sklearn 機器學習(上)
機器學習概念總結筆記(一)
機器學習之離散特征自動化擴展與組合
此文已由作者授權騰訊云技術社區發布,轉載請注明文章出處
原文鏈接:https://cloud.tencent.com/community/article/477670
轉載于:https://www.cnblogs.com/qcloud1001/p/7646569.html
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的机器学习:从入门到第一个模型的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 柳州回阿克苏克孜尔魔鬼城经过哪里
- 下一篇: 如何在家制作简易的空气清新剂?