提升機器學習模型效能



整合學習提高效能

整合方法可以透過組合多個模型來提升機器學習結果。基本上,整合模型由多個獨立訓練的監督學習模型組成,它們的預測結果以各種方式合併,以實現比單個模型更好的預測效能。整合方法可以分為以下兩類:

順序整合方法

顧名思義,在這種整合方法中,基礎學習器是按順序生成的。此類方法的動機是利用基礎學習器之間的依賴關係。

並行整合方法

顧名思義,在這種整合方法中,基礎學習器是並行生成的。此類方法的動機是利用基礎學習器之間的獨立性。

整合學習方法

以下是幾種最流行的整合學習方法,也就是組合不同模型預測結果的方法:

Bagging

Bagging也被稱為Bootstrap Aggregation。在Bagging方法中,整合模型試圖透過組合在隨機生成的訓練樣本上訓練的各個模型的預測結果來提高預測準確率並降低模型方差。整合模型的最終預測將透過計算所有單個估計器的預測平均值來給出。隨機森林是Bagging方法的一個很好的例子。

Boosting

在Boosting方法中,構建整合模型的主要原理是透過依次訓練每個基礎模型估計器來逐步構建它。顧名思義,它基本上結合了多個弱基礎學習器,這些學習器在訓練資料的多個迭代中依次訓練,以構建強大的整合。在訓練弱基礎學習器期間,會為之前被錯誤分類的學習器分配更高的權重。AdaBoost是Boosting方法的一個例子。

投票

在這種整合學習模型中,構建多個不同型別的模型,並使用一些簡單的統計方法(如計算平均值或中位數等)來組合預測結果。這個預測結果將作為額外的輸入用於訓練,以做出最終預測。

Bagging 整合演算法

以下是三種Bagging整合演算法:

Bagged決策樹

眾所周知,Bagging整合方法適用於方差較大的演算法,在這方面,決策樹演算法是最好的選擇。在下面的Python示例中,我們將使用sklearn的BaggingClassifier函式和DecisionTreeClasifier(一種分類和迴歸樹演算法)在Pima印第安人糖尿病資料集上構建Bagged決策樹整合模型。

首先,匯入所需的包,如下所示:

from pandas import read_csv
from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score
from sklearn.ensemble import BaggingClassifier
from sklearn.tree import DecisionTreeClassifier

現在,我們需要載入Pima糖尿病資料集,就像我們在之前的示例中做的那樣:

path = r"C:\pima-indians-diabetes.csv"
headernames = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
data = read_csv(path, names=headernames)
array = data.values
X = array[:,0:8]
Y = array[:,8]

接下來,為10折交叉驗證提供輸入,如下所示:

seed = 7
kfold = KFold(n_splits=10, random_state=seed)
cart = DecisionTreeClassifier()

我們需要提供我們將構建的樹的數量。這裡我們將構建150棵樹:

num_trees = 150

接下來,使用以下指令碼構建模型:

model = BaggingClassifier(base_estimator=cart, n_estimators=num_trees, random_state=seed)

計算並列印結果,如下所示:

results = cross_val_score(model, X, Y, cv=kfold)
print(results.mean())

輸出

0.7733766233766234

上面的輸出顯示,我們得到了大約77%的Bagged決策樹分類器模型的準確率。

隨機森林

它是Bagged決策樹的擴充套件。對於單個分類器,訓練資料集的樣本是帶放回抽樣的,但樹的構建方式降低了它們之間的相關性。此外,在構建每棵樹時,會考慮特徵的隨機子集來選擇每個分割點,而不是貪婪地選擇最佳分割點。

在下面的Python示例中,我們將使用sklearn的RandomForestClassifier類在Pima印第安人糖尿病資料集上構建Bagged隨機森林整合模型。

首先,匯入所需的包,如下所示:

from pandas import read_csv
from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score
from sklearn.ensemble import RandomForestClassifier

現在,我們需要載入Pima糖尿病資料集,就像在之前的示例中做的那樣:

path = r"C:\pima-indians-diabetes.csv"
headernames = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
data = read_csv(path, names=headernames)
array = data.values
X = array[:,0:8]
Y = array[:,8]

接下來,為10折交叉驗證提供輸入,如下所示:

seed = 7
kfold = KFold(n_splits=10, random_state=seed)

我們需要提供我們將構建的樹的數量。這裡我們將構建150棵樹,並且分割點從5個特徵中選擇:

num_trees = 150
max_features = 5

接下來,使用以下指令碼構建模型:

model = RandomForestClassifier(n_estimators=num_trees, max_features=max_features)

計算並列印結果,如下所示:

results = cross_val_score(model, X, Y, cv=kfold)
print(results.mean())

輸出

0.7629357484620642

上面的輸出顯示,我們得到了大約76%的Bagged隨機森林分類器模型的準確率。

Extra Trees

它是Bagged決策樹整合方法的另一種擴充套件。在這種方法中,隨機樹是從訓練資料集的樣本中構建的。

在下面的Python示例中,我們將使用sklearn的ExtraTreesClassifier類在Pima印第安人糖尿病資料集上構建Extra Tree整合模型。

首先,匯入所需的包,如下所示:

from pandas import read_csv
from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score
from sklearn.ensemble import ExtraTreesClassifier

現在,我們需要載入Pima糖尿病資料集,就像在之前的示例中做的那樣:

path = r"C:\pima-indians-diabetes.csv"
headernames = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
data = read_csv(path, names=headernames)
array = data.values
X = array[:,0:8]
Y = array[:,8]

接下來,為10折交叉驗證提供輸入,如下所示:

seed = 7
kfold = KFold(n_splits=10, random_state=seed)

我們需要提供我們將構建的樹的數量。這裡我們將構建150棵樹,並且分割點從5個特徵中選擇:

num_trees = 150
max_features = 5

接下來,使用以下指令碼構建模型:

model = ExtraTreesClassifier(n_estimators=num_trees, max_features=max_features)

計算並列印結果,如下所示:

results = cross_val_score(model, X, Y, cv=kfold)
print(results.mean())

輸出

0.7551435406698566

上面的輸出顯示,我們得到了大約75.5%的Bagged Extra Trees分類器模型的準確率。

Boosting 整合演算法

以下是兩種最常見的Boosting整合演算法:

AdaBoost

它是最成功的Boosting整合演算法之一。該演算法的關鍵在於賦予資料集中例項權重的方式。由於這個原因,該演算法在構建後續模型時需要減少對這些例項的關注。

在下面的Python示例中,我們將使用sklearn的AdaBoostClassifier類在Pima印第安人糖尿病資料集上構建用於分類的Ada Boost整合模型。

首先,匯入所需的包,如下所示:

from pandas import read_csv
from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score
from sklearn.ensemble import AdaBoostClassifier

現在,我們需要載入Pima糖尿病資料集,就像在之前的示例中做的那樣:

path = r"C:\pima-indians-diabetes.csv"
headernames = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
data = read_csv(path, names=headernames)
array = data.values
X = array[:,0:8]
Y = array[:,8]

接下來,為10折交叉驗證提供輸入,如下所示:

seed = 5
kfold = KFold(n_splits=10, random_state=seed)

我們需要提供我們將構建的樹的數量。這裡我們將構建150棵樹,並且分割點從5個特徵中選擇:

num_trees = 50

接下來,使用以下指令碼構建模型:

model = AdaBoostClassifier(n_estimators=num_trees, random_state=seed)

計算並列印結果,如下所示:

results = cross_val_score(model, X, Y, cv=kfold)
print(results.mean())

輸出

0.7539473684210527

上面的輸出顯示,我們得到了大約75%的AdaBoost分類器整合模型的準確率。

隨機梯度提升

它也稱為梯度提升機。在下面的Python示例中,我們將使用sklearn的GradientBoostingClassifier類在Pima印第安人糖尿病資料集上構建用於分類的隨機梯度提升整合模型。

首先,匯入所需的包,如下所示:

from pandas import read_csv
from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score
from sklearn.ensemble import GradientBoostingClassifier

現在,我們需要載入Pima糖尿病資料集,就像在之前的示例中做的那樣:

path = r"C:\pima-indians-diabetes.csv"
headernames = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
data = read_csv(path, names=headernames)
array = data.values
X = array[:,0:8]
Y = array[:,8]

接下來,為10折交叉驗證提供輸入,如下所示:

seed = 5
kfold = KFold(n_splits=10, random_state=seed)

我們需要提供我們將構建的樹的數量。這裡我們將構建150棵樹,並且分割點從5個特徵中選擇:

num_trees = 50

接下來,使用以下指令碼構建模型:

model = GradientBoostingClassifier(n_estimators=num_trees, random_state=seed)

計算並列印結果,如下所示:

results = cross_val_score(model, X, Y, cv=kfold)
print(results.mean())

輸出

0.7746582365003418

上面的輸出顯示,我們得到了大約77.5%的梯度提升分類器整合模型的準確率。

投票整合演算法

如前所述,投票首先從訓練資料集中建立兩個或多個獨立模型,然後投票分類器將封裝模型,並在需要新資料時取子模型預測結果的平均值。

在下面的Python示例中,我們將使用sklearn的VotingClassifier類在Pima印第安人糖尿病資料集上構建投票整合模型。我們將邏輯迴歸、決策樹分類器和SVM的預測結果組合起來,用於解決分類問題,如下所示:

首先,匯入所需的包,如下所示:

from pandas import read_csv
from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score
from sklearn.linear_model import LogisticRegression
from sklearn.tree import DecisionTreeClassifier
from sklearn.svm import SVC
from sklearn.ensemble import VotingClassifier

現在,我們需要載入Pima糖尿病資料集,就像在之前的示例中做的那樣:

path = r"C:\pima-indians-diabetes.csv"
headernames = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
data = read_csv(path, names=headernames)
array = data.values
X = array[:,0:8]
Y = array[:,8]

接下來,為10折交叉驗證提供輸入,如下所示:

kfold = KFold(n_splits=10, random_state=7)

接下來,我們需要建立子模型,如下所示:

estimators = []
model1 = LogisticRegression()
estimators.append(('logistic', model1))
model2 = DecisionTreeClassifier()
estimators.append(('cart', model2))
model3 = SVC()
estimators.append(('svm', model3))

現在,透過組合上述建立的子模型的預測結果來建立投票整合模型。

ensemble = VotingClassifier(estimators)
results = cross_val_score(ensemble, X, Y, cv=kfold)
print(results.mean())

輸出

0.7382262474367738

上面的輸出顯示,我們得到了大約74%的投票分類器整合模型的準確率。

廣告

© . All rights reserved.