機(jī)器學(xué)習(xí)算法幾種常見步驟
1.收集數(shù)據(jù)。
可以使用很多種方法收集樣本數(shù)據(jù),例如制作網(wǎng)絡(luò)爬蟲從網(wǎng)站上爬取數(shù)據(jù),從RSS反饋或者API中得到信息,設(shè)備發(fā)送過來的實(shí)測(cè)數(shù)據(jù)(風(fēng)速,血糖等)。
2.準(zhǔn)備輸入數(shù)據(jù)。
得到數(shù)據(jù)之后,還必須確保數(shù)據(jù)格式符合要求,使用標(biāo)準(zhǔn)數(shù)據(jù)格式后可以融合算法和數(shù)據(jù)源,方便匹配操作。此外還需要為機(jī)器學(xué)習(xí)準(zhǔn)備特定的數(shù)據(jù)格式,如某些算法要求特征值使用特定的格式,一些算法要求目標(biāo)變量和特征值是字符串類型,而另一些算法可能要求是整數(shù)類型。
3,分析輸入數(shù)據(jù)。
此步驟主要是人工分析以前得到的數(shù)據(jù)。為了確保前兩步有效,最簡(jiǎn)單的方法是用文本編輯器打開數(shù)據(jù)文件,查看得到的數(shù)據(jù)是否為空值,此外還可以進(jìn)一步瀏覽數(shù)據(jù),分析是否可以識(shí)別出模式:數(shù)據(jù)中是否存在明顯的異常值,如某些數(shù)據(jù)點(diǎn)與數(shù)據(jù)集中的其它值明顯存在差異。通過一維,二維三維圖形展示數(shù)據(jù)也是不錯(cuò)的方法。
這一步主要作用是確保數(shù)據(jù)集中沒有垃圾數(shù)據(jù),如果產(chǎn)品化系統(tǒng)中使用機(jī)器學(xué)習(xí)算法并且算法可以處理系統(tǒng)產(chǎn)生的數(shù)據(jù)格式,或者我們信任數(shù)據(jù)來源,可以直接跳過這一步。
4,訓(xùn)練算法。
機(jī)器學(xué)習(xí)算法到這一步才是真正的開始學(xué)習(xí)。根據(jù)算法不同,第四步和第五步是機(jī)器學(xué)習(xí)算法的核心。我們將前兩步得到的格式化數(shù)據(jù)輸入到算法,從中抽取知識(shí)或信息。這里得到的知識(shí)需要存儲(chǔ)為計(jì)算機(jī)可以處理的格式,方便后續(xù)步驟使用。
如果使用非監(jiān)督學(xué)習(xí)算法,由于不存在目標(biāo)變量值,因此也不需要訓(xùn)練算法,所有與算法相關(guān)的內(nèi)容都集中在第五步
5,測(cè)試算法。
這一步將實(shí)際使用第四步機(jī)器學(xué)習(xí)得到的知識(shí)信息。為了評(píng)估算法,必須測(cè)試算法工作的效果。對(duì)于監(jiān)督學(xué)習(xí),必須已知用于評(píng)估算法的目標(biāo)變量值,對(duì)于非監(jiān)督學(xué)習(xí),也必須用到其它的評(píng)測(cè)手段來檢驗(yàn)算法的成功率。無論那種情形,如果不滿意算法的輸出結(jié)果,則可以回到第四步,改正并加以測(cè)試。問題常常會(huì)跟數(shù)據(jù)的收集與整理有關(guān),這時(shí)就要跳到第一步重新開始。
6,使用算法。
將機(jī)器學(xué)習(xí)算法轉(zhuǎn)換為應(yīng)用程序,執(zhí)行實(shí)際任務(wù),以檢驗(yàn)上述步驟是否可以在實(shí)際環(huán)境中正常工作,此時(shí)如果遇到新的數(shù)據(jù)問題,同樣需要重復(fù)執(zhí)行上述的步驟。
二、機(jī)器學(xué)習(xí)算法訓(xùn)練預(yù)測(cè)模型的常規(guī)流程
以XGBoost算法為例,主要操作步驟如下:
讀取集群目錄數(shù)據(jù)
批量重新命名字段名稱
統(tǒng)計(jì)各列缺失值個(gè)數(shù)
對(duì)缺失值進(jìn)行填充(數(shù)值型變量采用中位數(shù)、分類變量采用眾數(shù))
過濾掉異常記錄
過濾掉缺失值過多的列
對(duì)分類型變量進(jìn)行編碼,將label列轉(zhuǎn)換為0/1類型
批量對(duì)分類變量先進(jìn)行StringIndexer操作,再批量進(jìn)行OneHotEncoderEstimator操作
使用VectorAssembler拼接字段
創(chuàng)建XGBoost
設(shè)置pipeline模式: val pipeline = new Pipeline().setStages(indexers ++ encoders ++ Array(vectorAssembler, xgb))
創(chuàng)建evaluator,采用ROC
創(chuàng)建XGBoost paramater grid
構(gòu)造cv
切分trainingData、testData,設(shè)定seed便于數(shù)據(jù)復(fù)現(xiàn)
訓(xùn)練模型: val xgbModel = cv.fit(trainingData)
測(cè)試模型: val results = xgbModel.transform(testData)
保存BestModel: val bestPipelineModel = xgbModel.bestModel.asInstanceOf[PipelineModel]
創(chuàng)建一個(gè)測(cè)試數(shù)據(jù)集不含label字段,但是需要包含對(duì)應(yīng)的user_id
讀取創(chuàng)建的數(shù)據(jù)集進(jìn)行預(yù)測(cè)
注:在進(jìn)行特征工程之前需要單獨(dú)封裝一個(gè)函數(shù),用于數(shù)據(jù)預(yù)處理,也便于后續(xù)進(jìn)行模型預(yù)測(cè),主要是特征工程暫時(shí)無法操作的數(shù)據(jù)預(yù)處理步驟。