例如我們公司在特征抽取算法上就提供了近百個(gè)特征抽取的接口,可以根據(jù)不同的情況使用不同的方式提取數(shù)據(jù)中的特征。 數(shù)據(jù)拆分也有很多種不同的拆分方法,按隨機(jī)拆分,分層拆分,規(guī)則拆分。
每個(gè)子模塊都會(huì)提供一些接口供上層調(diào)用。 所以既然提到接口層面的東西了,大家應(yīng)該都知道怎么測(cè)了吧。 只不過有些接口并不是http或者RPC協(xié)議的。 有時(shí)候需要我們?cè)诋a(chǎn)品的repo里寫測(cè)試用例。
訓(xùn)練集與測(cè)試集對(duì)比
這是我們的第三種測(cè)試思路。 我們剛才一直用來舉例的分類算法是一種監(jiān)督學(xué)習(xí)。 什么是監(jiān)督學(xué)習(xí)呢,就是我們的歷史數(shù)據(jù)中是有答案的。還拿剛才的反欺詐的例子說,就是我們的數(shù)據(jù)中都有一個(gè)字段標(biāo)明了這條數(shù)據(jù)是否是欺詐場景。 所以我們完全可以把歷史數(shù)據(jù)拆分為訓(xùn)練集和測(cè)試集。將測(cè)試集輸入到模型中以評(píng)價(jià)模型預(yù)測(cè)出的結(jié)果的正確率如何。所以每次版本迭代都使用同樣的數(shù)據(jù),同樣的參數(shù)配置。 統(tǒng)計(jì)模型效果并進(jìn)行對(duì)比。當(dāng)然這種測(cè)試方式是一種模糊的方式。就如我再剛開始說的一樣,這種方式無法判斷問題出在哪里。是bug,還是參數(shù)設(shè)置錯(cuò)了?我們無法判斷。
常見的測(cè)試場景
1.自學(xué)習(xí)
幾乎所有的人工智能服務(wù)都必須要支持自學(xué)習(xí)場景。就像阿爾法狗一樣,它輸了一局,就會(huì)從輸?shù)倪@一局中學(xué)習(xí)到經(jīng)驗(yàn),以后他就不會(huì)那么下了,這也是機(jī)器學(xué)習(xí)恐怖的地方,它會(huì)變的越來越無懈可擊,以前人類還能贏上一局,但是未來可能人類再也贏不了阿爾法狗了。 做法就是我們的數(shù)據(jù)每天都是在更新的,用戶行為也是一直在變化的。所以我們的模型要有從最新的數(shù)據(jù)中進(jìn)行學(xué)習(xí)的能力。
上面是常見的自學(xué)習(xí)場景流程圖。假如我們用歷史上n天的數(shù)據(jù)訓(xùn)練出一個(gè)模型并發(fā)布成了一個(gè)預(yù)測(cè)的服務(wù)。 那么到了隔天的時(shí)候。我們拋棄之前第一天的數(shù)據(jù),使用第二天到第n+1天的數(shù)據(jù)重新訓(xùn)練一個(gè)模型并代替之前的模型發(fā)布一個(gè)預(yù)測(cè)服務(wù)。這樣不停的循環(huán),每一天都收集到最新的數(shù)據(jù)參與模型訓(xùn)練。 這時(shí)候大家應(yīng)該明白該測(cè)試什么了。每天收集到的新數(shù)據(jù),就是測(cè)試重點(diǎn)。就是我們剛才說的第一種測(cè)試思路,使用spark,Hbase這些技術(shù),根據(jù)業(yè)務(wù)指定規(guī)則,掃描這些數(shù)據(jù)。一旦有異常就要報(bào)警。
2.預(yù)測(cè)服務(wù)
下面一個(gè)場景是預(yù)測(cè)服務(wù)的。預(yù)測(cè)服務(wù)的架構(gòu)一般都滿復(fù)雜的,為了實(shí)現(xiàn)高可用,負(fù)載均衡等目的,所以一般都是標(biāo)準(zhǔn)的服務(wù)發(fā)現(xiàn)架構(gòu)。以etcd這種分布式存儲(chǔ)機(jī)制為載體。 所有的預(yù)測(cè)服務(wù)分別以自注冊(cè)的方式來提供服務(wù)。
上面的一個(gè)圖是一個(gè)比較流行的預(yù)測(cè)服務(wù)的架構(gòu)。當(dāng)然我做了相應(yīng)的簡化,隱去了一些細(xì)節(jié)。所有的部署任務(wù)由master寫入ETCD。 所有agent以自注冊(cè)的方式將自己的信息寫入ETCD以接受master的管理并執(zhí)行部署任務(wù)。 而router也同樣讀取etcd獲取所有agent提供的預(yù)測(cè)服務(wù)的信息并負(fù)責(zé)負(fù)載均衡。 有些公司為了做高可用和彈性伸縮甚至將agent納入了kubernetes的HPA中進(jìn)行管理。由此我們需要測(cè)試這套機(jī)制能實(shí)現(xiàn)他該有的功能。例如:
·router會(huì)按規(guī)則把壓力分發(fā)到各個(gè)agent上。
·把某個(gè)agent的預(yù)測(cè)服務(wù)被kill掉后,router會(huì)自動(dòng)切換。
·預(yù)估服務(wù)掛掉,agent會(huì)自動(dòng)感知并重新拉起服務(wù)。
·agent被kill掉后,也會(huì)被自動(dòng)拉起。
·如果做了彈性伸縮,需要將預(yù)測(cè)服務(wù)壓到臨界點(diǎn)后觀察系統(tǒng)是否做了擴(kuò)容等等。
性能測(cè)試