版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 婚禮致辭怎么講7篇
- 后勤副校長述職報(bào)告
- 專升本心理學(xué)模擬試題及參考答案
- 四級勞動(dòng)關(guān)系協(xié)調(diào)員試題+答案
- 肥料、土壤調(diào)理劑和有益物質(zhì) 術(shù)語 編制說明
- 2024年新人教版七年級上冊語文教學(xué)課件 第5單元18《我的白鴿》課時(shí)1
- 某大型房地產(chǎn)公司工程質(zhì)量驗(yàn)收標(biāo)準(zhǔn)(節(jié)能工程)
- 亳州市利辛縣2025屆數(shù)學(xué)三上期末監(jiān)測模擬試題含解析
- 滄州市獻(xiàn)縣2025屆數(shù)學(xué)六上期末學(xué)業(yè)質(zhì)量監(jiān)測模擬試題含解析
- 辦公樓裝飾裝修工程技術(shù)標(biāo)-標(biāo)前施工組織設(shè)計(jì)
- 中國移動(dòng)網(wǎng)上大學(xué)【CDN技術(shù)介紹】試題及答案
- 湘潭大學(xué)電工電子實(shí)訓(xùn)報(bào)告
- 丁往道英語寫作手冊課件
- NB∕T 33019-2021 電動(dòng)汽車充換電設(shè)施運(yùn)行管理規(guī)范
- 放射科危重病應(yīng)急預(yù)案演練記錄及總結(jié)分析
- 北師大版二年級數(shù)學(xué)上冊練習(xí)一
- 光伏施工驗(yàn)收標(biāo)準(zhǔn)
- 影像之鏡頭語言課件
- 中考語文雙項(xiàng)細(xì)目表
- 滿月百天生日模板-(29)課件
- 醫(yī)院護(hù)理工作匯報(bào)課件
評論
0/150
提交評論