




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
隨機(jī)森林實(shí)驗(yàn)報(bào)告實(shí)驗(yàn)?zāi)康膶?shí)現(xiàn)隨機(jī)森林模型并測(cè)試。實(shí)驗(yàn)問(wèn)題Kaggle第二次作業(yè)Non-linearclassification算法分析與設(shè)計(jì)一.算法設(shè)計(jì)背景:.隨機(jī)森林的原子分類(lèi)器一般使用決策樹(shù),決策樹(shù)又分為擬合樹(shù)和分類(lèi)樹(shù)。這兩者的區(qū)別在于代價(jià)估值函數(shù)的不同。.根據(jù)經(jīng)驗(yàn),用擬合樹(shù)做分類(lèi)的效果比分類(lèi)樹(shù)略好。.對(duì)于一個(gè)N分類(lèi)問(wèn)題,它總是可以被分解為N個(gè)2分類(lèi)問(wèn)題,這樣分解的好處是其決策樹(shù)更加方便構(gòu)造,更加簡(jiǎn)樸,且更加有助于用擬合樹(shù)來(lái)構(gòu)建分類(lèi)樹(shù)。對(duì)于每一個(gè)2分類(lèi)問(wèn)題,構(gòu)造的樹(shù)又叫CART樹(shù),它是一顆二叉樹(shù)。.將N個(gè)2分類(lèi)樹(shù)的結(jié)果進(jìn)行匯總即可以得到多分類(lèi)的結(jié)果。.CART樹(shù)構(gòu)造:trace.pusn(u);〃樹(shù)的初始化(插入頭節(jié)點(diǎn))完成后,正式開(kāi)始決策樹(shù)的構(gòu)建while(!trace.empty()){intcurrent_node=trace.topO;trace.popQ;intcontainer[2]={0};(*Tree).getPartition(current_node,container);〃判斷當(dāng)前節(jié)點(diǎn)是否成功分割if(container[0]!=-1){trace.push(container[l]);trace.push(container[0]);}}〃訓(xùn)練完成,計(jì)算輸出下面再重點(diǎn)說(shuō)一下函數(shù):booldecisionTree::getPartition(intindex,intcontainer[2]){這個(gè)函數(shù)是單棵決策樹(shù)構(gòu)造的核心,調(diào)用這個(gè)函數(shù),假如當(dāng)前節(jié)點(diǎn)的Gini值己經(jīng)為0,那么這個(gè)函數(shù)會(huì)計(jì)算當(dāng)前節(jié)點(diǎn)的擬合值:if(Nodes[index].gini==0||Nodes[index].layer>=MaxLayerNum/*||/4Nodes[index].dataSet.sizeO<10*/){Nodes[mdex].isLeaf=1;〃計(jì)籟葉子節(jié)點(diǎn)的擬合值doublesum=0;for(inti=0;i<Nodes[index].datalndex.size();++i){sum?=trainOut[Node$(index].dataIndexIi]];//Node$[index].res[ii}Node$[mdex].value=sum/Node$[index].dataIndex.$izeO;containerfO]=container[l]=-1;returnfalse;d-結(jié)束條件是gini==0||層數(shù)等于10假如當(dāng)前節(jié)點(diǎn)不滿足結(jié)束分割條件,那么函數(shù)將對(duì)屬性進(jìn)行抽樣,抽樣的方法是打亂后取前se1ectedColumns列。然后調(diào)用getNodeA11r(s,index)獲取當(dāng)前節(jié)點(diǎn)的備選分割值,這里的s是抽取的屬性的列號(hào)的集合。〃獲得打亂后的索引,并選取前面的25個(gè)作為選取的列的索引,傳遞給getAttr,獲得所需要的分割值vector<pairl>sequence(numparametres-2);srand((unsigned)time(NULL));for(i=0;i<sequencesizeQ;++i){sequence[i].index=i;sequence(i).value=rand();)std::sort(sequence.begin()rsequence.endO.cmp);vector<int>s(SelectedColumns);for(inti=0;i<SelectedColumns;++i){s(i]=sequence[i].index;在得到備選的屬性分割值后,將進(jìn)入循環(huán),尋找最優(yōu)分割點(diǎn)for(i=0;i<SelectedColumns;++i){vector<double>::iteratorcursorfor(cursor=Nodes[index].attributes[ij.beginO;cursor!=Nodes(index].attributes[i].endO;??cursor){temp_gini=computeGini(index,s(ij,"cursor);if(min_gini>temp_gini){min_gini=temp_gini;par_label=s[i];par_value=*cursor;.最終結(jié)果計(jì)算在main函數(shù)中,我們將四個(gè)線程所得的transformOutT相加,最后遍歷取每一行最大值的下標(biāo),即可得到最終結(jié)果。六.算法優(yōu)化.應(yīng)用了數(shù)組+校建樹(shù)取代了普通的函數(shù)遞歸建樹(shù),加快了建樹(shù)速度。.在傳遞每個(gè)節(jié)點(diǎn)的節(jié)點(diǎn)數(shù)據(jù)集時(shí),使用了傳遞數(shù)據(jù)集的索引而非數(shù)據(jù)自身,這樣做的好處是,本來(lái)假如傳遞?條數(shù)據(jù)需要復(fù)制617個(gè)double類(lèi)型的數(shù)量,而現(xiàn)在只需要傳遞?個(gè)Ini型的索引,這種快了617倍的數(shù)據(jù)集傳遞方式使程序運(yùn)營(yíng)效率提高了10倍以上。.在每個(gè)屬性中選擇備選分割值的時(shí)候,采用了一種下采樣的策略。即:假如該節(jié)點(diǎn)的數(shù)據(jù)集大小小于某一數(shù)值,則將這個(gè)數(shù)據(jù)集的這個(gè)屬性的所有值都納入候選分割值列表。但是假如大于了這個(gè)閾值,則將屬性所相應(yīng)的列進(jìn)行排序后再進(jìn)行等間距采樣得到樣本數(shù)等于閾值的子集作為候選分割集。代碼詳見(jiàn)getPartition().這樣做的好處是需要計(jì)算的分割gini值大大減少了(本人取的采樣閾值時(shí)100,相比原數(shù)據(jù)集,樣本空間縮小了盡30倍),這里也再一次加速了程序運(yùn)營(yíng)。但是這個(gè)優(yōu)化隨機(jī)而來(lái)的?個(gè)問(wèn)題是:有也許每次分割都不是最佳分割。.使用了C++I1的vihread>庫(kù)進(jìn)行了并行實(shí)現(xiàn),開(kāi)出4個(gè)線程,程序相比單線程加速了4倍。七.并行實(shí)現(xiàn)C++11〈thread〉庫(kù)創(chuàng)建線程,為每個(gè)線程賦予獨(dú)立的數(shù)據(jù)容器,并將隨機(jī)森林提成等量的4部分(由于我使用的是4個(gè)線程)。即,每個(gè)線程中執(zhí)行的函數(shù)承擔(dān)1/4規(guī)模的隨機(jī)森林的構(gòu)造,實(shí)現(xiàn)代碼如下:threatthreadl(mainInThread.transformOutPerTimeTl,trainlnPerTimeTl,tran$formTe$tOutTl,&Treel);threadthread2(mainInThread,transformOutPerTimeT2,trainInPerTimeT2,transformTestOutT2,&Tree2);threat:thread3(mainInThread,transformOutPerTimeT3,trainInPerTimeT3,transformTestOutT3,&Tree3);threadthread4(mainInThread,transformOutPerTimeT4,trainInPerTimeT4,transformTestOutT4,&Tree4);threadl.join();thread2.join();thread3.join();thread4.join();intmainInThread(inttransformOutPerTime_[][type$Num+1].doubletrainInPerTime_l][numparametres-2],doubletransformTestOut[]/廉財(cái)?shù)厝肟趂or(inttimes=0;times<ForestSize/4;times++){最后將4個(gè)線程得到的結(jié)果累加再做轉(zhuǎn)換即可得到最終結(jié)果。r(inti=0;i<testsetNum;++i)(for(intj=0;j<typesNum+1;++j){tran$formTestOut(i](fltransform!estOutTl[i](j]?transformTe$tOutT2[i](j]?transformTestOutT3[i](j]?tran$formTe$tOutT4[i][j);)八.測(cè)試結(jié)果樹(shù)的數(shù)量每輪Train樣本決策樹(shù)最大層數(shù)分割備選屬性數(shù)每個(gè)屬性采樣數(shù)運(yùn)營(yíng)時(shí)間準(zhǔn)確率260312972001001.7min0.926003129720010017min0.9432600031297200100170min九.并行效率對(duì)比十.總結(jié)本次實(shí)驗(yàn),我們構(gòu)造了決策樹(shù)以及隨機(jī)森林,構(gòu)造基本模型我用了一天時(shí)間,但是構(gòu)造出來(lái)的模型面臨著執(zhí)行速度很慢的瓶頸。其因素在于(1)沒(méi)有對(duì)屬性列進(jìn)行采樣(2)沒(méi)有在選取每一列的時(shí)候?qū)@一列的值進(jìn)行采樣(3)在構(gòu)造決策樹(shù)子節(jié)點(diǎn)的時(shí)候傳遞的是數(shù)據(jù)集而不是索引,這導(dǎo)致我的決策樹(shù)雖然是對(duì)的的,但是幾乎一分鐘才干構(gòu)造一棵CART,這樣的CART要用來(lái)構(gòu)造隨機(jī)森林幾乎是不也許的事情(時(shí)間上存在很大瓶頸),然后我逐個(gè)針對(duì)這些問(wèn)題進(jìn)行了優(yōu)化,例如傳遞數(shù)據(jù)集采用的是索引,對(duì)屬性及屬性集采樣等等。此外,在構(gòu)造決策樹(shù)時(shí),我發(fā)現(xiàn)雖然屬性列很多,但往往取很少的列,很少的層,較少的分割節(jié)點(diǎn)同樣能取到比較好的效果,這對(duì)于速度提高的方面是有良好的指導(dǎo)意義的。此外決策樹(shù)本質(zhì)上是做折線函數(shù)擬合,因此,過(guò)擬合是存在的,這就意味著決策樹(shù)單棵假如層數(shù)過(guò)高效果將會(huì)非常不好,這一點(diǎn)也在KAGGLE的結(jié)果上體現(xiàn)了,過(guò)擬合仍然是隨機(jī)森林面臨的挑戰(zhàn)。并且粗略的了解了一下C++的多線程,多線程可以充足調(diào)用起CPU資源,速度加快了很多,是以后實(shí)現(xiàn)算法時(shí)需要考慮的方向。輸入:訓(xùn)練數(shù)據(jù)集D,停止訓(xùn)練條件輸出:CART決策樹(shù)根據(jù)訓(xùn)練數(shù)據(jù)集,從根節(jié)點(diǎn)開(kāi)始,遞歸地對(duì)每個(gè)節(jié)點(diǎn)進(jìn)行以下操作,遞歸構(gòu)造二叉決策樹(shù)(1)設(shè)節(jié)點(diǎn)的訓(xùn)練數(shù)據(jù)集為D,計(jì)算現(xiàn)有特征對(duì)該數(shù)據(jù)集的基尼系數(shù),此時(shí),對(duì)每一個(gè)特征A,對(duì)于每一個(gè)可能的劃分值a,根據(jù)大于a及小于等于a將訓(xùn)練數(shù)據(jù)集分成DI,D2兩部分。計(jì)算gini系數(shù)公式如下:Giniseparate=胃*Gini(Dl)+仲Gini(D2);Gini(D)=1-ENiP力(2)在所有可能特征A以及其所有可能劃分點(diǎn)a中,選擇gini系數(shù)最小的特征及切分值,將D1和D2分配到左右兩個(gè)子節(jié)點(diǎn)去。(3)對(duì)左右節(jié)點(diǎn)分別遞歸的調(diào)用(1),(2),直到滿足一定條件為止。6.隨機(jī)森林構(gòu)造:(1)隨機(jī)取樣,降低樹(shù)與樹(shù)之間的關(guān)聯(lián)性RF在每次構(gòu)造一棵決策樹(shù)時(shí),先隨機(jī)的有放回的從訓(xùn)練集中抽取(60%)或n(sizeoftrainingset)個(gè)樣本D,在每個(gè)節(jié)點(diǎn)分裂前,先隨機(jī)從總共M個(gè)特征中選取m個(gè)(m?M,一般取根號(hào)M)作為分裂用的候選特征,這有效降低了樹(shù)與樹(shù)之間的關(guān)聯(lián)性。二.算法思緒:將一個(gè)N分類(lèi)問(wèn)題轉(zhuǎn)化為N個(gè)二分類(lèi)問(wèn)題。轉(zhuǎn)化方法是:構(gòu)造N棵二叉擬合樹(shù),這里假設(shè)N為26,然后我們給N棵二叉樹(shù)依次標(biāo)號(hào)為1,2,3...26。1號(hào)樹(shù)的結(jié)果相應(yīng)于該條記錄是不是屬于第一類(lèi),是則輸出1,否則輸出0.2號(hào)樹(shù)的結(jié)果相應(yīng)于該條記錄是不是屬于第二類(lèi),是則1否則0,依此類(lèi)推。這樣,我們的26棵二叉樹(shù)的結(jié)果就相應(yīng)了26個(gè)下標(biāo)。例如對(duì)于某條記錄,這26個(gè)二叉樹(shù)的結(jié)果按序號(hào)排列為{0,00,0,0,0,0,0,0,0.0.0,0,0,0,...1,0},那么這條記錄的分類(lèi)應(yīng)當(dāng)為25。要將一個(gè)26維的0,1序列變回一個(gè)索引,我們只需要找出這個(gè)序列中值最大的元素的索引,這個(gè)索引即是序列號(hào)。我們將上面的26棵分別對(duì)26個(gè)索引做是否判斷的二分類(lèi)樹(shù)視為一個(gè)整體,在多線程的環(huán)境下,構(gòu)造多個(gè)這樣的整體,然后進(jìn)行求和運(yùn)算,最后取出每個(gè)結(jié)果序列中值最大的元素的下標(biāo)作為分類(lèi)值,那么久得到了我們想要的結(jié)果,隨機(jī)森林完畢。三.算法流程:.讀入訓(xùn)練集trainset,測(cè)試集testset.將訓(xùn)練集分割為輸入trainIn,輸出trainOut.這里假設(shè)類(lèi)別數(shù)N為26,將trainOui[記錄條數(shù)]映射為transformTrainOu([訓(xùn)練記錄數(shù)][26].初始化transformTeslOut[測(cè)試記錄數(shù)][26]所有為0.Fori=1:ForcstSize://對(duì)訓(xùn)練集采樣,這里要注意輸入和輸出一致[samp1eln,transformSampleOut]=TakeSample(trainIn,transforrnTrainOut)Forcategory=1:26://CartTrce數(shù)組存放著26棵二分類(lèi)樹(shù)CartTree[calegory]=TrainCar(Tree(sampleln,transformSampleOut);end//transformTest0ut[測(cè)試記錄數(shù)][26]為承接二分類(lèi)樹(shù)輸出的容器foril=I:testSetNum:Forcategory=1:26:transformTestOut[il][categoryJ+=predict(CartTreelcategory],testset[il])endEndEnd6.遍歷transformTrainOut[],將其每?行的最大值的下標(biāo)作為該行記錄的索引值。四.決策樹(shù)及隨機(jī)森林的配置.決策樹(shù)在這里,我們每一次26分類(lèi)是由26棵CART共同完畢的,CART的costfunclion采用的是gini系數(shù),CART的最大層數(shù)為7,分裂停止條件為當(dāng)前節(jié)點(diǎn)GINI為?;蛘弋?dāng)前節(jié)點(diǎn)所在層數(shù)到達(dá)了7..隨機(jī)森林a.隨機(jī)森林每次循環(huán)的訓(xùn)練集采樣為原訓(xùn)練集的b.對(duì)于森林中每一棵決策樹(shù)每一次分割點(diǎn)的選取,對(duì)屬性進(jìn)行了打亂抽樣,抽樣數(shù)為25,即每次分割只在25個(gè)屬性中尋找最合適的值。并且對(duì)于每個(gè)選取的屬性,我們進(jìn)行了行采樣。即假如這個(gè)屬性所擁有的屬性值數(shù)大于30,我們選取其中30個(gè)作為分割候選,假如小于30,則所有納入分割候選。五.代碼詳解1.訓(xùn)練集/測(cè)試集的讀入a.在dataDefine.h中定義了:9definenumparametres619//619〃£錄中的字段與數(shù)#definetrainsetNum6239//100〃訓(xùn)練隼的記錄朝RffdefinetestsetNum1560//100#definetypesNum26//26〃類(lèi)型數(shù)?^definenodesNum200//200訓(xùn)練集記錄列數(shù)numparamctrcs(ID(1)+參數(shù)數(shù)量(617)+輸出(1)=619)訓(xùn)練集記錄條數(shù)transetNum測(cè)試集記錄條數(shù)tcstsetNum分類(lèi)類(lèi)型數(shù)typesNum而在main.cpp中,我們聲明了全局變量doubletrainIn[trainsetNum][numparametres-2];〃訓(xùn)doubletrainOut[trainsetNum][l];.〃訓(xùn)隼集輸出?doubletestin(testsetNum][numparametres-2];//..IetestOut(te)inttrainID[trainsetNum];.intte$tiD[testsetNum];〃測(cè)試算每一行記錄的IDtrainin用于裝載訓(xùn)練集輸入,IrainOut用于裝載訓(xùn)練集的輸出(這里trainOut是二維數(shù)組是出于模型假如泛化,那么輸出值不一定只有一個(gè)的情況,在本次實(shí)驗(yàn)中并未派上什么真正用場(chǎng),可以將trainOut看作一個(gè)普通一維數(shù)組)。trainID用于裝載訓(xùn)練集中每一行的第一列ID號(hào)。lestIn,teslID則相應(yīng)測(cè)試集的輸入和ID號(hào)。這里注意,沒(méi)有l(wèi)eslOut的因素是測(cè)試集的結(jié)果理論上應(yīng)當(dāng)是不存在的。然后通過(guò)自己編寫(xiě)的讀入函數(shù)readDataCtrainxsv","testcsv");讀入測(cè)試集合訓(xùn)練集,這個(gè)函數(shù)將分別裝載我們?cè)谇懊嫣岬降膖rainIn.trainOut、trainID>testIn.testID。這個(gè)函數(shù)使用的fstream逐行讀入的方法,這里不做詳述。.訓(xùn)練集輸出轉(zhuǎn)化為相應(yīng)的26維01數(shù)組transformOut[typesNum]在dataDefine.h中,我們定義了分類(lèi)類(lèi)別數(shù)typesNum:在main.cpp中,我們定義了全局變量transformOut[typesNum]inttransformOut[trainsetNum][typesNum+1]={0};//類(lèi)別數(shù)這里的transformOut是用于儲(chǔ)存將trainOut每行的值映射為?行相應(yīng)的26維01序列后所產(chǎn)生的結(jié)果。這里面的相應(yīng)關(guān)系是:例如trainOut[10]中的值是13那么transformOut[10]]⑶=l,transformOut[l0][除13外其他列]=0;假如值是14,那么14列為1,其他列為0,行號(hào)代表的是它們相應(yīng)的是第幾條記錄;trainOutllO]和transforni0ut[l0J都表達(dá)的是第10行的分類(lèi)值為某個(gè)值,只是表達(dá)方式不同。前者用數(shù)字表達(dá),后者將相應(yīng)下標(biāo)的值置1表達(dá)。轉(zhuǎn)換接口由1。@in.cpp中的函數(shù)voidindexTransform(inttransformres[Ht.pesK+1],doubleogres[][l]);/戶弓啟始W出丫,化力Y」,”,定義,它的輸入?yún)?shù)依次為轉(zhuǎn)換輸出的承接容器transformres,盛放原始輸出的容器org它所做的事情是將transformresfi][orges[i]]的值置1.并行構(gòu)建隨機(jī)森林在main.cpp中,我們構(gòu)建了doubletrainInPerTime[perTimeNum][numparametres-2];doubletrainInPerTimeTl[perTimeNum][numparametres-2];doubletrainInPerTimeT2[perTimeNum][numparametres-2];doubletrainInPerTimeT3[perTimeNum][numparametres-2];doubletrainInPerTimeT4[perTimeNum][numparametres-2];inttransformOutPerTime[perTimeNum][typesNum+1]={0};inttransformOutPerTimeTl[perTimeNum][typesNum+1]={0};inttransformOutPerTimeT2(perTimeNum][typesNum+1]={0};inttransformOutPerTimeT3[perTimeNum][typesNum+1]={0};inttransformOutPerTimeT4[perTimeNum](typesNum+1]={0};doubletransformTestOutTl[testsetNum][typesNum+1]={0};doubletransformTestOutT2(testsetNum][typesNum+1]={0};doubletransformTestOutT3[testsetNum][typesNum+1]={0};doubletransformTestOutT4[testsetNum][typesNum+1]={0};trainInpefTime代表的是隨機(jī)森林算法中通過(guò)采樣環(huán)節(jié)后選取的訓(xùn)練輸入.TransformOutPerTime代表的是與trainInperTime相應(yīng)的轉(zhuǎn)換輸;||transformtestOut是承接本支線程的所有CART樹(shù)的決策值之和的結(jié)構(gòu),這與算法思緒是相應(yīng)的,我們將所有CART樹(shù)的預(yù)測(cè)結(jié)果在意個(gè)轉(zhuǎn)換輸出容器上累加,然后對(duì)于每行取該行最大列的卜標(biāo),即可得到由隨機(jī)森林得到的分類(lèi)結(jié)果。我們可以看此這幾個(gè)變量都是只有最后的TX有區(qū)別,事實(shí)上,反復(fù)的創(chuàng)建相似的變量只是為了方便多線程操作不會(huì)沖突。多線程入口:
decisionTree&tasd=Treel;threadthreadl(mainInThread,transformOutPerTimeTl,trainlnPerTimeTl,transformTestOutTl,&Treel);threadthread2(mainInThread,transformOutPerTimeT2,trainIr?PerTimeT2,transformTestOutT2,&Tree2);threadthread3(mainInThread,transformOutPerTimeT3,trainInPerTimeT3,transformTestOutT3,&Tree3);threadthread4(mainInThread,transformOutPerTimeT4,trainInPerTimeT4,transformTestOutT4,&Tree4);這里使用的是C++11的〈thread〉庫(kù),簡(jiǎn)樸好用。每一個(gè)線程的隨機(jī)森林框架定義在main.cpp的每一個(gè)線程的隨機(jī)森林框架定義在main.cpp的這個(gè)函數(shù)采用循環(huán)的方式,每次循環(huán),對(duì)訓(xùn)練集及相應(yīng)轉(zhuǎn)換輸出進(jìn)行打亂后采樣,然后輸入TRAIN(trainInPerTime_,transformOutPerTime_,transformTestOuCTree);中進(jìn)行一輪決策樹(shù)的訓(xùn)練,這一輪訓(xùn)練將會(huì)生成26棵CART樹(shù),相應(yīng)26個(gè)分類(lèi)值。這里輸入的參數(shù)Tree就是我們所用的決策樹(shù)容器,這里注意,我們一個(gè)線程中只需要公用一個(gè)決策樹(shù)結(jié)構(gòu)即足夠了.在訓(xùn)練完畢后,我們用ItransformTestOut[i][j]在訓(xùn)練完畢后,我們用ItransformTestOut[i][j]='累加訓(xùn)練結(jié)果。4一輪訓(xùn)練26棵樹(shù)由于26棵CART樹(shù)才干完整的等價(jià)于一棵26分類(lèi)樹(shù),因此我們將構(gòu)建這26棵CART樹(shù)的過(guò)程當(dāng)作是一個(gè)整體。這個(gè)過(guò)程由函數(shù)TRAIN(trainInPerTime_,transformOutPerTime_,transformTestOuCTree);實(shí)現(xiàn)。它的輸入依次是本輪的訓(xùn)練輸入(通過(guò)了卜.采樣,隨機(jī)森林規(guī)定的),相應(yīng)的轉(zhuǎn)換訓(xùn)練輸出,以及一個(gè)決策樹(shù)容器Tree。決策樹(shù)的定義我們將在下文中描述。這個(gè)函數(shù)有一個(gè)校stack<int>trace;〃用于追蹤樹(shù)的遍歷過(guò)程,這里我們假定用的是先根遍歷;并且有一個(gè)從1:26的循環(huán)for(inttypesN=1;typesN<=typesNum;typesN++){每次循環(huán)會(huì)建立一棵關(guān)于相應(yīng)的分類(lèi)值得CART樹(shù),CART樹(shù)的構(gòu)造是由棧trace維護(hù)的,trace維護(hù)的是一個(gè)先序的遍歷順序。當(dāng)循環(huán)完畢后,將會(huì)計(jì)算本輪的轉(zhuǎn)換輸出結(jié)果的變更:for(inti=0;i<testsetNum;++i){//testresPerTime[i][typesN]=TputeRes(testIn[i]);transformTestOut_[i][typesN]+=(*Tree).computeRes(testIn[i]);5.每科CART樹(shù)的構(gòu)造CART樹(shù)的數(shù)據(jù)結(jié)構(gòu)如下:structdecisionTree{doubletrainIn(perTimeNum][numparametres-2];inttrainOut[perTimeNum];nodeNodes[nodesNum];〃在建樹(shù)時(shí)需要使用的可用節(jié)點(diǎn)索引記錄intusableNode;trainIntrainOut相應(yīng)于輸入該樹(shù)的輸入輸出集,Nodes表達(dá)的是節(jié)點(diǎn)序列,在這里我們的樹(shù)的構(gòu)造使用的是數(shù)組,且樹(shù)的節(jié)點(diǎn)間的索引是通過(guò)索引值維護(hù)的,這顆樹(shù)非常緊密(假如只看NODES是看不出節(jié)點(diǎn)間的層級(jí)關(guān)系的)。它有如下成員函數(shù):decisionTree。。;voidsetDecisionTree(doubletrainln_[][numparametres-2],inttrainOut」]);boolgetPartition(intindex,intcontainer。);doublecomputeGini(intindex,intlabel,doublevalue);//doublecomputeNodeGini(intindex);〃計(jì)算某一節(jié)點(diǎn)的GinidoublecomputeRes(double[numparametres-2]);〃訓(xùn)練完成后,用于癡809函數(shù),輸入是窩試輸入向?TOC\o
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年中國(guó)長(zhǎng)效鎳磷化學(xué)鍍液市場(chǎng)調(diào)查研究報(bào)告
- 二零二五年度婚姻忠誠(chéng)協(xié)議執(zhí)行指導(dǎo)
- 小學(xué)英語(yǔ)試卷收納
- 二零二五年度城市地下空間開(kāi)發(fā)利用可行性研究報(bào)告范本
- 2025年度老舊小區(qū)房屋出租轉(zhuǎn)讓合同
- 二零二五年度建筑工地安全生產(chǎn)責(zé)任書(shū)
- 二零二五年度健身器材加盟合同解除協(xié)議
- 二零二五年度影視基地合作協(xié)議書(shū):影視基地與影視制作公司獨(dú)家合作協(xié)議
- 2025年度砂石料電商平臺(tái)支付結(jié)算合作協(xié)議
- 園區(qū)轉(zhuǎn)讓門(mén)面合同范本
- 2023年新改版教科版五年級(jí)下冊(cè)科學(xué)全冊(cè)教案(附知識(shí)點(diǎn))
- 固定式塔式起重機(jī)基礎(chǔ)設(shè)計(jì)及計(jì)算
- 奶牛性控凍精的使用細(xì)則:張相文 整理
- GB/T 34376-2017數(shù)控板料折彎?rùn)C(jī)技術(shù)條件
- GB/T 22492-2008大豆肽粉
- 三年級(jí)下冊(cè)豎式脫式計(jì)算
- 《財(cái)務(wù)風(fēng)險(xiǎn)的識(shí)別與評(píng)估管理國(guó)內(nèi)外文獻(xiàn)綜述》
- ??谑写媪糠抠I(mǎi)賣(mài)合同模板(范本)
- 經(jīng)典文學(xué)作品中的女性形象研究外文文獻(xiàn)翻譯2016年
- 高爐煤氣安全知識(shí)的培訓(xùn)
- 2008 年全國(guó)高校俄語(yǔ)專(zhuān)業(yè)四級(jí)水平測(cè)試試卷
評(píng)論
0/150
提交評(píng)論