构建ML模型的步骤
構(gòu)建ML模型的步驟
現(xiàn)在我們已經(jīng)看了解到了一些ML應(yīng)用程序的例子,問題是,我們?nèi)绾螛?gòu)建這樣的ML應(yīng)用程序和系統(tǒng)?
下圖總結(jié)了我們使用ML開發(fā)應(yīng)用程序的方法,我們將在下面更詳細地討論這個問題:
?
如上圖所示,建立學(xué)習(xí)模型的步驟如下:
???????問題定義:任何項目的第一步不僅是理解我們想要解決的問題,也定義了我們?nèi)绾问褂肕L來解決問題。這第一步無疑是構(gòu)建有用的ML模型和應(yīng)用程序中最重要的一步。在開始構(gòu)建ML模型之前,我們至少應(yīng)該回答以下四個問題:
l??當前碰到了什么問題?這是我們描述和陳述我們試圖解決的問題的地方。例如,一個問題描述可能是需要一個系統(tǒng)來評估小企業(yè)主償還小企業(yè)貸款項目貸款的能力。
l??為什么這是個問題?重要的是要定義為什么這樣的問題實際上是一個問題,以及為什么新的ML模型將是有用的。也許我們已經(jīng)有了一個可用的模型,但發(fā)現(xiàn)它的表現(xiàn)比以前差了;我們可能已經(jīng)獲得了新的數(shù)據(jù)源,可以用來構(gòu)建新的預(yù)測模型;或者我們希望現(xiàn)有的模型能夠更快地產(chǎn)生預(yù)測結(jié)果。認為這是一個問題,并且需要一個新模型的原因可能有多種。定義它為什么是一個問題,將幫助我們在構(gòu)建新的ML模型時,保持在正確的軌道上。
l??解決這個問題的方法有哪些?這是我們集思廣益解決給定問題的方法的地方。我們應(yīng)該考慮這個模型是如何使用的(需要這是一個實時系統(tǒng)還是會作為批處理運行?),它是什么類型的問題(這是一個分類問題,回歸,聚類,還是其他東西?),和我們需要什么類型的數(shù)據(jù)模型。這將為構(gòu)建我們的機器學(xué)習(xí)模型的接下來的步驟提供良好的基礎(chǔ)。
l??成功的標準是什么?這是我們定義檢查點的地方。我們應(yīng)該考慮我們將查看什么指標,以及我們的目標模型性能應(yīng)該是什么樣的。如果我們正在構(gòu)建一個將在實時系統(tǒng)中使用的模型,那么我們還可以在運行時將目標執(zhí)行速度和數(shù)據(jù)可用性設(shè)置為成功標準的一部分。設(shè)定這些成功的標準將幫助我們繼續(xù)前進,而不會在某個特定的步驟上停滯不前。
收集數(shù)據(jù):擁有數(shù)據(jù)是構(gòu)建ML模型最基本和最關(guān)鍵的部分,最好是擁有大量數(shù)據(jù)。沒有數(shù)據(jù),就沒有模型。根據(jù)我們的項目,收集數(shù)據(jù)的方法可能有所不同。我們可以從其他供應(yīng)商購買現(xiàn)有的數(shù)據(jù)源,可以抓取網(wǎng)站并提取數(shù)據(jù),可以使用公共數(shù)據(jù),也可以收集自己的數(shù)據(jù)。收集ML模型所需的數(shù)據(jù)有多種方法,但是在數(shù)據(jù)收集過程中需要記住這兩個數(shù)據(jù)元素—目標變量和特征變量。目標變量是預(yù)測的答案,而特征變量是模型用來學(xué)習(xí)如何預(yù)測目標變量的因素。通常,目標變量不會以標記的形式出現(xiàn)。例如,當我處理微博數(shù)據(jù)以預(yù)測每條微博的情緒時,我們可能沒有為每條微博標記情緒數(shù)據(jù)。在這種情況下,我們必須采取額外的步驟來標記目標變量。收集了數(shù)據(jù)之后,就可以進入準備數(shù)據(jù)步驟。
數(shù)據(jù)準備:收集完所有輸入數(shù)據(jù)后,需要準備一個可用的格式。這一步比想象的更重要。如果我們擁有雜亂的數(shù)據(jù),而沒有為我們的學(xué)習(xí)算法去清理它,那么我們的算法將不會從我們收集到的的數(shù)據(jù)集中很好地學(xué)習(xí),也不會像預(yù)期的那樣執(zhí)行。此外,即使我們擁有高質(zhì)量的數(shù)據(jù),如果我們的數(shù)據(jù)不是我們的算法可以訓(xùn)練的格式,那么擁有高質(zhì)量的數(shù)據(jù)是沒有任何意義的。至少我們應(yīng)該處理以下列出的一些常見問題,以便我們的數(shù)據(jù)為下一步做好準備:
n??文件格式:如果我們從多個數(shù)據(jù)源獲取數(shù)據(jù),那么很可能會遇到每個數(shù)據(jù)源的不同格式問題。有些數(shù)據(jù)可能是CSV格式,而其他數(shù)據(jù)是JSON或XML格式。有些數(shù)據(jù)甚至可能存儲在關(guān)系數(shù)據(jù)庫中。為了訓(xùn)練我們的ML模型,我們首先需要將所有這些不同格式的數(shù)據(jù)源合并到一個標準格式中。
n??數(shù)據(jù)格式:不同數(shù)據(jù)源之間的數(shù)據(jù)格式也可能不同。例如,一些數(shù)據(jù)可能將地址字段分解為街道地址、市區(qū)、省份和郵政編碼,而另一些數(shù)據(jù)可能沒有。有些數(shù)據(jù)的日期字段可能是美國日期格式(mm/dd/yyyy),而有些數(shù)據(jù)可能是英國日期格式(dd/mm/yyyy)。在解析這些值時,數(shù)據(jù)源之間的這些數(shù)據(jù)格式差異可能會導(dǎo)致問題。為了訓(xùn)練我們的ML模型,我們需要為每個字段提供統(tǒng)一的數(shù)據(jù)格式。
n??重復(fù)記錄:我們經(jīng)常會看到相同的記錄在數(shù)據(jù)集中重復(fù)出現(xiàn)。此問題可能發(fā)生在數(shù)據(jù)收集過程中,在此過程中,我們不止一次地記錄了一個數(shù)據(jù)點,或者在數(shù)據(jù)準備過程中合并不同的數(shù)據(jù)集。擁有重復(fù)的記錄可能會對我們的模型產(chǎn)生負面影響,在進行下一步之前,最好檢查數(shù)據(jù)集中的是否存在重復(fù)記錄。
n??缺失值:在數(shù)據(jù)中看到一些記錄為空或缺失值也是很常見的。當我們在訓(xùn)練我們的ML模型時,這也會產(chǎn)生不利的影響。有很多種方法可以處理數(shù)據(jù)中缺失的值,但是我們必須非常小心并很好地理解我們的數(shù)據(jù),因為這可能會極大地改變我們的模型性能。處理缺失值的一些方法包括用缺失值刪除記錄、用平均值或中位數(shù)替換缺失值、用常量替換缺失值等等方法。在處理缺失值之前,研究我們的數(shù)據(jù)將會是意見非常有用的事情。
數(shù)據(jù)分析:現(xiàn)在我們的數(shù)據(jù)已經(jīng)準備好了,是時候?qū)嶋H查看數(shù)據(jù)了,看看我們是否能夠識別任何模式并從數(shù)據(jù)中獲得一些見解。摘要統(tǒng)計和圖表是描述和理解數(shù)據(jù)的兩種最佳方法。對于連續(xù)變量,從最小值、最大值、平均值、中值和四分位數(shù)開始比較好。對于分類變量,我們可以查看類別的計數(shù)和百分比。在查看這些匯總統(tǒng)計信息時,還可以開始繪制圖形來可視化數(shù)據(jù)結(jié)構(gòu)。下圖顯示了一些常用的數(shù)據(jù)分析圖表。直方圖常用來顯示和檢查變量、離散值和偏差的基本分布。箱形圖經(jīng)常用于可視化五位數(shù)摘要、離散值和偏差。散點圖經(jīng)常被用來檢測變量之間明顯的兩兩相關(guān)關(guān)系:
?
?
?數(shù)據(jù)分析和可視化。左上:房屋銷售價格直方圖,右上:房屋銷售價格直方圖,左下:地下室、一層、二層建筑面積分布的箱形圖,右下:一層與二層建筑面積的散點圖。
<script src="
? ? <script src=".www.jintianxuesha.com./lib/webgl-utils.js"></script>
? ? <script src=".www.baiyytwg.com./lib/webgl-debug.js"></script>
? ? <script src=".www.sangyuLpt.com./lib/cuon-utils.js"></script>
? ? <script src=".www.qjljdgt.cn ? ./lib/cuon-matrix.js"></script>
? ? <script src="Triangle_MVPMatrix.js"></script>../lib/webgl-utils.js"></script>
? ? <script src=".www.yuanyangyuL.com ./lib/webgl-debug.js"></script>
? ? <script src="../lib/cuon-utils.js"></script>
? ? <script src="../lib/cuon-matrix.js"></script>
? ? <script src="Triangle_MVPMatrix.js"></script>
構(gòu)造特征:構(gòu)造特征是應(yīng)用ML中模型構(gòu)建過程中最重要的部分,然而,這是許多教科書和ML課程中討論最少的話題之一。構(gòu)造特征是將原始輸入數(shù)據(jù)轉(zhuǎn)換為更有意義的數(shù)據(jù),以供算法學(xué)習(xí)的過程。例如,對于我們將要構(gòu)建的微博情緒預(yù)測模型,我們的原始輸入數(shù)據(jù)可能僅在一列中包含文本列表,而在另一列中包含情緒目標列表。我們的ML模型可能不會學(xué)習(xí)如何用這些原始數(shù)據(jù),來進行很好地預(yù)測每條博文的情緒。但是,如果我們轉(zhuǎn)換這些數(shù)據(jù),列出每條博文中每個單詞出現(xiàn)的次數(shù),那么我們的學(xué)習(xí)算法可以更容易地了解某些單詞的存在與情緒之間的關(guān)系。我們還可以將每個單詞與其相鄰的單詞(bigram)進行分組,并將每條博文中每個相鄰的單詞(bigram)的出現(xiàn)次數(shù)作為另一組特征。從這個例子中可以看出,構(gòu)造特征是一種使原始數(shù)據(jù)更具有代表性和更能反映潛在問題的方法。構(gòu)造特征是一門科學(xué),也是一門藝術(shù)。構(gòu)造特征需要良好的數(shù)據(jù)集領(lǐng)域知識,從原始輸入數(shù)據(jù)構(gòu)建新特征的創(chuàng)造力,以及多次迭代以獲得更好的結(jié)果。在后面的文章中,我們將會學(xué)習(xí)一些具體的構(gòu)造特征的方法。
訓(xùn)練/測試算法:一旦我們創(chuàng)建了自己的特性,就該訓(xùn)練和測試一些ML算法了。在開始訓(xùn)練模型之前,最好考慮一下性能指標。根據(jù)我們正在解決的問題,對性能度量的選擇將會有所不同。例如,如果我們正在構(gòu)建一個價格預(yù)測模型,我們可能希望最小化我們的預(yù)測與實際價格之間的差異,并選擇均方根誤差(RMSE)作為性能度量。如果我們正在構(gòu)建一個信用模型來預(yù)測一個人是否能夠獲得貸款批準,那么我們可能希望使用精確度作為性能度量,因為錯誤的貸款批準(假陽性)比錯誤的貸款不批準(假陰性)具有更大的負面影響。
一旦我們的模型有了具體的性能度量,我們就可以訓(xùn)練和測試各種學(xué)習(xí)算法及其性能。根據(jù)我們的預(yù)測目標,我們對學(xué)習(xí)算法的選擇也會有所不同。下圖展示了一些常見的機器學(xué)習(xí)問題。如果我們正在解決分類問題,那么我們可能希望訓(xùn)練分類器,例如邏輯回歸模型、樸素貝葉斯分類器或隨機森林分類器。另一方面,如果我們有一個連續(xù)的目標變量,那么我們就需要訓(xùn)練回歸量,比如線性回歸模型,k近鄰,或者支持向量機(SVM)。如果我們想通過無監(jiān)督學(xué)習(xí)從數(shù)據(jù)中獲得一些見解,你可以使用k-means聚類或mean shift算法:
?
左:分類,中:回歸,右:聚類
最后,我們必須考慮如何測試和評估我們嘗試的學(xué)習(xí)算法的性能。將數(shù)據(jù)集分成訓(xùn)練集和測試集,并運行交叉驗證是測試和比較ML模型最常用的兩種方法。分裂成兩個子集的數(shù)據(jù)集的目的,一個用于訓(xùn)練,一個用于測試。K-fold交叉驗證是評估模型性能的另一種方法。它首先將數(shù)據(jù)集分割成大小相等的K個子集,并將其中一個子集留作測試,其余的進行訓(xùn)練。例如,在3倍交叉驗證中,數(shù)據(jù)集將首先分成三個大小相等的子集。在第一次迭代中,我們將使用包#1和#2來訓(xùn)練我們的模型,并在包#3上進行測試。在第二個迭代中,我們將使用包#1和#3在包#2上訓(xùn)練和測試我們的模型,在第三個迭代中,我們將使用包#2和#3在包#1上訓(xùn)練和測試我們的模型。然后,我們將性能度量進行平均,以估計模型的性能:
改進結(jié)果:到目前為止,我們已經(jīng)有了一個或兩個表現(xiàn)相當不錯的候選模型,但是可能仍然存在一些改進的空間。也許我們的候選模型在某種程度上過度擬合了,他們可能不符合我們的目標,有多種方法可以幫助提高我們的模型和他們的性能如下:
l??超參數(shù)調(diào)優(yōu):我們可以調(diào)優(yōu)模型的配置,以潛在地提高性能結(jié)果。例如,對于隨機森林模型,我們可以調(diào)整樹的最大高度或森林中的樹的數(shù)量。對于向量機,我們可以調(diào)整內(nèi)核或成本值。
l??集成:集成是將多個模型的結(jié)果結(jié)合起來以獲得更好的效果。集成是同樣的算法在不同數(shù)據(jù)集的子集進行訓(xùn)練,提高結(jié)合不同模型相同的訓(xùn)練集,進行訓(xùn)練和疊加,模型的輸出作為輸入的元模型,學(xué)習(xí)如何結(jié)合子模型的結(jié)果。
部署:一旦準備好了我們的模型,就到了讓它們在生產(chǎn)環(huán)境中運行的時候了。確保在我們的模型完全部署之前,已經(jīng)進行了大量的測試。為我們的模型開發(fā)監(jiān)控工具也是一個很好的方法,因為隨著輸入數(shù)據(jù)的發(fā)展,模型性能會隨著時間的推移而下降。
總結(jié)
在本章中,我們學(xué)習(xí)了開發(fā)ML模型的步驟以及每個步驟中的常見挑戰(zhàn)和任務(wù)。在接下來的章節(jié)中,我們將遵循這些步驟來完成我們的項目,我們將更詳細地探索某些步驟,特別是在構(gòu)造特征、模型選擇和模型性能評估方面。我們將根據(jù)要解決的問題類型,討論在每個步驟中可以應(yīng)用的各種技術(shù)。
在下一章中,我們將直接應(yīng)用ML的基本原理來構(gòu)建垃圾郵件過濾的ML模型。我們將按照本章討論的構(gòu)建ML模型的步驟,將原始電子郵件數(shù)據(jù)轉(zhuǎn)換為結(jié)構(gòu)化數(shù)據(jù)集,分析電子郵件文本數(shù)據(jù)以獲得一些見解,最后構(gòu)建預(yù)測電子郵件是否是垃圾郵件的分類模型。在下一章中,我們還將討論一些常用的分類模型評估指標。
“老天爺給你的任何機會,你也不會珍惜,更不會深入下去,你認為自己就是窮命,最喜歡通過脈脈閱讀免費的職場技巧。如果你還是杠精思維,任何事情,跑上來先論證困難,給自己一個不干不參與的充分理由,那你完了。人生不過是短短十五年的機會,到了四十歲,你還在屌絲堆里,啥也不干,那你沒希望了。”
總結(jié)
- 上一篇: 如何给使用 i 标签放图标 文字类型图标
- 下一篇: asterisk1.4与asterisk