- 簽證留學(xué) |
- 筆譯 |
- 口譯
- 求職 |
- 日/韓語(yǔ) |
- 德語(yǔ)
對(duì)于模型樹(shù)、回歸樹(shù)和一般的回歸方法,下面測(cè)試一下哪個(gè)模型最好。首先給出一些函數(shù),它們可以在樹(shù)構(gòu)建好的情況下對(duì)給定的輸入進(jìn)行預(yù)測(cè),之后利用這些函數(shù)來(lái)計(jì)算三種回歸模型的測(cè)試誤差。這些模型將在某個(gè)數(shù)據(jù)上進(jìn)行測(cè)試,該數(shù)據(jù)涉及人的智力水平和自行車(chē)的速度的關(guān)系。
這里的數(shù)據(jù)是非線(xiàn)性的,不能簡(jiǎn)單地使用全局線(xiàn)性模型建模。當(dāng)然這里也需要聲明一下,此數(shù)據(jù)純屬虛構(gòu)。
下面先給出在給定輸入和樹(shù)結(jié)構(gòu)情況下進(jìn)行預(yù)測(cè)的幾個(gè)函數(shù)。打開(kāi)regTrees.py并加入如下代碼。
程序清單1 用樹(shù)回歸進(jìn)行預(yù)測(cè)的代碼
對(duì)于輸入的單個(gè)數(shù)據(jù)點(diǎn)或者行向量,函數(shù)treeForeCast()會(huì)返回一個(gè)浮點(diǎn)值。在給定樹(shù)結(jié)構(gòu)的情況下,對(duì)于單個(gè)數(shù)據(jù)點(diǎn),該函數(shù)會(huì)給出一個(gè)預(yù)測(cè)值。調(diào)用函數(shù)treeForeCast()時(shí)需要指定樹(shù)的類(lèi)型,以便在葉節(jié)點(diǎn)上能夠調(diào)用合適的模型。參數(shù)modelEval是對(duì)葉節(jié)點(diǎn)數(shù)據(jù)進(jìn)行預(yù)測(cè)的函數(shù)的引用。函數(shù)treeForeCast()自頂向下遍歷整棵樹(shù),直到命中葉節(jié)點(diǎn)為止。一旦到達(dá)葉節(jié)點(diǎn),它就會(huì)在輸入數(shù)據(jù)上調(diào)用modelEval()函數(shù),而該函數(shù)的默認(rèn)值是regTreeEval()。
要對(duì)回歸樹(shù)葉節(jié)點(diǎn)進(jìn)行預(yù)測(cè),就調(diào)用函數(shù)regTreeEval();要對(duì)模型樹(shù)節(jié)點(diǎn)進(jìn)行預(yù)測(cè)時(shí),就調(diào)用modelTreeEval()函數(shù)。它們會(huì)對(duì)輸入數(shù)據(jù)進(jìn)行格式化處理,在原數(shù)據(jù)矩陣上增加第0列,然后計(jì)算并返回預(yù)測(cè)值。為了與函數(shù)modelTreeEval()保持一致,盡管regTreeEval()只使用一個(gè)輸入,但仍保留了兩個(gè)輸入?yún)?shù)。
最后一個(gè)函數(shù)是createForCast(),它會(huì)多次調(diào)用treeForeCast()函數(shù)。由于它能夠以向量形式返回一組預(yù)測(cè)值,因此該函數(shù)在對(duì)整個(gè)測(cè)試集進(jìn)行預(yù)測(cè)時(shí)非常有用。下面很快會(huì)看到這一點(diǎn)。
接下來(lái)考慮圖1所示的數(shù)據(jù)。該數(shù)據(jù)是我從多個(gè)騎自行車(chē)的人那里收集得到的。圖中給出騎自行車(chē)的速度和人的智商之間的關(guān)系。下面將基于該數(shù)據(jù)集建立多個(gè)模型并在另一個(gè)測(cè)試集上進(jìn)行測(cè)試。對(duì)應(yīng)的訓(xùn)練集數(shù)據(jù)保存在文件bikeSpeedVslq_train.txt中,而測(cè)試集數(shù)據(jù)保存在文件bikeSpeedVslq_test.txt中。