安全的關(guān)鍵.png)
使用這些基本 REST API 最佳實(shí)踐構(gòu)建出色的 API
本文基于keras搭建神經(jīng)網(wǎng)絡(luò)模型去預(yù)測(cè),keras是python上常用的神經(jīng)網(wǎng)絡(luò)庫(kù)。相比于tensorflow、Pytorch等庫(kù),它對(duì)初學(xué)者很友好,開(kāi)發(fā)周期較快。下圖為keras要點(diǎn)知識(shí)的速查表(原圖文末閱讀原文后可見(jiàn)):
深度學(xué)習(xí)的建模預(yù)測(cè)流程,與傳統(tǒng)機(jī)器學(xué)習(xí)整體是相同的,主要區(qū)別在于深度學(xué)習(xí)是端對(duì)端學(xué)習(xí),可以自動(dòng)提取高層次特征,大大減少了傳統(tǒng)機(jī)器學(xué)習(xí)依賴的特征工程。如下詳細(xì)梳理流程的各個(gè)節(jié)點(diǎn)并附相應(yīng)代碼:
深度學(xué)習(xí)的建模預(yù)測(cè),首先需要明確問(wèn)題,即抽象為機(jī)器 / 深度學(xué)習(xí)的預(yù)測(cè)問(wèn)題:需要學(xué)習(xí)什么樣的數(shù)據(jù)作為輸入,目標(biāo)是得到什么樣的模型做決策作為輸出。
以預(yù)測(cè)房?jī)r(jià)為例,我們需要輸入:和房?jī)r(jià)有關(guān)的數(shù)據(jù)信息為特征x,對(duì)應(yīng)的房?jī)r(jià)為y作為監(jiān)督信息。再通過(guò)神經(jīng)網(wǎng)絡(luò)模型學(xué)習(xí)特征x到房?jī)r(jià)y內(nèi)在的映射關(guān)系。通過(guò)學(xué)習(xí)好的模型輸入需要預(yù)測(cè)數(shù)據(jù)的特征x,輸出模型預(yù)測(cè)Y。對(duì)于一個(gè)良好的模型,它預(yù)測(cè)房?jī)r(jià)Y應(yīng)該和實(shí)際y很接近。
深度學(xué)習(xí)是端對(duì)端學(xué)習(xí),學(xué)習(xí)過(guò)程中會(huì)提取到高層次抽象的特征,大大弱化特征工程的依賴,正因?yàn)槿绱?,?shù)據(jù)選擇也顯得格外重要,其決定了模型效果的上限。如果數(shù)據(jù)質(zhì)量差,預(yù)測(cè)的結(jié)果自然也是很差的——業(yè)界一句名言“garbage in garbage out”。
數(shù)據(jù)選擇是準(zhǔn)備機(jī)器 / 深度學(xué)習(xí)原料的關(guān)鍵,需要關(guān)注的是:
①數(shù)據(jù)樣本規(guī)模:對(duì)于深度學(xué)習(xí)等復(fù)雜模型,通常樣本量越多越好。如《Revisiting Unreasonable Effectiveness of Data in Deep Learning Era 》等研究,一定規(guī)模下,深度學(xué)習(xí)性能會(huì)隨著數(shù)據(jù)量的增加而增加。
然而工程實(shí)踐中,受限于硬件支持、標(biāo)注標(biāo)簽成本等原因,樣本的數(shù)據(jù)量通常是比較有限的,這也是機(jī)器學(xué)習(xí)的重難點(diǎn)。對(duì)于模型所需最少的樣本量,其實(shí)沒(méi)有固定準(zhǔn)則,需要要結(jié)合實(shí)際樣本特征、任務(wù)復(fù)雜度等具體情況(經(jīng)驗(yàn)上,對(duì)于分類(lèi)任務(wù),每個(gè)類(lèi)別要上千的樣本數(shù))。當(dāng)樣本數(shù)據(jù)量較少以及樣本不均衡情況,深度學(xué)習(xí)常用到數(shù)據(jù)增強(qiáng)的方法。
② 數(shù)據(jù)的代表性:數(shù)據(jù)質(zhì)量差、無(wú)代表性,會(huì)導(dǎo)致模型擬合效果差。需要明確與任務(wù)相關(guān)的數(shù)據(jù)表范圍,避免缺失代表性數(shù)據(jù)或引入大量無(wú)關(guān)數(shù)據(jù)作為噪音。
③ 數(shù)據(jù)時(shí)間范圍:對(duì)于監(jiān)督學(xué)習(xí)的特征變量x及標(biāo)簽y,如與時(shí)間先后有關(guān),則需要?jiǎng)澏ê脭?shù)據(jù)時(shí)間窗口,否則可能會(huì)導(dǎo)致常見(jiàn)的數(shù)據(jù)泄漏問(wèn)題,即存在了特征與標(biāo)簽因果顛倒的情況。
以預(yù)測(cè)房?jī)r(jià)任務(wù)為例,對(duì)數(shù)據(jù)選擇進(jìn)行說(shuō)明:
如下加載數(shù)據(jù)的代碼,使用的是keras自帶的波士頓房?jī)r(jià)數(shù)據(jù)集。一些常用的機(jī)器學(xué)習(xí)開(kāi)源數(shù)據(jù)集可以到kaggle.com/datasets、archive.ics.uci.edu等網(wǎng)站下載。
from keras.datasets import boston_housing #導(dǎo)入波士頓房?jī)r(jià)數(shù)據(jù)集
(train_x, train_y), (test_x, test_y) = boston_housing.load_data()
波士頓房?jī)r(jià)數(shù)據(jù)集是統(tǒng)計(jì)20世紀(jì)70年代中期波士頓郊區(qū)房?jī)r(jià)等情況,有當(dāng)時(shí)城鎮(zhèn)的犯罪率、房產(chǎn)稅等共計(jì)13個(gè)指標(biāo)(特征)以及對(duì)應(yīng)的房?jī)r(jià)中位數(shù)(標(biāo)簽)。
特征工程就是對(duì)原始數(shù)據(jù)分析處理,轉(zhuǎn)化為模型可用的特征。這些特征可以更好地向預(yù)測(cè)模型描述潛在規(guī)律,從而提高模型對(duì)未見(jiàn)數(shù)據(jù)的準(zhǔn)確性。對(duì)于深度學(xué)習(xí)模型,特征生成等加工不多,主要是一些數(shù)據(jù)的分析、預(yù)處理,然后就可以灌入神經(jīng)網(wǎng)絡(luò)模型了。
選擇好數(shù)據(jù)后,可以先做探索性數(shù)據(jù)分析(EDA)去理解數(shù)據(jù)本身的內(nèi)部結(jié)構(gòu)及規(guī)律。如果你對(duì)數(shù)據(jù)情況不了解,也沒(méi)有相關(guān)的業(yè)務(wù)背景知識(shí),不做相關(guān)的分析及預(yù)處理,直接將數(shù)據(jù)喂給模型往往效果不太好。通過(guò)探索性數(shù)據(jù)分析,可以了解數(shù)據(jù)分布、缺失、異常及相關(guān)性等情況。
我們可以通過(guò)EDA數(shù)據(jù)分析庫(kù)如pandas profiling,自動(dòng)生成分析報(bào)告,可以看到這份現(xiàn)成的數(shù)據(jù)集是比較”干凈的”:
import pandas as pd
import pandas_profiling
# 特征名稱(chēng)
feature_name = ['CRIM|住房所在城鎮(zhèn)的人均犯罪率',
'ZN|住房用地超過(guò) 25000 平方尺的比例',
'INDUS|住房所在城鎮(zhèn)非零售商用土地的比例',
'CHAS|有關(guān)查理斯河的虛擬變量(如果住房位于河邊則為1,否則為0 )',
'NOX|一氧化氮濃度',
'RM|每處住房的平均房間數(shù)',
'AGE|建于 1940 年之前的業(yè)主自住房比例',
'DIS|住房距離波士頓五大中心區(qū)域的加權(quán)距離',
'RAD|距離住房最近的公路入口編號(hào)',
'TAX 每 10000 美元的全額財(cái)產(chǎn)稅金額',
'PTRATIO|住房所在城鎮(zhèn)的師生比例',
'B|1000(Bk|0.63)^2,其中 Bk 指代城鎮(zhèn)中黑人的比例',
'LSTAT|弱勢(shì)群體人口所占比例']
train_df = pd.DataFrame(train_x, columns=feature_name) # 轉(zhuǎn)為df格式
pandas_profiling.ProfileReport(train_df)
像圖像、文本字符類(lèi)的數(shù)據(jù),需要轉(zhuǎn)換為計(jì)算機(jī)能夠處理的數(shù)值形式。圖像數(shù)據(jù)(pixel image)實(shí)際上是由一個(gè)像素組成的矩陣所構(gòu)成的,而每一個(gè)像素點(diǎn)又是由RGB顏色通道中分別代表R、G、B的一個(gè)三維向量表示,所以圖像實(shí)際上可以用RGB三維矩陣(3-channel matrix)的表示(第一個(gè)維度:高度,第二個(gè)維度:寬度,第三個(gè)維度:RGB通道),最終再重塑為一列向量(reshaped image vector)方便輸入模型。
文本類(lèi)(類(lèi)別型)的數(shù)據(jù)可以用多維數(shù)組表示,包括:① ONEHOT(獨(dú)熱編碼)表示:它是用單獨(dú)一個(gè)位置的0或1來(lái)表示每個(gè)變量值,這樣就可以將每個(gè)不同的字符取值用唯一的多維數(shù)組來(lái)表示,將文字轉(zhuǎn)化為數(shù)值。如字符類(lèi)的性別信息就可以轉(zhuǎn)換為“是否為男”、“是否為女”、“未知”等特征。
②word2vetor分布式表示:它基本的思想是通過(guò)神經(jīng)網(wǎng)絡(luò)模型學(xué)習(xí)每個(gè)單詞與鄰近詞的關(guān)系,從而將單詞表示成低維稠密向量。通過(guò)這樣的分布式表示可以學(xué)習(xí)到單詞的語(yǔ)義信息,直觀來(lái)看語(yǔ)義相似的單詞其對(duì)應(yīng)的向量距離相近。
數(shù)據(jù)集已是數(shù)值類(lèi)數(shù)據(jù),本節(jié)不做處理。
從數(shù)據(jù)分析報(bào)告可見(jiàn),波士頓房?jī)r(jià)數(shù)據(jù)集無(wú)異常、缺失值情況,本節(jié)不做處理。
特征生成作用在于彌補(bǔ)基礎(chǔ)特征對(duì)樣本信息的表達(dá)有限,增加特征的非線性表達(dá)能力,提升模型效果。它是根據(jù)基礎(chǔ)特征的含義進(jìn)行某種處理(聚合 / 轉(zhuǎn)換之類(lèi)),常用方法如人工設(shè)計(jì)、自動(dòng)化特征衍生(如featuretools工具):
深度神經(jīng)網(wǎng)絡(luò)會(huì)自動(dòng)學(xué)習(xí)到高層次特征,常見(jiàn)的深度學(xué)習(xí)的任務(wù),圖像類(lèi)、文本類(lèi)任務(wù)通常很少再做特征生成。而對(duì)于數(shù)值類(lèi)的任務(wù),加工出顯著特征對(duì)加速模型的學(xué)習(xí)是有幫助的,可以做嘗試。
特征已經(jīng)比較全面,本節(jié)不再做處理,可自行驗(yàn)證特征生成的效果。
特征選擇用于篩選出顯著特征、摒棄非顯著特征。這樣做主要可以減少特征(避免維度災(zāi)難),提高訓(xùn)練速度,降低運(yùn)算開(kāi)銷(xiāo);減少干擾噪聲,降低過(guò)擬合風(fēng)險(xiǎn),提升模型效果。常用的特征選擇方法有:過(guò)濾法(如特征缺失率、單值率、相關(guān)系數(shù))、包裝法(如RFE遞歸特征消除、雙向搜索)、嵌入法(如帶L1正則項(xiàng)的模型、樹(shù)模型自帶特征選擇)。
模型使用L1正則項(xiàng)方法,本節(jié)不再做處理,可自行驗(yàn)證其他方法。
神經(jīng)網(wǎng)絡(luò)模型的訓(xùn)練主要有3個(gè)步驟:
常見(jiàn)的神經(jīng)網(wǎng)絡(luò)模型結(jié)構(gòu)有全連接神經(jīng)網(wǎng)絡(luò)(FCN)、RNN(常用于文本 / 時(shí)間系列任務(wù))、CNN(常用于圖像任務(wù))等等。
神經(jīng)網(wǎng)絡(luò)由輸入層、隱藏層與輸出層構(gòu)成。不同的層數(shù)、神經(jīng)元(計(jì)算單元)數(shù)目的模型性能也會(huì)有差異。
對(duì)于模型結(jié)構(gòu)的神經(jīng)元個(gè)數(shù) ,輸入層、輸出層的神經(jīng)元個(gè)數(shù)通常是確定的,主要需要考慮的是隱藏層的深度及寬度,在忽略網(wǎng)絡(luò)退化問(wèn)題的前提下,通常隱藏層的神經(jīng)元的越多,模型有更多的容量(capcity)去達(dá)到更好的擬合效果(也更容易過(guò)擬合)。搜索合適的網(wǎng)絡(luò)深度及寬度,常用有人工經(jīng)驗(yàn)調(diào)參、隨機(jī) / 網(wǎng)格搜索、貝葉斯優(yōu)化等方法。經(jīng)驗(yàn)上的做法,可以參照下同類(lèi)任務(wù)效果良好的神經(jīng)網(wǎng)絡(luò)模型的結(jié)構(gòu),結(jié)合實(shí)際的任務(wù),再做些微調(diào)。
根據(jù)萬(wàn)能近似原理,簡(jiǎn)單來(lái)說(shuō),神經(jīng)網(wǎng)絡(luò)有“夠深的網(wǎng)絡(luò)層”以及“至少一層帶激活函數(shù)的隱藏層”,既可以擬合任意的函數(shù)??梢?jiàn)激活函數(shù)的重要性,它起著特征空間的非線性轉(zhuǎn)換。對(duì)于激活函數(shù)選擇的經(jīng)驗(yàn)性做法:
權(quán)重參數(shù)初始化可以加速模型收斂速度,影響模型結(jié)果。常用的初始化方法有:
batch normalization(BN)批標(biāo)準(zhǔn)化,是神經(jīng)網(wǎng)絡(luò)模型常用的一種優(yōu)化方法。它的原理很簡(jiǎn)單,即是對(duì)原來(lái)的數(shù)值進(jìn)行標(biāo)準(zhǔn)化處理:
batch normalization在保留輸入信息的同時(shí),消除了層與層間的分布差異,具有加快收斂,同時(shí)有類(lèi)似引入噪聲正則化的效果。它可應(yīng)用于網(wǎng)絡(luò)的輸入層或隱藏層,當(dāng)用于輸入層,就是線性模型常用的特征標(biāo)準(zhǔn)化處理。
正則化是在以(可能)增加經(jīng)驗(yàn)損失為代價(jià),以降低泛化誤差為目的,抑制過(guò)擬合,提高模型泛化能力的方法。經(jīng)驗(yàn)上,對(duì)于復(fù)雜任務(wù),深度學(xué)習(xí)模型偏好帶有正則化的較復(fù)雜模型,以達(dá)到較好的學(xué)習(xí)效果。常見(jiàn)的正則化策略有:dropout,L1、L2、earlystop方法。
機(jī)器 / 深度學(xué)習(xí)通過(guò)學(xué)習(xí)到“好”的模型去決策,“好”即是機(jī)器 / 深度學(xué)習(xí)的學(xué)習(xí)目標(biāo),通常也就是預(yù)測(cè)值與目標(biāo)值之間的誤差盡可能的低。衡量這種誤差的函數(shù)稱(chēng)為代價(jià)函數(shù) (Cost Function)或者損失函數(shù)(Loss Function),更具體地說(shuō),機(jī)器 / 深度學(xué)習(xí)的目標(biāo)是極大化降低損失函數(shù)。
對(duì)于不同的任務(wù),往往也需要用不同損失函數(shù)衡量,經(jīng)典的損失函數(shù)包括回歸任務(wù)的均方誤差損失函數(shù)及二分類(lèi)任務(wù)的交叉熵?fù)p失函數(shù)等。
衡量模型回歸預(yù)測(cè)的誤差情況,一個(gè)簡(jiǎn)單思路是用各個(gè)樣本i的預(yù)測(cè)值f(x;w)減去實(shí)際值y求平方后的平均值,這也就是經(jīng)典的均方誤差(Mean Squared Error)損失函數(shù)。通過(guò)極小化降低均方誤差損失函數(shù),可以使得模型預(yù)測(cè)值與實(shí)際值數(shù)值差異盡量小。
衡量二分類(lèi)預(yù)測(cè)模型的誤差情況,常用交叉熵?fù)p失函數(shù),使得模型預(yù)測(cè)分布盡可能與實(shí)際數(shù)據(jù)經(jīng)驗(yàn)分布一致(最大似然估計(jì))。
另外,還有一些針對(duì)優(yōu)化難點(diǎn)而設(shè)計(jì)的損失函數(shù),如Huber Loss主要用于解決回歸問(wèn)題中,存在奇點(diǎn)數(shù)據(jù)帶偏模型訓(xùn)練的問(wèn)題。Focal Loss主要解決分類(lèi)問(wèn)題中類(lèi)別不均衡導(dǎo)致的模型訓(xùn)偏問(wèn)題。
當(dāng)我們機(jī)器 / 深度學(xué)習(xí)的學(xué)習(xí)目標(biāo)是極大化降低(某個(gè))損失函數(shù),那么如何實(shí)現(xiàn)這個(gè)目標(biāo)呢?通常機(jī)器學(xué)習(xí)模型的損失函數(shù)較復(fù)雜,很難直接求損失函數(shù)最小的公式解。幸運(yùn)的是,我們可以通過(guò)優(yōu)化算法(如梯度下降、隨機(jī)梯度下降、Adam等)有限次迭代優(yōu)化模型參數(shù),以盡可能降低損失函數(shù)的值,得到較優(yōu)的參數(shù)值。
對(duì)于大多數(shù)任務(wù)而言,通??梢灾苯酉仍囅翧dam、SGD,然后可以繼續(xù)在具體任務(wù)上驗(yàn)證不同優(yōu)化器效果。
訓(xùn)練模型前,常用的HoldOut驗(yàn)證法(此外還有留一法、k折交叉驗(yàn)證等方法),把數(shù)據(jù)集分為訓(xùn)練集和測(cè)試集,并可再對(duì)訓(xùn)練集進(jìn)一步細(xì)分為訓(xùn)練集和驗(yàn)證集,以方便評(píng)估模型的性能。① 訓(xùn)練集(training set):用于運(yùn)行學(xué)習(xí)算法,訓(xùn)練模型。② 開(kāi)發(fā)驗(yàn)證集(development set)用于調(diào)整模型超參數(shù)、EarlyStopping、選擇特征等,以選擇出合適模型。③ 測(cè)試集(test set)只用于評(píng)估已選擇模型的性能,但不會(huì)據(jù)此改變學(xué)習(xí)算法或參數(shù)。
神經(jīng)網(wǎng)絡(luò)模型的超參數(shù)是比較多的:數(shù)據(jù)方面超參數(shù) 如驗(yàn)證集比例、batch size等;模型方面 如單層神經(jīng)元數(shù)、網(wǎng)絡(luò)深度、選擇激活函數(shù)類(lèi)型、dropout率等;學(xué)習(xí)目標(biāo)方面 如選擇損失函數(shù)類(lèi)型,正則項(xiàng)懲罰系數(shù)等;優(yōu)化算法方面 如選擇梯度算法類(lèi)型、初始學(xué)習(xí)率等。
常用的超參調(diào)試有人工經(jīng)驗(yàn)調(diào)節(jié)、網(wǎng)格搜索(grid search或for循環(huán)實(shí)現(xiàn))、隨機(jī)搜索(random search)、貝葉斯優(yōu)化(bayesian optimization)等方法。
另外,有像Keras Tuner分布式超參數(shù)調(diào)試框架(文檔見(jiàn):keras.io/keras_tuner),集成了常用調(diào)參方法,還比較實(shí)用的。
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
from tensorflow import random
from keras import regularizers
from keras.layers import Dense,Dropout,BatchNormalization
from keras.models import Sequential, Model
from keras.callbacks import EarlyStopping
from sklearn.metrics import mean_squared_error
np.random.seed(1) # 固定隨機(jī)種子,使每次運(yùn)行結(jié)果固定
random.set_seed(1)
# 創(chuàng)建模型結(jié)構(gòu):輸入層的特征維數(shù)為13;1層k個(gè)神經(jīng)元的relu隱藏層;線性的輸出層;
for k in [5,20,50]: # 網(wǎng)格搜索超參數(shù):神經(jīng)元數(shù)k
model = Sequential()
model.add(BatchNormalization(input_dim=13)) # 輸入層 批標(biāo)準(zhǔn)化
model.add(Dense(k,
kernel_initializer='random_uniform', # 均勻初始化
activation='relu', # relu激活函數(shù)
kernel_regularizer=regularizers.l1_l2(l1=0.01, l2=0.01), # L1及L2 正則項(xiàng)
use_bias=True)) # 隱藏層
model.add(Dropout(0.1)) # dropout法
model.add(Dense(1,use_bias=True)) # 輸出層
model.compile(optimizer='adam', loss='mse')
# 訓(xùn)練模型
history = model.fit(train_x,
train_y,
epochs=500, # 訓(xùn)練迭代次數(shù)
batch_size=50, # 每epoch采樣的batch大小
validation_split=0.1, # 從訓(xùn)練集再拆分驗(yàn)證集,作為早停的衡量指標(biāo)
callbacks=[EarlyStopping(monitor='val_loss', patience=20)], #早停法
verbose=False) # 不輸出過(guò)程
print("驗(yàn)證集最優(yōu)結(jié)果:",min(history.history['val_loss']))
model.summary() #打印模型概述信息
# 模型評(píng)估:擬合效果
plt.plot(history.history['loss'],c='blue') # 藍(lán)色線訓(xùn)練集損失
plt.plot(history.history['val_loss'],c='red') # 紅色線驗(yàn)證集損失
plt.show()
最后,這里簡(jiǎn)單采用for循環(huán),實(shí)現(xiàn)類(lèi)似網(wǎng)格搜索調(diào)整超參數(shù),驗(yàn)證了隱藏層的不同神經(jīng)元數(shù)目(超參數(shù)k)的效果。由驗(yàn)證結(jié)果來(lái)看,神經(jīng)元數(shù)目為50時(shí),損失可以達(dá)到10的較優(yōu)效果(可以繼續(xù)嘗試模型增加深度、寬度,達(dá)到過(guò)擬合的邊界應(yīng)該有更好的效果)。
注:本節(jié)使用的優(yōu)化方法較多(炫技ing),單純是為展示一遍各種深度學(xué)習(xí)的優(yōu)化tricks。模型并不是優(yōu)化方法越多越好,效果還是要實(shí)際問(wèn)題具體驗(yàn)證。
機(jī)器學(xué)習(xí)學(xué)習(xí)的目標(biāo)是極大化降低損失函數(shù),但這不僅僅是學(xué)習(xí)過(guò)程中對(duì)訓(xùn)練數(shù)據(jù)有良好的預(yù)測(cè)能力(極低的訓(xùn)練損失),根本上還在于要對(duì)新數(shù)據(jù)(測(cè)試集)能有很好的預(yù)測(cè)能力(泛化能力)。
評(píng)估模型的預(yù)測(cè)誤差常用損失函數(shù)的大小來(lái)判斷,如回歸預(yù)測(cè)的均方損失。但除此之外,對(duì)于一些任務(wù),用損失函數(shù)作為評(píng)估指標(biāo)并不直觀,所以像分類(lèi)任務(wù)的評(píng)估還常用f1-score,可以直接展現(xiàn)各種類(lèi)別正確分類(lèi)情況。
查準(zhǔn)率P:是指分類(lèi)器預(yù)測(cè)為Positive的正確樣本(TP)的個(gè)數(shù)占所有預(yù)測(cè)為Positive樣本個(gè)數(shù)(TP+FP)的比例;查全率R:是指分類(lèi)器預(yù)測(cè)為Positive的正確樣本(TP)的個(gè)數(shù)占所有的實(shí)際為Positive樣本個(gè)數(shù)(TP+FN)的比例。F1-score是查準(zhǔn)率P、查全率R的調(diào)和平均:
注:如分類(lèi)任務(wù)的f1-score等指標(biāo)只能用于評(píng)估模型最終效果,因?yàn)樽鳛閷W(xué)習(xí)目標(biāo)時(shí)它們無(wú)法被高效地優(yōu)化,訓(xùn)練優(yōu)化時(shí)常用交叉熵作為其替代的分類(lèi)損失函數(shù) (surrogate loss function)。
評(píng)估模型擬合(學(xué)習(xí))效果,常用欠擬合、擬合良好、過(guò)擬合來(lái)表述,通常,擬合良好的模型有更好泛化能力,在未知數(shù)據(jù)(測(cè)試集)有更好的效果。
我們可以通過(guò)訓(xùn)練誤差及驗(yàn)證集誤差評(píng)估模型的擬合程度。從整體訓(xùn)練過(guò)程來(lái)看,欠擬合時(shí)訓(xùn)練誤差和驗(yàn)證集誤差均較高,隨著訓(xùn)練時(shí)間及模型復(fù)雜度的增加而下降。在到達(dá)一個(gè)擬合最優(yōu)的臨界點(diǎn)之后,訓(xùn)練誤差下降,驗(yàn)證集誤差上升,這個(gè)時(shí)候模型就進(jìn)入了過(guò)擬合區(qū)域。
實(shí)踐中通常欠擬合不是問(wèn)題,可以通過(guò)使用強(qiáng)特征及較復(fù)雜的模型提高學(xué)習(xí)的準(zhǔn)確度。而解決過(guò)擬合,即如何減少泛化誤差,提高泛化能力,通常才是優(yōu)化模型效果的重點(diǎn),常用的方法在于提高數(shù)據(jù)的質(zhì)量、數(shù)量以及采用適當(dāng)?shù)恼齽t化策略。
# 模型評(píng)估:擬合效果
import matplotlib.pyplot as plt
plt.plot(history.history['loss'],c='blue') # 藍(lán)色線訓(xùn)練集損失
plt.plot(history.history['val_loss'],c='red') # 紅色線驗(yàn)證集損失
從訓(xùn)練集及驗(yàn)證集的損失來(lái)看,訓(xùn)練集、驗(yàn)證集損失都比較低,模型沒(méi)有過(guò)擬合現(xiàn)象。
# 模型評(píng)估:測(cè)試集預(yù)測(cè)結(jié)果
pred_y = model.predict(test_x)[:,0]
print("正確標(biāo)簽:",test_y)
print("模型預(yù)測(cè):",pred_y )
print("實(shí)際與預(yù)測(cè)值的差異:",mean_squared_error(test_y,pred_y ))
#繪圖表示
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# 設(shè)置圖形大小
plt.figure(figsize=(8, 4), dpi=80)
plt.plot(range(len(test_y)), test_y, ls='-.',lw=2,c='r',label='真實(shí)值')
plt.plot(range(len(pred_y)), pred_y, ls='-',lw=2,c='b',label='預(yù)測(cè)值')
# 繪制網(wǎng)格
plt.grid(alpha=0.4, linestyle=':')
plt.legend()
plt.xlabel('number') #設(shè)置x軸的標(biāo)簽文本
plt.ylabel('房?jī)r(jià)') #設(shè)置y軸的標(biāo)簽文本
# 展示
plt.show()
評(píng)估測(cè)試集的預(yù)測(cè)結(jié)果,其mse損失為19.7,觀察測(cè)試集的實(shí)際值與預(yù)測(cè)值兩者的數(shù)值曲線是比較一致的!模型預(yù)測(cè)效果較好。
決策應(yīng)用是機(jī)器學(xué)習(xí)最終目的,對(duì)模型預(yù)測(cè)信息加以分析解釋?zhuān)?yīng)用于實(shí)際的工作領(lǐng)域。
對(duì)于實(shí)際工作需要注意的是,工程上是結(jié)果導(dǎo)向,模型在線上運(yùn)行的效果直接決定模型的成敗,不僅僅包括其準(zhǔn)確程度、誤差等情況,還包括其運(yùn)行的速度(時(shí)間復(fù)雜度)、資源消耗程度(空間復(fù)雜度)、穩(wěn)定性的綜合考慮。
對(duì)于神經(jīng)網(wǎng)絡(luò)模型預(yù)測(cè)的分析解釋?zhuān)覀冇袝r(shí)需要知道學(xué)習(xí)的內(nèi)容,決策的過(guò)程是怎么樣的(模型的可解釋性)。一個(gè)可以解釋的AI模型(Explainable AI, 簡(jiǎn)稱(chēng)XAI)意味著運(yùn)作的透明,便于人類(lèi)對(duì)于對(duì)AI決策的監(jiān)督及接納,以保證算法的公平性、安全性及隱私性,從而創(chuàng)造更加安全可靠的應(yīng)用。深度學(xué)習(xí)可解釋性常用方法有:LIME、LRP、SHAP等方法。
如下通過(guò)SHAP方法,對(duì)模型預(yù)測(cè)單個(gè)樣本的結(jié)果做出解釋?zhuān)梢?jiàn)在這個(gè)樣本的預(yù)測(cè)中,CRIM犯罪率為0.006、RM平均房間數(shù)為6.575對(duì)于房?jī)r(jià)是負(fù)相關(guān)的。LSTAT弱勢(shì)群體人口所占比例為4.98對(duì)于房?jī)r(jià)的貢獻(xiàn)是正相關(guān)的…,在綜合這些因素后模型給出最終預(yù)測(cè)值。
import shap
import tensorflow as tf # tf版本<2.0
# 模型解釋性
background = test_x[np.random.choice(test_x.shape[0],100, replace=False)]
explainer = shap.DeepExplainer(model,background)
shap_values = explainer.shap_values(test_x) # 傳入特征矩陣X,計(jì)算SHAP值
# 可視化第一個(gè)樣本預(yù)測(cè)的解釋
shap.force_plot(explainer.expected_value, shap_values[0,:], test_x.iloc[0,:])
文章轉(zhuǎn)自微信公眾號(hào)@算法進(jìn)階
對(duì)比大模型API的內(nèi)容創(chuàng)意新穎性、情感共鳴力、商業(yè)轉(zhuǎn)化潛力
一鍵對(duì)比試用API 限時(shí)免費(fèi)