人工智能和機(jī)器學(xué)習(xí)之分類算法:梯度提升機(jī)(GBM):梯度提升機(jī)的過擬合與欠擬合問題_第1頁
人工智能和機(jī)器學(xué)習(xí)之分類算法:梯度提升機(jī)(GBM):梯度提升機(jī)的過擬合與欠擬合問題_第2頁
人工智能和機(jī)器學(xué)習(xí)之分類算法:梯度提升機(jī)(GBM):梯度提升機(jī)的過擬合與欠擬合問題_第3頁
人工智能和機(jī)器學(xué)習(xí)之分類算法:梯度提升機(jī)(GBM):梯度提升機(jī)的過擬合與欠擬合問題_第4頁
人工智能和機(jī)器學(xué)習(xí)之分類算法:梯度提升機(jī)(GBM):梯度提升機(jī)的過擬合與欠擬合問題_第5頁
已閱讀5頁,還剩14頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

人工智能和機(jī)器學(xué)習(xí)之分類算法:梯度提升機(jī)(GBM):梯度提升機(jī)的過擬合與欠擬合問題1梯度提升機(jī)簡介1.1GBM的基本原理梯度提升機(jī)(GradientBoostingMachine,GBM)是一種迭代的決策樹算法,通過構(gòu)建一系列弱學(xué)習(xí)器并逐步優(yōu)化,最終形成一個(gè)強(qiáng)大的預(yù)測模型。GBM的核心思想是利用前一個(gè)模型的殘差作為當(dāng)前模型的訓(xùn)練目標(biāo),通過梯度下降法來最小化損失函數(shù)。這種算法特別適用于處理具有大量特征和復(fù)雜關(guān)系的數(shù)據(jù)集。1.1.1梯度提升過程初始化模型:通常從一個(gè)常數(shù)開始,作為所有樣本的初始預(yù)測值。迭代訓(xùn)練:在每次迭代中,計(jì)算當(dāng)前模型的殘差(即實(shí)際值與預(yù)測值之間的差異),然后訓(xùn)練一個(gè)新的弱學(xué)習(xí)器(如決策樹)來擬合這些殘差。更新模型:將新訓(xùn)練的弱學(xué)習(xí)器加入到當(dāng)前模型中,通過加權(quán)求和的方式更新預(yù)測值。重復(fù)步驟2和3:直到達(dá)到預(yù)設(shè)的迭代次數(shù)或模型性能不再提升。1.1.2代碼示例下面是一個(gè)使用Python的sklearn庫實(shí)現(xiàn)GBM分類器的示例。我們將使用一個(gè)簡單的數(shù)據(jù)集來演示如何訓(xùn)練和評估GBM模型。#導(dǎo)入必要的庫

fromsklearn.datasetsimportmake_classification

fromsklearn.model_selectionimporttrain_test_split

fromsklearn.ensembleimportGradientBoostingClassifier

fromsklearn.metricsimportaccuracy_score

#生成分類數(shù)據(jù)集

X,y=make_classification(n_samples=1000,n_features=20,n_informative=15,n_redundant=5,random_state=42)

#劃分訓(xùn)練集和測試集

X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.2,random_state=42)

#初始化GBM分類器

gbm=GradientBoostingClassifier(n_estimators=100,learning_rate=0.1,max_depth=3,random_state=42)

#訓(xùn)練模型

gbm.fit(X_train,y_train)

#預(yù)測測試集

y_pred=gbm.predict(X_test)

#計(jì)算準(zhǔn)確率

accuracy=accuracy_score(y_test,y_pred)

print(f"GBM分類器的準(zhǔn)確率為:{accuracy}")在這個(gè)例子中,我們首先生成了一個(gè)包含1000個(gè)樣本和20個(gè)特征的分類數(shù)據(jù)集。然后,我們使用train_test_split函數(shù)將數(shù)據(jù)集劃分為訓(xùn)練集和測試集。接下來,我們初始化了一個(gè)GBM分類器,設(shè)置了迭代次數(shù)(n_estimators)、學(xué)習(xí)率(learning_rate)和決策樹的最大深度(max_depth)。模型訓(xùn)練完成后,我們使用測試集評估模型的性能,通過計(jì)算準(zhǔn)確率來衡量模型的分類效果。1.2GBM與傳統(tǒng)機(jī)器學(xué)習(xí)算法的對比GBM與傳統(tǒng)機(jī)器學(xué)習(xí)算法如邏輯回歸、支持向量機(jī)等相比,具有以下優(yōu)勢:自動(dòng)特征選擇:GBM在訓(xùn)練過程中可以自動(dòng)識(shí)別和利用最重要的特征,而不需要人工進(jìn)行特征選擇。處理非線性關(guān)系:GBM通過組合多個(gè)決策樹,能夠很好地處理數(shù)據(jù)中的非線性關(guān)系,這是線性模型難以做到的。魯棒性:GBM對異常值和缺失數(shù)據(jù)具有較好的魯棒性,能夠自動(dòng)調(diào)整模型以適應(yīng)數(shù)據(jù)的不規(guī)則性。然而,GBM也存在一些挑戰(zhàn):過擬合風(fēng)險(xiǎn):由于GBM模型的復(fù)雜性,如果不加以控制,很容易過擬合訓(xùn)練數(shù)據(jù),導(dǎo)致泛化能力下降。訓(xùn)練時(shí)間:GBM需要訓(xùn)練多個(gè)模型并進(jìn)行迭代優(yōu)化,因此訓(xùn)練時(shí)間可能比一些簡單模型要長。參數(shù)調(diào)優(yōu):GBM有多個(gè)參數(shù)需要調(diào)優(yōu),如學(xué)習(xí)率、迭代次數(shù)、樹的深度等,這可能需要更多的實(shí)驗(yàn)和時(shí)間。1.2.1示例對比為了直觀地展示GBM與邏輯回歸在處理非線性數(shù)據(jù)時(shí)的性能差異,我們使用一個(gè)具有非線性關(guān)系的合成數(shù)據(jù)集進(jìn)行對比。#導(dǎo)入必要的庫

fromsklearn.datasetsimportmake_moons

fromsklearn.linear_modelimportLogisticRegression

fromsklearn.metricsimportaccuracy_score

importmatplotlib.pyplotasplt

importnumpyasnp

#生成非線性數(shù)據(jù)集

X,y=make_moons(n_samples=1000,noise=0.3,random_state=42)

#劃分訓(xùn)練集和測試集

X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.2,random_state=42)

#初始化邏輯回歸分類器

lr=LogisticRegression()

lr.fit(X_train,y_train)

y_pred_lr=lr.predict(X_test)

accuracy_lr=accuracy_score(y_test,y_pred_lr)

#初始化GBM分類器

gbm=GradientBoostingClassifier(n_estimators=100,learning_rate=0.1,max_depth=3,random_state=42)

gbm.fit(X_train,y_train)

y_pred_gbm=gbm.predict(X_test)

accuracy_gbm=accuracy_score(y_test,y_pred_gbm)

#打印準(zhǔn)確率

print(f"邏輯回歸分類器的準(zhǔn)確率為:{accuracy_lr}")

print(f"GBM分類器的準(zhǔn)確率為:{accuracy_gbm}")

#可視化決策邊界

defplot_decision_boundary(model,X,y):

x_min,x_max=X[:,0].min()-1,X[:,0].max()+1

y_min,y_max=X[:,1].min()-1,X[:,1].max()+1

xx,yy=np.meshgrid(np.arange(x_min,x_max,0.1),

np.arange(y_min,y_max,0.1))

Z=model.predict(np.c_[xx.ravel(),yy.ravel()])

Z=Z.reshape(xx.shape)

plt.contourf(xx,yy,Z,alpha=0.4)

plt.scatter(X[:,0],X[:,1],c=y,alpha=0.8)

plt.title(f"{model.__class__.__name__}DecisionBoundary")

plt.show()

#繪制決策邊界

plot_decision_boundary(lr,X,y)

plot_decision_boundary(gbm,X,y)在這個(gè)對比示例中,我們使用make_moons函數(shù)生成了一個(gè)具有非線性關(guān)系的二分類數(shù)據(jù)集。然后,我們分別訓(xùn)練了一個(gè)邏輯回歸模型和一個(gè)GBM模型,并在測試集上評估了它們的性能。最后,我們通過可視化決策邊界來直觀地比較兩個(gè)模型的性能。邏輯回歸模型的決策邊界是線性的,而GBM模型的決策邊界能夠更好地適應(yīng)數(shù)據(jù)的非線性結(jié)構(gòu),從而在測試集上獲得了更高的準(zhǔn)確率。通過以上示例,我們可以看到GBM在處理非線性數(shù)據(jù)時(shí)的強(qiáng)大能力,以及它與傳統(tǒng)機(jī)器學(xué)習(xí)算法在性能上的顯著差異。然而,GBM的復(fù)雜性也意味著它可能需要更多的計(jì)算資源和時(shí)間來訓(xùn)練,同時(shí)在參數(shù)調(diào)優(yōu)方面也更加復(fù)雜。2過擬合與欠擬合的基礎(chǔ)概念2.1過擬合的定義與識(shí)別在機(jī)器學(xué)習(xí)中,過擬合(Overfitting)是指模型在訓(xùn)練數(shù)據(jù)上表現(xiàn)得過于優(yōu)秀,以至于它學(xué)習(xí)到了數(shù)據(jù)中的噪聲和異常點(diǎn),而不是數(shù)據(jù)的普遍規(guī)律。這種情況下,模型對訓(xùn)練數(shù)據(jù)的預(yù)測非常準(zhǔn)確,但對未見過的新數(shù)據(jù)(測試數(shù)據(jù))預(yù)測效果很差,即模型的泛化能力弱。2.1.1如何識(shí)別過擬合訓(xùn)練集與測試集性能對比:如果模型在訓(xùn)練集上的性能遠(yuǎn)高于測試集上的性能,這可能意味著過擬合。學(xué)習(xí)曲線:繪制模型在訓(xùn)練集和驗(yàn)證集上的誤差隨訓(xùn)練輪次變化的曲線,如果訓(xùn)練誤差持續(xù)下降,而驗(yàn)證誤差在某個(gè)點(diǎn)后開始上升,這表明模型開始過擬合。2.1.2示例:使用隨機(jī)森林分類器識(shí)別過擬合假設(shè)我們有一組鳶尾花數(shù)據(jù)集,我們將使用隨機(jī)森林分類器來預(yù)測鳶尾花的種類,并通過學(xué)習(xí)曲線來識(shí)別過擬合。importnumpyasnp

importmatplotlib.pyplotasplt

fromsklearn.datasetsimportload_iris

fromsklearn.ensembleimportRandomForestClassifier

fromsklearn.model_selectionimporttrain_test_split

fromsklearn.metricsimportaccuracy_score

#加載數(shù)據(jù)

data=load_iris()

X=data.data

y=data.target

#劃分?jǐn)?shù)據(jù)集

X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.2,random_state=42)

#創(chuàng)建隨機(jī)森林分類器

clf=RandomForestClassifier(n_estimators=100,random_state=42)

#訓(xùn)練模型并記錄訓(xùn)練和測試的準(zhǔn)確率

train_scores=[]

test_scores=[]

foriinrange(1,101):

clf.set_params(n_estimators=i)

clf.fit(X_train,y_train)

train_scores.append(clf.score(X_train,y_train))

test_scores.append(clf.score(X_test,y_test))

#繪制學(xué)習(xí)曲線

plt.figure()

plt.title("LearningCurveofRandomForest")

plt.xlabel("NumberofTrees")

plt.ylabel("AccuracyScore")

plt.plot(range(1,101),train_scores,label="TrainingScore")

plt.plot(range(1,101),test_scores,label="Cross-ValidationScore")

plt.legend(loc="best")

plt.show()在這個(gè)例子中,我們通過增加隨機(jī)森林中的樹的數(shù)量來觀察模型的性能變化。如果訓(xùn)練準(zhǔn)確率持續(xù)上升,而測試準(zhǔn)確率在某個(gè)點(diǎn)后開始下降,這表明模型開始過擬合。2.2欠擬合的定義與識(shí)別欠擬合(Underfitting)是指模型在訓(xùn)練數(shù)據(jù)上表現(xiàn)不佳,沒有捕捉到數(shù)據(jù)的復(fù)雜性或模式。這種模型不僅在訓(xùn)練數(shù)據(jù)上表現(xiàn)差,在新數(shù)據(jù)上表現(xiàn)也會(huì)差,因?yàn)樗鼪]有學(xué)習(xí)到足夠的信息來做出準(zhǔn)確的預(yù)測。2.2.1如何識(shí)別欠擬合訓(xùn)練集性能低:如果模型在訓(xùn)練集上的性能就很差,這可能意味著欠擬合。模型復(fù)雜度:如果模型過于簡單,無法捕捉數(shù)據(jù)的復(fù)雜性,這也會(huì)導(dǎo)致欠擬合。2.2.2示例:使用線性模型識(shí)別欠擬合假設(shè)我們有一組非線性的數(shù)據(jù),我們將使用線性回歸模型來預(yù)測數(shù)據(jù),并通過觀察模型在訓(xùn)練集上的性能來識(shí)別欠擬合。importnumpyasnp

importmatplotlib.pyplotasplt

fromsklearn.linear_modelimportLinearRegression

fromsklearn.datasetsimportmake_friedman1

fromsklearn.model_selectionimporttrain_test_split

#生成非線性數(shù)據(jù)

X,y=make_friedman1(n_samples=100,noise=10,random_state=42)

#劃分?jǐn)?shù)據(jù)集

X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.2,random_state=42)

#創(chuàng)建線性回歸模型

model=LinearRegression()

#訓(xùn)練模型

model.fit(X_train,y_train)

#預(yù)測并計(jì)算訓(xùn)練和測試的誤差

train_error=np.mean((model.predict(X_train)-y_train)**2)

test_error=np.mean((model.predict(X_test)-y_test)**2)

#輸出誤差

print(f"TrainingError:{train_error}")

print(f"TestError:{test_error}")

#繪制預(yù)測與實(shí)際值的對比

plt.figure()

plt.scatter(model.predict(X_train),y_train,color='blue',label='TrainingData')

plt.scatter(model.predict(X_test),y_test,color='red',label='TestData')

plt.plot([min(y),max(y)],[min(y),max(y)],color='green',linestyle='--',label='IdealPrediction')

plt.xlabel('PredictedValues')

plt.ylabel('ActualValues')

plt.legend(loc="upperleft")

plt.show()在這個(gè)例子中,我們使用線性回歸模型來預(yù)測非線性數(shù)據(jù)。如果模型在訓(xùn)練集上的預(yù)測誤差很大,且預(yù)測值與實(shí)際值的對比圖顯示模型的預(yù)測能力有限,這表明模型可能欠擬合。通過上述兩個(gè)示例,我們可以看到過擬合和欠擬合在模型訓(xùn)練過程中的表現(xiàn),以及如何通過觀察模型在訓(xùn)練集和測試集上的性能來識(shí)別這兩種問題。在實(shí)際應(yīng)用中,我們通常需要通過調(diào)整模型的復(fù)雜度、增加數(shù)據(jù)量、使用正則化等方法來平衡過擬合和欠擬合,以獲得具有較好泛化能力的模型。3GBM中的過擬合問題3.1過擬合的原因分析在梯度提升機(jī)(GBM)中,過擬合是一個(gè)常見的問題,它發(fā)生在模型對訓(xùn)練數(shù)據(jù)的細(xì)節(jié)和噪聲學(xué)習(xí)得過于深入,以至于在新的、未見過的數(shù)據(jù)上表現(xiàn)不佳。過擬合的原因主要有以下幾點(diǎn):模型復(fù)雜度過高:GBM通過迭代地添加決策樹來逐步減少殘差,如果決策樹的深度過大或樹的數(shù)量過多,模型可能會(huì)變得過于復(fù)雜,從而捕捉到訓(xùn)練數(shù)據(jù)中的噪聲。學(xué)習(xí)率設(shè)置不當(dāng):學(xué)習(xí)率(learning_rate)控制著每棵樹對模型的貢獻(xiàn)程度。如果學(xué)習(xí)率過高,模型可能會(huì)快速收斂,但同時(shí)也可能過度擬合訓(xùn)練數(shù)據(jù)。特征選擇不當(dāng):如果模型使用了太多無關(guān)或冗余的特征,它可能會(huì)在這些特征上過度擬合,導(dǎo)致泛化能力下降。數(shù)據(jù)量不足:當(dāng)訓(xùn)練數(shù)據(jù)量較少時(shí),模型容易過擬合,因?yàn)樗鼪]有足夠的信息來區(qū)分信號和噪聲。正則化不足:GBM中的正則化參數(shù)(如subsample和colsample_bytree)可以幫助減少過擬合,如果這些參數(shù)設(shè)置不當(dāng),模型可能無法有效泛化。3.2過擬合的檢測方法檢測GBM中的過擬合可以通過以下幾種方法:交叉驗(yàn)證:通過將數(shù)據(jù)集分為訓(xùn)練集和驗(yàn)證集,可以觀察模型在驗(yàn)證集上的表現(xiàn)。如果模型在訓(xùn)練集上的表現(xiàn)遠(yuǎn)優(yōu)于驗(yàn)證集,這可能表明模型過擬合了。學(xué)習(xí)曲線:繪制學(xué)習(xí)曲線,即模型在訓(xùn)練集和驗(yàn)證集上的誤差隨訓(xùn)練輪數(shù)變化的曲線。如果訓(xùn)練誤差持續(xù)下降而驗(yàn)證誤差開始上升,這表明模型開始過擬合。特征重要性:檢查特征的重要性可以幫助識(shí)別模型是否依賴于某些噪聲特征。如果模型對一些不重要的特征賦予了高權(quán)重,這可能是一個(gè)過擬合的跡象。3.2.1示例:使用交叉驗(yàn)證檢測GBM的過擬合假設(shè)我們有一個(gè)數(shù)據(jù)集X和對應(yīng)的標(biāo)簽y,我們將使用scikit-learn庫中的GradientBoostingClassifier來構(gòu)建一個(gè)GBM模型,并通過交叉驗(yàn)證來檢測過擬合。importnumpyasnp

fromsklearn.datasetsimportload_iris

fromsklearn.model_selectionimporttrain_test_split,cross_val_score

fromsklearn.ensembleimportGradientBoostingClassifier

#加載數(shù)據(jù)集

data=load_iris()

X=data.data

y=data.target

#劃分訓(xùn)練集和測試集

X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.2,random_state=42)

#創(chuàng)建GBM模型

gbm=GradientBoostingClassifier(n_estimators=100,learning_rate=1.0,max_depth=1,random_state=0)

#使用交叉驗(yàn)證評估模型

scores=cross_val_score(gbm,X_train,y_train,cv=5)

#輸出交叉驗(yàn)證得分

print("Cross-validationscores:",scores)

print("Meancross-validationscore:",scores.mean())

#訓(xùn)練模型并評估在測試集上的表現(xiàn)

gbm.fit(X_train,y_train)

test_score=gbm.score(X_test,y_test)

print("Testsetscore:",test_score)在這個(gè)例子中,我們使用了load_iris函數(shù)來加載鳶尾花數(shù)據(jù)集,然后使用train_test_split函數(shù)將數(shù)據(jù)集分為訓(xùn)練集和測試集。我們創(chuàng)建了一個(gè)GradientBoostingClassifier模型,并通過cross_val_score函數(shù)進(jìn)行了5折交叉驗(yàn)證。最后,我們評估了模型在測試集上的表現(xiàn)。如果交叉驗(yàn)證的平均得分遠(yuǎn)低于測試集得分,或者交叉驗(yàn)證得分的方差很大,這可能表明模型存在過擬合問題。3.2.2示例:使用學(xué)習(xí)曲線檢測GBM的過擬合學(xué)習(xí)曲線是另一種檢測過擬合的方法,它通過觀察模型在訓(xùn)練集和驗(yàn)證集上的表現(xiàn)隨訓(xùn)練輪數(shù)的變化來識(shí)別過擬合。importmatplotlib.pyplotasplt

fromsklearn.model_selectionimportlearning_curve

#生成學(xué)習(xí)曲線

train_sizes,train_scores,test_scores=learning_curve(

gbm,X_train,y_train,cv=5,scoring="accuracy",n_jobs=-1,train_sizes=np.linspace(0.01,1.0,50),verbose=0)

#計(jì)算平均值和標(biāo)準(zhǔn)差

train_mean=np.mean(train_scores,axis=1)

train_std=np.std(train_scores,axis=1)

test_mean=np.mean(test_scores,axis=1)

test_std=np.std(test_scores,axis=1)

#繪制學(xué)習(xí)曲線

plt.plot(train_sizes,train_mean,'--',color="red",label="Trainingscore")

plt.plot(train_sizes,test_mean,color="blue",label="Cross-validationscore")

plt.fill_between(train_sizes,train_mean-train_std,train_mean+train_std,color="gray")

plt.fill_between(train_sizes,test_mean-test_std,test_mean+test_std,color="gainsboro")

plt.title("LearningCurve")

plt.xlabel("TrainingSetSize"),plt.ylabel("AccuracyScore"),plt.legend(loc="best")

plt.tight_layout()

plt.show()在這個(gè)例子中,我們使用了learning_curve函數(shù)來生成學(xué)習(xí)曲線。我們繪制了訓(xùn)練集和驗(yàn)證集的平均準(zhǔn)確率,并用標(biāo)準(zhǔn)差表示了誤差范圍。如果訓(xùn)練集的準(zhǔn)確率持續(xù)上升,而驗(yàn)證集的準(zhǔn)確率在某個(gè)點(diǎn)后開始下降,這表明模型開始過擬合。通過上述方法,我們可以有效地檢測GBM模型中的過擬合問題,并采取相應(yīng)的措施來調(diào)整模型參數(shù),以提高模型的泛化能力。4GBM中的欠擬合問題4.1欠擬合的原因分析在梯度提升機(jī)(GradientBoostingMachine,GBM)中,欠擬合通常發(fā)生在模型對訓(xùn)練數(shù)據(jù)的復(fù)雜性估計(jì)不足時(shí)。這可能由以下幾個(gè)原因造成:學(xué)習(xí)率設(shè)置過高:學(xué)習(xí)率(learningrate)控制著每棵樹對最終預(yù)測結(jié)果的貢獻(xiàn)程度。如果學(xué)習(xí)率設(shè)置得過高,模型可能無法充分學(xué)習(xí)數(shù)據(jù)中的模式,導(dǎo)致欠擬合。樹的深度設(shè)置過淺:決策樹的深度決定了模型能夠捕捉到數(shù)據(jù)中的復(fù)雜模式的程度。如果樹的深度設(shè)置得過淺,模型可能無法充分?jǐn)M合訓(xùn)練數(shù)據(jù),從而欠擬合。特征選擇不當(dāng):如果模型使用的特征不足以描述數(shù)據(jù)的復(fù)雜性,或者特征之間缺乏相關(guān)性,模型可能無法從數(shù)據(jù)中學(xué)習(xí)到足夠的信息,導(dǎo)致欠擬合。數(shù)據(jù)量不足:GBM是基于數(shù)據(jù)的統(tǒng)計(jì)模型,需要足夠的數(shù)據(jù)來學(xué)習(xí)和泛化。如果訓(xùn)練數(shù)據(jù)量不足,模型可能無法捕捉到數(shù)據(jù)的全部模式,從而欠擬合。正則化參數(shù)設(shè)置過強(qiáng):正則化參數(shù)如L1或L2正則化,用于防止模型過擬合。但如果設(shè)置得過強(qiáng),可能會(huì)抑制模型的學(xué)習(xí)能力,導(dǎo)致欠擬合。4.2欠擬合的檢測方法檢測GBM模型是否欠擬合,可以通過以下幾種方法:訓(xùn)練集和驗(yàn)證集的性能比較:如果模型在訓(xùn)練集上的性能遠(yuǎn)低于在驗(yàn)證集上的性能,這可能表明模型欠擬合。然而,更常見的情況是,如果模型在訓(xùn)練集和驗(yàn)證集上的性能都很差,這通常是欠擬合的跡象。學(xué)習(xí)曲線:繪制學(xué)習(xí)曲線,即模型在訓(xùn)練集和驗(yàn)證集上的性能隨訓(xùn)練輪數(shù)變化的曲線。如果兩條曲線都保持在較低水平且沒有收斂跡象,這可能表明模型欠擬合。特征重要性分析:檢查模型的特征重要性,如果所有特征的重要性都很低,這可能意味著模型沒有從特征中學(xué)習(xí)到足夠的信息,從而欠擬合。模型復(fù)雜度分析:檢查模型的復(fù)雜度,如樹的深度、樹的數(shù)量等。如果模型的復(fù)雜度設(shè)置得過低,這可能是欠擬合的原因。4.2.1示例:使用Python的Scikit-Learn庫檢測GBM的欠擬合#導(dǎo)入必要的庫

fromsklearn.ensembleimportGradientBoostingClassifier

fromsklearn.model_selectionimporttrain_test_split

fromsklearn.metricsimportaccuracy_score

importnumpyasnp

importmatplotlib.pyplotasplt

#創(chuàng)建模擬數(shù)據(jù)

np.random.seed(0)

X=np.random.rand(1000,10)

y=np.random.randint(2,size=1000)

#劃分訓(xùn)練集和驗(yàn)證集

X_train,X_val,y_train,y_val=train_test_split(X,y,test_size=0.2,random_state=42)

#初始化GBM模型

gbm=GradientBoostingClassifier(n_estimators=100,learning_rate=1.0,max_depth=1,random_state=0)

#訓(xùn)練模型

gbm.fit(X_train,y_train)

#預(yù)測訓(xùn)練集和驗(yàn)證集

train_pred=gbm.predict(X_train)

val_pred=gbm.predict(X_val)

#計(jì)算準(zhǔn)確率

train_acc=accuracy_score(y_train,train_pred)

val_acc=accuracy_score(y_val,val_pred)

#打印準(zhǔn)確率

print(f"Trainaccuracy:{train_acc}")

print(f"Validationaccuracy:{val_acc}")

#繪制學(xué)習(xí)曲線

train_scores=[]

val_scores=[]

forninrange(1,101):

gbm=GradientBoostingClassifier(n_estimators=n,learning_rate=1.0,max_depth=1,random_state=0)

gbm.fit(X_train,y_train)

train_scores.append(accuracy_score(y_train,gbm.predict(X_train)))

val_scores.append(accuracy_score(y_val,gbm.predict(X_val)))

plt.figure()

plt.title("LearningCurves")

plt.xlabel("NumberofTrees")

plt.ylabel("Accuracy")

plt.plot(range(1,101),train_scores,'o-',color="r",label="Trainingscore")

plt.plot(range(1,101),val_scores,'o-',color="g",label="Cross-validationscore")

plt.legend(loc="best")

plt.show()在這個(gè)例子中,我們使用了非常高的學(xué)習(xí)率(1.0)和非常淺的樹深度(1),這通常會(huì)導(dǎo)致欠擬合。通過比較訓(xùn)練集和驗(yàn)證集的準(zhǔn)確率,以及繪制學(xué)習(xí)曲線,我們可以觀察到模型的性能是否隨著樹的數(shù)量增加而改善,從而判斷模型是否欠擬合。4.2.2解決欠擬合的策略降低學(xué)習(xí)率:通過降低學(xué)習(xí)率,可以讓模型更細(xì)致地學(xué)習(xí)數(shù)據(jù)中的模式,從而減少欠擬合的風(fēng)險(xiǎn)。增加樹的深度:增加樹的深度可以讓模型捕捉到更復(fù)雜的模式,但需要注意不要過度增加,以避免過擬合。增加特征:如果可能,增加更多的特征可以幫助模型更好地描述數(shù)據(jù)的復(fù)雜性。增加數(shù)據(jù)量:更多的數(shù)據(jù)可以幫助模型學(xué)習(xí)到更全面的模式,從而減少欠擬合的風(fēng)險(xiǎn)。調(diào)整正則化參數(shù):適當(dāng)降低正則化參數(shù)的強(qiáng)度,可以讓模型有更大的自由度去學(xué)習(xí)數(shù)據(jù)中的模式。通過這些策略,我們可以調(diào)整GBM模型的參數(shù),以減少欠擬合的風(fēng)險(xiǎn),提高模型的性能。5解決過擬合與欠擬合的策略5.1參數(shù)調(diào)整以防止過擬合梯度提升機(jī)(GBM)作為一種強(qiáng)大的機(jī)器學(xué)習(xí)算法,容易在復(fù)雜模型中出現(xiàn)過擬合問題。過擬合指的是模型在訓(xùn)練數(shù)據(jù)上表現(xiàn)極好,但在未見過的數(shù)據(jù)(如測試集)上表現(xiàn)較差。為避免過擬合,可以通過調(diào)整以下參數(shù):5.1.1學(xué)習(xí)率(LearningRate)學(xué)習(xí)率控制每次迭代中模型更新的幅度。較小的學(xué)習(xí)率可以減緩模型學(xué)習(xí)的速度,有助于模型更加穩(wěn)健,避免對訓(xùn)練數(shù)據(jù)中的噪聲過于敏感。5.1.1.1示例代碼fromsklearn.ensembleimportGradientBoostingClassifier

fromsklearn.datasetsimportmake_classification

fromsklearn.model_selectionimporttrain_test_split

#生成分類數(shù)據(jù)

X,y=make_classification(n_samples=1000,n_features=20,n_informative=15,n_redundant=5,random_state=42)

X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.2,random_state=42)

#設(shè)置不同的學(xué)習(xí)率

gbm_low_lr=GradientBoostingClassifier(learning_rate=0.01,n_estimators=1000)

gbm_high_lr=GradientBoostingClassifier(learning_rate=0.1,n_estimators=1000)

#訓(xùn)練模型

gbm_low_lr.fit(X_train,y_train)

gbm_high_lr.fit(X_train,y_train)

#評估模型

print("LowLearningRateTestScore:",gbm_low_lr.score(X_test,y_test))

print("HighLearningRateTestScore:",gbm_high_lr.score(X_test,y_test))5.1.2樹的深度(MaxDepth)樹的深度決定了樹的復(fù)雜度。較淺的樹可以減少過擬合的風(fēng)險(xiǎn),但可能增加欠擬合的風(fēng)險(xiǎn)。通過調(diào)整樹的深度,可以找到模型復(fù)雜度與泛化能力之間的平衡。5.1.2.1示例代碼#設(shè)置不同的樹深度

gbm_shallow=GradientBoostingClassifier(max_depth=3,n_estimators=1000)

gbm_deep=GradientBoostingClassifier(max_depth=6,n_estimators=1000)

#訓(xùn)練模型

gbm_shallow.fit(X_train,y_train)

gbm_deep.fit(X_train,y_train)

#評估模型

print("ShallowTreeTestScore:",gbm_shallow.score(X_test,y_test))

print("DeepTreeTestScore:",gbm_deep.score(X_test,y_test))5.1.3正則化參數(shù)(RegularizationParameters)GBM提供了正則化參數(shù),如l1和l2,用于懲罰模型的復(fù)雜度,從而減少過擬合。5.1.3.1示例代碼#設(shè)置不同的正則化參數(shù)

gbm_l1=GradientBoostingClassifier(subsample=0.5,max_features='sqrt',reg_alpha=1,reg_lambda=1)

gbm_l2=GradientBoostingClassifier(subsample=0.5,max_features='sqrt',reg_alpha=0,reg_lambda=1)

#訓(xùn)練模型

gbm_l1.fit(X_train,y_train)

gbm_l2.fit(X_train,y_train)

#評估模型

print("L1RegularizationTestScore:",gbm_l1.score(X_test,y_test))

print("L2RegularizationTestScore:",gbm_l2.score(X_test,y_test))5.2集成方法減少欠擬合欠擬合指的是模型在訓(xùn)練數(shù)據(jù)上表現(xiàn)不佳,通常是因?yàn)槟P瓦^于簡單,無法捕捉數(shù)據(jù)中的復(fù)雜模式。集成方法,如Bagging和RandomForest,可以通過構(gòu)建多個(gè)模型并綜合它們的預(yù)測來減少欠擬合。5.2.1BaggingBagging通過創(chuàng)建多個(gè)數(shù)據(jù)子集(通常通過有放回的抽樣),然后在每個(gè)子集上訓(xùn)練一個(gè)模型。最終的預(yù)測是所有模型預(yù)測的平均值。5.2.1.1示例代碼fromsklearn.ensembleimportBaggingClassifier

#使用Bagging集成GBM

bagging_gbm=BaggingClassifier(base_estimator=GradientBoostingClassifier(),n_estimators=10)

bagging_gbm.fit(X_train,y_train)

#評估模型

print("BaggingGBMTestScore:",bagging_gbm.score(X_test,y_test))5.2.2RandomForestRandomForest是一種特殊的Bagging方法,它在每個(gè)決策樹的每個(gè)分裂點(diǎn)上隨機(jī)選擇特征。這增加了模型的多樣性,有助于減少欠擬合。5.2.2.1示例代碼fromsklearn.ensembleimportRandomForestClassifier

#使用RandomForest

rf=RandomForestClassifier(n_estimators=100)

rf.fit(X_train,y_train)

#評估模型

print("RandomForestTestScore:",rf.score(X_test,y_test))通過上述策略,可以有效地調(diào)整GBM模型,以減少過擬合和欠擬合問題,從而提高模型的泛化能力。在實(shí)際應(yīng)用中,可能需要結(jié)合多種方法,并通過交叉驗(yàn)證來選擇最佳參數(shù)組合。6案例分析與實(shí)踐6.1過擬合案例分析在機(jī)器學(xué)習(xí)中,梯度提升機(jī)(GBM)是一種強(qiáng)大的算法,尤其在處理分類和回歸問題時(shí)表現(xiàn)出色。然而,GBM也容易遭受過擬合問題,即模型在訓(xùn)練數(shù)據(jù)上表現(xiàn)極好,但在未見過的數(shù)據(jù)(如測試集)上表現(xiàn)較差。這通常是因?yàn)槟P蛯W(xué)習(xí)到了訓(xùn)練數(shù)據(jù)中的噪聲,而不是數(shù)據(jù)背后的真正模式。6.1.1原理過擬合在GBM中主要由以下因素引起:-學(xué)習(xí)率(learningrate):如果學(xué)習(xí)率設(shè)置得過高,模型可能會(huì)快速收斂,從而學(xué)習(xí)到訓(xùn)練數(shù)據(jù)中的噪聲。-樹的深度(treedepth):樹越深,模型越復(fù)雜,越容易過擬合。-迭代次數(shù)(numberofiterations):迭代次數(shù)過多也會(huì)導(dǎo)致模型過擬合。6.1.2示例假設(shè)我們有一個(gè)二分類問題,使用GBM進(jìn)行建模。下面是一個(gè)使用sklearn庫中的GradientBoostingClassifier的示例,展示如何通過調(diào)整參數(shù)來避免過擬合。importnumpyasnp

fromsklearn.datasetsimportmake_classification

fromsklearn.model_selectionimporttrain_test_split

fromsklearn.ensembleimportGradientBoostingClassifier

fromsklearn.metricsimportaccuracy_score

#生成分類數(shù)據(jù)集

X,y=make_classification(n_samples=1000,n_features=20,n_informative=15,n_redundant=5,random_state=42)

X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.2,random_state=42)

#創(chuàng)建GBM模型

gbm=GradientBoostingClassifier(n_estimators=100,learning_rate=0.1,max_depth=3,random_state=42)

#訓(xùn)練模型

gbm.fit(X_train,y_train)

#預(yù)測

y_pred=gbm.predict(X_test)

#計(jì)算準(zhǔn)確率

accuracy=accuracy_score(y_test,y_pred)

print(f"TestAccuracy:{accuracy}")

#調(diào)整參數(shù)以減少過擬合

gbm=GradientBoostingClassifier(n_estimators=50,learning_rate=0.05,max_depth=2,random_state=42)

gbm.fit(X_train,y_train)

y_pred=gbm.predict(X_test)

accuracy=accuracy_score(y_test,y_pred)

print(f"AdjustedTestAccuracy:{accuracy}")在這個(gè)例子中,我們首先使用默認(rèn)參數(shù)訓(xùn)練GBM模型,然后通過減少迭代次數(shù)(n_estimators)、降低學(xué)習(xí)率(learning_rate)和限制樹的深度(max_depth)來調(diào)整模型,以減少過擬合。6.2欠擬合案例分析欠擬合是模型在訓(xùn)練數(shù)據(jù)和測試數(shù)據(jù)上都表現(xiàn)不佳的情況,這通常意味著模型沒有充分學(xué)習(xí)數(shù)據(jù)中的模式。6.2.1原理GBM中的欠擬合可能由以下因素引起:-學(xué)習(xí)率(learningrate):如果學(xué)習(xí)率設(shè)置得過低,模型可能需要更多迭代才能收斂,或者可能永遠(yuǎn)無法充分?jǐn)M合數(shù)據(jù)。-樹的深度(treedepth):樹太淺,模型可能無法捕捉到數(shù)據(jù)中的復(fù)雜模式。-迭代次數(shù)(numberofiterations):迭代次數(shù)太少,模型可能無法充分學(xué)習(xí)數(shù)據(jù)。6.2.2示例下面是一個(gè)示例,展示如何通過調(diào)整GBM的參數(shù)來解決欠擬合問題。#使用較低的學(xué)習(xí)率和較少的迭代次數(shù),可能會(huì)導(dǎo)致欠擬合

gbm=GradientBoostingClassifier(n_estimators=10,learning_rate=0.5,max_depth=1,random_state=42)

gbm.fit(X_train,y_train)

y_pred=gbm.predict(X_test)

accuracy=accuracy_score(y_test,y_pred)

print(f"UnderfitTestAccuracy:{accuracy}")

#調(diào)整參數(shù)以減少欠擬合

gbm=GradientBoostingClassifier(n_estimators=200,learning_rate=0.1,max_depth=5,random_state=42)

gbm.fit(X_train,y_train)

y_pred=gbm.predict(X_test)

accuracy=accuracy_score(y_test,y_pred)

print(f"AdjustedTestAccuracy:{accuracy}")在這個(gè)例子中,我們首先使用較少的迭代次數(shù)、較高的學(xué)習(xí)率和較淺的樹深度來訓(xùn)練GBM模型,這可能導(dǎo)致欠擬合。然后,我們通過增加迭代次數(shù)、降低學(xué)習(xí)率和增加樹的深度來調(diào)整模型,以減少欠擬合。6.3實(shí)踐中的GBM調(diào)參技巧在實(shí)際應(yīng)用中,調(diào)整GBM的參數(shù)以平衡過擬合和欠擬合是關(guān)鍵。以下是一些實(shí)用的調(diào)參技巧:使用交叉驗(yàn)證:通過交叉驗(yàn)證來評估模型在不同參數(shù)設(shè)置下的性能,可以幫助找到最佳參數(shù)組合。調(diào)整學(xué)習(xí)率:降低學(xué)習(xí)率可以減少過擬合的風(fēng)險(xiǎn),但可能需要增加迭代次數(shù)以達(dá)到最佳性能。限制樹的深度:樹的深度不宜過深,以避免過擬合。通常,深度在3到8之間是一個(gè)好的起點(diǎn)??刂频螖?shù):迭代次數(shù)過多會(huì)導(dǎo)致過擬合,太少則可能導(dǎo)致欠擬合。可以通過觀察訓(xùn)練和驗(yàn)證集上的損失函數(shù)來確定最佳迭代次數(shù)。使用正則化:GBM提供了正則化參數(shù),如l1和l2,來控制模型的復(fù)雜度,從而減少過擬合。通過這些技巧,可以有效地調(diào)整GBM模型,使其在處理分類問題時(shí)既不過擬合也不欠擬合,從而達(dá)到最佳的預(yù)測性能。7人工智能和機(jī)器學(xué)習(xí)之分類算法:梯度提升機(jī)(GBM):過擬合與欠擬合問題7.1GBM在分類任務(wù)中的優(yōu)勢梯度提升機(jī)(GradientBoostingMachine,GBM)是一種強(qiáng)大的機(jī)器學(xué)習(xí)算法,尤其在處理分類任務(wù)時(shí)表現(xiàn)出色。GBM通過迭代地添加弱學(xué)習(xí)器(通常是決策樹)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論