日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > python >内容正文

python

eclipse的jsp第一行代码报错_机器学习之AdaBoost算法及纯python代码手工实现

發(fā)布時(shí)間:2025/3/19 python 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 eclipse的jsp第一行代码报错_机器学习之AdaBoost算法及纯python代码手工实现 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Adaboost算法是boost算法中最具代表性的一個(gè),它是adaptive boosting的簡(jiǎn)稱(自使用算法);在訓(xùn)練數(shù)據(jù)中的每個(gè)樣本賦予一個(gè)權(quán)重,構(gòu)成初始的向量D(每個(gè)樣本的權(quán)重初始時(shí)均相等)。首先在訓(xùn)練數(shù)據(jù)上訓(xùn)練出一個(gè)弱分類器并計(jì)算該分類器的錯(cuò)誤率,然后在同一個(gè)數(shù)據(jù)集上再次訓(xùn)練弱分類器。在弱分類器的第二次訓(xùn)練中,將會(huì)調(diào)整每個(gè)樣本的權(quán)重,其中第一次分對(duì)的樣本的權(quán)重會(huì)降低,而分錯(cuò)的樣本權(quán)重會(huì)提高。為了從所有弱分類器中得到最終的分類結(jié)果,Adaboost為每個(gè)分類器配了一個(gè)權(quán)重alpha,這些alpha是基于每個(gè)弱分類器的錯(cuò)誤率進(jìn)行計(jì)算得到的,分類效果好的弱分類器的alpha值會(huì)較大、被Adaboost算法更器重和關(guān)注。

錯(cuò)誤率的定義為:

而alpha的計(jì)算公式如下:

Adaboost算法示意圖如下:

左邊是數(shù)據(jù)集,其中直方圖的不同寬度表示每個(gè)樣例上的不同權(quán)重。在經(jīng)過(guò)一個(gè)分類器之后,加權(quán)的預(yù)測(cè)結(jié)果會(huì)通過(guò)三角形中的alpha值進(jìn)行加權(quán)。每個(gè)三角形中輸出的加權(quán)結(jié)果在圓形中進(jìn)行求和,從而得到最終的輸出結(jié)果。

得到alpha值之后,可以對(duì)權(quán)重D進(jìn)行更新,該算法的是更注重被上一輪分類器錯(cuò)分的樣本,所以是降低那些正確分類的樣本權(quán)重而增加錯(cuò)誤分類樣本的權(quán)重。其計(jì)算公式方法如下:

如果一個(gè)樣本在被正確分類,則權(quán)重按如下公式進(jìn)行更新:

如果一個(gè)樣本在被錯(cuò)誤分類,則權(quán)重按如下公式進(jìn)行更新:

更新D的權(quán)重后Adaboosting算法又會(huì)進(jìn)入到下一輪的迭代中,循環(huán)反復(fù)的重復(fù)訓(xùn)練和調(diào)整權(quán)重,直到錯(cuò)誤率、弱分類器的數(shù)目或者迭代的次數(shù)達(dá)到用戶設(shè)定的閾值時(shí)將不再進(jìn)行循環(huán)。

Adaboost算法的一般流程

(1)收集數(shù)據(jù);

(2)準(zhǔn)備數(shù)據(jù):主要將數(shù)據(jù)處理為弱分類器可以處理的格式和類型;

(3)分析數(shù)據(jù);

(4)訓(xùn)練算法:在同一份數(shù)據(jù)集上循環(huán)往復(fù)的訓(xùn)練弱分類器,消耗大量的訓(xùn)練時(shí)間;

(5)測(cè)試算法:計(jì)算分類的錯(cuò)誤率;

(6)使用算法;

Adaboost算法優(yōu)缺點(diǎn)

優(yōu)點(diǎn):泛化錯(cuò)誤率低,容易編碼,可以用在大部分的數(shù)據(jù)集上,超參數(shù)基本沒有或一兩個(gè);

缺點(diǎn):對(duì)異常樣本點(diǎn)數(shù)據(jù)敏感;

適用數(shù)據(jù)類型:數(shù)值型或者標(biāo)稱型數(shù)據(jù);

代碼部分:

首先創(chuàng)建一個(gè)簡(jiǎn)單的訓(xùn)練數(shù)據(jù)集

#手工構(gòu)建Adaboost會(huì)用到的模塊from math import infimport numpy as npfrom numpy import *#構(gòu)建簡(jiǎn)單的測(cè)試數(shù)據(jù)集,該數(shù)據(jù)集一個(gè)特點(diǎn)是靠單顆決策樹無(wú)法完成正確的分類def loadSimpleData(): #DatMat = np.arange(10).reshape(5,2) DatMat = np.matrix([[1.,2.1],[2.,1.1],[1.3,1.],[1.,1.],[1.5,1.6]]) classLabels = [1.0,1.0,-1.0,-1.0,1.0] return DatMat,classLabels

該份數(shù)據(jù)分布情況如下(無(wú)法用單層決策樹很好的擬合該份數(shù)據(jù)):

單層決策樹生成函數(shù)

def stumpClassify(dataMatrix,dimen,threshVal,threshIneq): """通過(guò)閾值比較對(duì)數(shù)據(jù)進(jìn)行分類,所有在閾值一邊的都會(huì)被分為-1、在另一邊的則被分為+1; 實(shí)現(xiàn)上是通過(guò)數(shù)組的過(guò)濾來(lái)完成,首先將返回?cái)?shù)組的全部元素設(shè)置為1,即如下第一行; 將所有不滿足不等式要求的都設(shè)置為-1,可以基于數(shù)據(jù)集中的任一元素進(jìn)行比較,同時(shí)可以將預(yù)算符進(jìn)行切換。 """ retArray = ones((shape(dataMatrix)[0],1)) if threshIneq == 'lt': retArray[dataMatrix[:,dimen] <= threshVal] = -1.0 else: retArray[dataMatrix[:,dimen] > threshVal] = -1.0 return retArray"""將最小的錯(cuò)誤率minError初始化正無(wú)窮大;將數(shù)據(jù)集中的每一個(gè)特征(第一層for循環(huán)): 對(duì)每個(gè)步長(zhǎng)(第二層dor循環(huán)): 對(duì)每個(gè)不等號(hào)(第三層for循環(huán)): 建議一顆單層決策樹(即樹樁)并利用加權(quán)數(shù)據(jù)集對(duì)它進(jìn)行測(cè)試 如果錯(cuò)誤率低于minError,則將當(dāng)前單層決策樹設(shè)為最佳單層決策樹返回最佳單層決策樹"""def buildStump(dataArr,classLabels,D): """會(huì)遍歷stumpClassify()函數(shù)所有可能的輸入值,并找到數(shù)據(jù)集上最佳的單層決策樹 """ dataMatrix = mat(dataArr) labelMat = mat(classLabels).T m,n = shape(dataMatrix) "numSteps用于在特征的所有可能值上進(jìn)行便利" numSteps = 10.0 "創(chuàng)建為空的bestStump空字典,用于存放給定權(quán)重向量D時(shí)所得到的最佳單層決策樹的相關(guān)信息" bestStump = {};bestClasEst = mat(zeros((m,1))) "初始化為正無(wú)窮大,用于尋找可能的最小錯(cuò)誤率" minError = inf """第一層for循環(huán)在數(shù)據(jù)集的所有特征上進(jìn)行遍歷; 根據(jù)最大、最小值還計(jì)算步長(zhǎng); """ for i in range(n): rangeMin = dataMatrix[:,i].min(); rangeMax = dataMatrix[:,i].max(); stepSize = (rangeMax - rangeMin) / numSteps """ 第二層for循環(huán)在這些值上遍歷,甚至將閾值設(shè)置為整個(gè)取值范圍之外也是可以的。 """ for j in range(-1,int(numSteps) + 1): """第三層for循環(huán)在大于和小于之間進(jìn)行切換""" # 對(duì)每個(gè)不等號(hào),lt: less than; gt: great than for inequal in ['lt','gt']: threshVal = (rangeMin + float(j) * stepSize) predictedVals = \ stumpClassify(dataMatrix,i,threshVal,inequal) """構(gòu)建列向量用于存儲(chǔ)記錄預(yù)測(cè)值中多少和實(shí)際的標(biāo)簽不相符的情況, 若與測(cè)試不等于真正的類別標(biāo)簽值,則errArr中相應(yīng)位置為1""" errArr = mat(ones((m,1))) # 計(jì)算加權(quán)錯(cuò)誤率,錯(cuò)誤向量 dot* 權(quán)重向量,weightedError是一個(gè)值:[[ 0.57142857]] errArr[predictedVals == labelMat] = 0 "將錯(cuò)誤率和向量D進(jìn)行相乘并求和,得到weightedError,是Adaboosting與分類其交互的地方" weightedError = D.T * errArr """最后將得到的最小錯(cuò)誤率和現(xiàn)有的錯(cuò)誤率進(jìn)行比較,如果值較小,則在bestStump 中更新決策樹的信息;并字典、錯(cuò)誤率和類別估計(jì)返回傳給下一步的Adaboosting算法中""" if weightedError < minError: minError = weightedError bestClasEst = predictedVals.copy() bestStump['dim'] = i bestStump['thresh'] = threshVal bestStump['ineq'] = inequal????return?bestStump,minError,bestClasEst

基于單層決策樹的Adaboost算法的訓(xùn)練過(guò)程

#開始基于上面構(gòu)建的單層決策樹構(gòu)建AdaBoosting算法"""對(duì)每次迭代: 利用buildStump()函數(shù)找到最佳的單層決策樹 將最佳的單層決策樹加入到單層決策樹數(shù)組 計(jì)算alpha 計(jì)算新的權(quán)重向量D 更新累計(jì)類別的估計(jì)值 如果錯(cuò)誤率等于0.0,則退出循環(huán)"""def AdaboostingTrainDS(dataArr,classLabels,numIt = 40): """Adaboosting算法輸入?yún)?shù)包括數(shù)據(jù)集、類別標(biāo)簽以及迭代次數(shù); 這里迭代次數(shù)唯一一個(gè)超參數(shù):人工干預(yù)提供的值; 函數(shù)后面的DS代表單層決策樹(decision stump) """ weakClassArr = [] m = shape(dataArr)[0] """向量D存儲(chǔ)每個(gè)數(shù)據(jù)點(diǎn)的權(quán)重,初始化為均等值;這里D是概率分布、根據(jù)數(shù)據(jù)集中的 數(shù)據(jù)點(diǎn)的數(shù)據(jù)m進(jìn)行均分、總和為1 """ D = mat(ones((m,1))/m) """記錄每個(gè)數(shù)據(jù)點(diǎn)的類別估計(jì)累計(jì)值 """ aggClassEst = mat(zeros((m,1))) """for循環(huán)運(yùn)行numIt次或者直到訓(xùn)練錯(cuò)誤率為0為止""" for i in range(numIt): "根據(jù)輸入權(quán)重向量D,得到一個(gè)具有最小錯(cuò)誤率的單層決策樹" bestStump,error,classEst = buildStump(dataArr,classLabels,D) print("D:",D.T) "max(error,1e-16)用于避免除零溢出報(bào)錯(cuò)" alpha = float(0.5*log((1.0-error)/max(error,1e-16))) bestStump['alpha'] = alpha weakClassArr.append(bestStump) print("classEst",classEst.T) """用于計(jì)算下一次迭代中的新權(quán)重向量D""" # 如果當(dāng)前樣本被正確分類((1 * 1)or(-1 * -1)) = 1,乘參數(shù)-1 = -alpha,權(quán)重下降 # 如果當(dāng)前樣本被錯(cuò)分((1 * -1)or(-1 * 1)) = -1,乘以參數(shù)-1 = alpha,權(quán)重升高 expon = multiply(-1.0 * alpha * mat(classLabels).T,classEst) D = multiply(D,exp(expon)) # 其實(shí)是一個(gè)迭代的過(guò)程D_i+1 = D_i * exp(expon) D = D / D.sum() """維護(hù)一個(gè)運(yùn)行時(shí)的類別估計(jì)值來(lái)用于判斷錯(cuò)誤率是否為0、若為0則提前退出循環(huán)""" aggClassEst += alpha*classEst print("aggClassEst",aggClassEst.T) # 使用sign進(jìn)行二分類 aggErrors = multiply(sign(aggClassEst) != mat(classLabels).T,ones((m,1))) errorRate = aggErrors.sum() / m print("total error :",errorRate, "\n") if errorRate == 0.0:break return weakClassArr

Adaboost分類函數(shù)構(gòu)建

#在有了多個(gè)弱分類器以及對(duì)應(yīng)的權(quán)重參數(shù)后,對(duì)這些弱分類器的結(jié)果加權(quán)求和就得到了最后的結(jié)果def adaClassify(dataToClass,classifierArr): """利用訓(xùn)練好的多個(gè)弱分類器進(jìn)行分類,傳入一個(gè)或多個(gè)待分類的樣例dataToClass 以及多個(gè)弱分類器組成的數(shù)組classifierArr;首先對(duì)進(jìn)行的樣例轉(zhuǎn)換成矩陣;然后得到待分類樣例的個(gè)數(shù)m; """ dataMatrix = mat(dataToClass) m = shape(dataMatrix)[0] aggClassEst = mat(zeros((m,1))) for i in range(len(classifierArr)): classEst = stumpClassify(dataMatrix,classifierArr[i]['dim']\ ,classifierArr[i]['thresh']\ ,classifierArr[i]['ineq']) aggClassEst += classifierArr[i]['alpha']*classEst print(aggClassEst) return sign(aggClassEst)

構(gòu)建一個(gè)共用的文件加載模塊

# 加載數(shù)據(jù)def loadDataSet(fileName): # 計(jì)算特征個(gè)數(shù)(如果用下面的fr來(lái)讀,那么訓(xùn)練集和測(cè)試集中就少了一個(gè)樣本數(shù)據(jù)) 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): # 不能split()后直接append,應(yīng)該先用float格式化數(shù)據(jù),統(tǒng)一數(shù)據(jù)類型 lineArr.append(float(curLine[i])) dataMat.append(lineArr) labelMat.append(float(curLine[-1])) return dataMat, labelMat

構(gòu)建簡(jiǎn)單的數(shù)據(jù)集進(jìn)行測(cè)試

TestData = [[5.,5.],[0.,0.]]if __name__ == "__main__": #loadDataSet 如果是文件則用該函數(shù)導(dǎo)入數(shù)據(jù) #dataMat, classLabels = loadDataSet("文件名稱") #testMat, testLabels = loadDataSet('文件名稱') dataArr,labelArr = loadSimpleData() classifierArr = AdaboostingTrainDS(dataArr,labelArr,30) adaClassify(TestData,classifierArr) pass

代碼執(zhí)行結(jié)果如下:

[Running] python -u "\AdaBoostingCodingSelf.py"D: [[0.2 0.2 0.2 0.2 0.2]]classEst [[ 1. 1. -1. -1. 1.]]aggClassEst [[ 18.42068074 18.42068074 -18.42068074 -18.42068074 18.42068074]]total?error?:?0.0?[[ 18.42068074]?[-18.42068074]][Done] exited with code=0 in 1.175 seconds

同時(shí)基于sklearn實(shí)現(xiàn)Adaboost算法,并將單顆決策樹的擬合效果和多顆決策樹的擬合效果進(jìn)行比對(duì),并采用圖形直觀展示的方式畫出來(lái)

print(__doc__)from operator import concatimport numpy as npimport matplotlib.pyplot as pltfrom sklearn.tree import DecisionTreeRegressorfrom sklearn.ensemble import AdaBoostRegressor# Create the datasetrng = np.random.RandomState(1)X = np.linspace(0, 6, 100)[:, np.newaxis]y = np.sin(X).ravel() + np.sin(6 * X).ravel() + rng.normal(0, 0.1, X.shape[0])print(X.shape)print(y.shape)# Fit regression modelmaxepth = 5nestimatorsest = 1000#最簡(jiǎn)單的決策樹、僅限制樹深regr_1 = DecisionTreeRegressor(max_depth=maxepth)regr_2 = AdaBoostRegressor(DecisionTreeRegressor(max_depth=maxepth), n_estimators=nestimatorsest)regr_1.fit(X, y)regr_2.fit(X, y)# Predicty_1 = regr_1.predict(X)y_2 = regr_2.predict(X)# Plot the resultsplt.figure()plt.scatter(X, y, c="k", label="training samples")plt.plot(X, y_1, c="g", label="n_estimators=1", linewidth=2)plt.plot(X, y_2, c="r", label=concat("n_estimators= ",str(nestimatorsest)), linewidth=2)plt.xlabel("data")plt.ylabel("target")plt.title("Boosted Decision Tree Regression")plt.legend()plt.show()

結(jié)果展示如下:

這里Adaboost中的弱分類器數(shù)目調(diào)的有點(diǎn)大,實(shí)際大概在50-100左右對(duì)數(shù)據(jù)的擬合程度就已經(jīng)很好了,而單顆樹很明顯表現(xiàn)的要差很多。

單顆決策樹難免較好的擬合數(shù)據(jù),經(jīng)常會(huì)出現(xiàn)欠擬合的現(xiàn)象;而多顆樹有時(shí)則會(huì)更好的擬合所有訓(xùn)練數(shù)據(jù),但也容易出現(xiàn)過(guò)擬合的現(xiàn)象;為更好理解欠擬合和過(guò)擬合,進(jìn)行直觀展示、方便在算法訓(xùn)練中選擇一個(gè)比較好的模型。

print(__doc__)import numpy as npimport matplotlib.pyplot as pltfrom sklearn.pipeline import Pipelinefrom sklearn.preprocessing import PolynomialFeaturesfrom sklearn.linear_model import LinearRegressionfrom sklearn.model_selection import cross_val_scorenp.random.seed(0)n_samples = 30degrees = [1, 4, 15]true_fun = lambda X: np.cos(1.5 * np.pi * X)X = np.sort(np.random.rand(n_samples))y = true_fun(X) + np.random.randn(n_samples) * 0.1plt.figure(figsize=(14, 5))for i in range(len(degrees)): ax = plt.subplot(1, len(degrees), i + 1) plt.setp(ax, xticks=(), yticks=()) polynomial_features = PolynomialFeatures(degree=degrees[i], include_bias=False) linear_regression = LinearRegression() pipeline = Pipeline([("polynomial_features", polynomial_features), ("linear_regression", linear_regression)]) pipeline.fit(X[:, np.newaxis], y) # Evaluate the models using crossvalidation scores = cross_val_score(pipeline, X[:, np.newaxis], y, scoring="neg_mean_squared_error", cv=10) X_test = np.linspace(0, 1, 100) plt.plot(X_test, pipeline.predict(X_test[:, np.newaxis]), label="Model") plt.plot(X_test, true_fun(X_test), label="True function") plt.scatter(X, y, label="Samples") plt.xlabel("x") plt.ylabel("y") plt.xlim((0, 1)) plt.ylim((-2, 2)) plt.legend(loc="best") plt.title("Degree {}\nMSE = {:.2e}(+/- {:.2e})".format( degrees[i], -scores.mean(), scores.std()))plt.show()

展示如下:

參考文件

《機(jī)器學(xué)習(xí)實(shí)戰(zhàn)》

《統(tǒng)計(jì)學(xué)習(xí)方法》等。

總結(jié)

以上是生活随笔為你收集整理的eclipse的jsp第一行代码报错_机器学习之AdaBoost算法及纯python代码手工实现的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。