- 簽證留學(xué) |
- 筆譯 |
- 口譯
- 求職 |
- 日/韓語(yǔ) |
- 德語(yǔ)
示例:在一個(gè)難數(shù)據(jù)集上的AdaBoost應(yīng)用
(1) 收集數(shù)據(jù):提供的文本文件。
(2) 準(zhǔn)備數(shù)據(jù):確保類別標(biāo)簽是+1和-1而非1和0。
(3) 分析數(shù)據(jù):手工檢查數(shù)據(jù)。
(4) 訓(xùn)練算法:在數(shù)據(jù)上,利用adaBoostTrainDS()函數(shù)訓(xùn)練出一系列的分類器。
(5) 測(cè)試算法:我們擁有兩個(gè)數(shù)據(jù)集。在不采用隨機(jī)抽樣的方法下,我們就會(huì)對(duì)AdaBoost和Logistic回歸的結(jié)果進(jìn)行完全對(duì)等的比較。
(6) 使用算法:觀察該例子上的錯(cuò)誤率。不過,也可以構(gòu)建一個(gè)Web網(wǎng)站,讓馴馬師輸入馬的癥狀然后預(yù)測(cè)馬是否會(huì)死去。
在使用上述程序清單中的代碼之前,必須要有向文件中加載數(shù)據(jù)的方法。一個(gè)常見的loadDataset()的程序如下所示。
程序清單1-1自適應(yīng)數(shù)據(jù)加載函數(shù)
def loadDataSet (fileName) :
numFeat = len (open (fileName).readline () .split ('\t '))
dataMat = []; labelMat = []
fr = open(fileName)
for line in fr.readlines():
lineArr =[]
curLine = line.strip().split('\t')
for i in range (numFeat-1) :
lineArr.append(float (curLine [i]))
dataMat.append(lineArr)
labelMat.append(float (curLine [-1]))
return dataMat, labelMat
之前,讀者可能多次見過了上述程序清單中的1oadDataset()函數(shù)。在這里,并不必指定每個(gè)文件中的特征數(shù)目,所以這里的函數(shù)與前面的稍有不同。該函數(shù)能夠自動(dòng)檢測(cè)出特征的數(shù)目。同時(shí),該函數(shù)也假定最后一個(gè)特征是類別標(biāo)簽。
將上述代碼添加到adaboost.py文件中并且將其保存之后,就可以輸人如下命令來使用上述函數(shù):
>>> datArr, labelArr = adaboost.loadDataSet('horseColicTraining2.txt')
>>> classifierArray = adaboost .adaBoostTrainDS(datArr,labelArr,10)
total error: 0.284280936455
total error: 0.284280936455
total error: 0.230769230769
>>> testArr,testLabelArr = adaboost.loadDataSet ('horseColicTest2.txt')
>>> prediction10 = adaboost.adaClassify(testArr,classifierArray)
To get the number of misclassified examples type in:
>>> errArr=mat (ones((67,1)))
>>> errArr [prediction10!=mat (testLabelArr).T].sum()
16.0
要得到錯(cuò)誤率,只需將上述錯(cuò)分樣例的個(gè)數(shù)除以67即可。
將弱分類器的數(shù)目設(shè)定為1到10000之間的幾個(gè)不同數(shù)字,并運(yùn)行上述過程。這時(shí),得到的結(jié)果就會(huì)如表1所示。在該數(shù)據(jù)集上得到的錯(cuò)誤率相當(dāng)?shù)?。我們?cè)谕粩?shù)據(jù)集上采用Logistic回歸得到的平均錯(cuò)誤率為0.35。而采用AdaBoost,得到的錯(cuò)誤率就永遠(yuǎn)不會(huì)那么高了。從表中可以看出,我們僅僅使用50個(gè)弱分類器,就達(dá)到了較高的性能。
表1不同弱分類器數(shù)目情況下的AdaBoost測(cè)試和分類錯(cuò)誤率。該數(shù)據(jù)集是個(gè)難數(shù)據(jù)集。通常情況下,AdaBoost會(huì)達(dá)到一個(gè)穩(wěn)定的測(cè)試錯(cuò)誤率,而并不會(huì)隨分類器數(shù)目的增多而提高
觀察表1中的測(cè)試錯(cuò)誤率一欄,就會(huì)發(fā)現(xiàn)測(cè)試錯(cuò)誤率在達(dá)到了一個(gè)最小值之后又開始上升了。這類現(xiàn)象稱之為過擬合(overfitting,也稱過學(xué)習(xí))。有文獻(xiàn)聲稱,對(duì)于表現(xiàn)好的數(shù)據(jù)集,AdaBoost的測(cè)試錯(cuò)誤率就會(huì)達(dá)到一個(gè)穩(wěn)定值,并不會(huì)隨著分類器的增多而上升?;蛟S在本例子中的數(shù)據(jù)集也稱不上“表現(xiàn)好”。該數(shù)據(jù)集一開始有30%的缺失值,對(duì)于Logistic回歸而言,這些缺失值的假設(shè)就是有效的,而對(duì)于決策樹卻可能并不合適。如果回到數(shù)據(jù)集,將所有的0值替換成其他值,或者給定類別的平均值,那么能否得到更好的性能?
很多人都認(rèn)為,AdaBoost和SVM是監(jiān)督機(jī)器學(xué)習(xí)中最強(qiáng)大的兩種方法。實(shí)際上,這兩者之間擁有不少相似之處。我們可以把弱分類器想象成SVM中的一個(gè)核函數(shù),也可以按照最大化某個(gè)最小間隔的方式重寫AdaBoost算法。而它們的不同就在于其所定義的間隔計(jì)算方式有所不同,因此導(dǎo)致的結(jié)果也不同。特別是在高維空間下,這兩者之間的差異就會(huì)更加明顯。
責(zé)任編輯:admin