機器學習 - 提升模型效能



Boosting 是一種流行的整合學習技術,它結合多個弱學習器來建立一個強學習器。它的工作原理是迭代地訓練弱學習器在資料的子集上,併為誤分類的樣本分配更高的權重,以增加它們在後續迭代中的重要性。這個過程會重複進行,直到達到所需的效能水平。

以下是一些提升機器學習中模型效能的技術:

  • 特徵工程 - 特徵工程包括從現有特徵建立新特徵或轉換現有特徵以使其對模型更有資訊量。這可能包括諸如獨熱編碼、縮放、歸一化和特徵選擇等技術。

  • 超引數調整 - 超引數是在訓練過程中未學習但由資料科學家設定的引數。它們控制模型的行為,調整它們可以顯著影響模型效能。網格搜尋和隨機搜尋是超引數調整的常用技術。

  • 整合學習 - 整合學習包括組合多個模型以提高效能。諸如 Bagging、Boosting 和 Stacking 等技術可用於建立整合。隨機森林是 Bagging 整合的示例,而梯度提升機 (GBM) 是 Boosting 整合的示例。

  • 正則化 - 正則化是一種透過向損失函式新增懲罰項來防止過擬合的技術。L1 正則化 (Lasso) 和 L2 正則化 (Ridge) 是線性模型中常用的技術,而 dropout 是神經網路中使用的一種技術。

  • 資料增強 - 資料增強包括透過應用旋轉、縮放和翻轉等變換從現有資料生成新資料。這有助於減少過擬合併提高模型效能。

  • 模型架構 - 模型的架構會顯著影響其效能。諸如深度學習和卷積神經網路 (CNN) 等技術可用於建立更復雜的模型,這些模型能夠更好地學習資料中的複雜模式。

  • 提前停止 - 提前停止是一種透過在模型效能停止在驗證集上改進時停止訓練過程來防止過擬合的技術。這可以防止模型繼續學習資料中的噪聲,並有助於提高泛化能力。

  • 交叉驗證 - 交叉驗證是一種用於評估模型在資料的多個子集上的效能的技術。這有助於識別過擬合,並可用於選擇模型的最佳超引數。

這些技術可以使用 scikit-learn、TensorFlow 和 Keras 等各種機器學習庫在 Python 中實現。透過使用這些技術,資料科學家可以提高其模型的效能並建立更準確的預測。

以下示例演示瞭如何使用 Scikit-learn 實現交叉驗證:

示例

from sklearn.datasets import load_iris
from sklearn.model_selection import cross_val_score
from sklearn.ensemble import GradientBoostingClassifier

# Load the iris dataset
iris = load_iris()
X = iris.data
y = iris.target

# Create a Gradient Boosting Classifier
gb_clf = GradientBoostingClassifier()

# Perform 5-fold cross-validation on the classifier
scores = cross_val_score(gb_clf, X, y, cv=5)

# Print the average accuracy and standard deviation of the cross-validation scores
print("Accuracy: %0.2f (+/- %0.2f)" % (scores.mean(), scores.std() * 2))

輸出

執行此程式碼後,將產生以下輸出:

Accuracy: 0.96 (+/- 0.07)

整合帶來的效能提升

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

順序整合方法

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

並行整合方法

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

整合學習方法

以下是最流行的整合學習方法,即組合來自不同模型的預測的方法:

Bagging

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

Boosting

在 Boosting 方法中,構建整合模型的主要原則是透過順序訓練每個基模型估計器來增量地構建它。顧名思義,它基本上結合了多個弱基學習器,這些學習器在訓練資料的多次迭代中順序訓練,以構建強大的整合。在弱基學習器的訓練過程中,會為之前被誤分類的學習器分配更高的權重。Boosting 方法的示例是 AdaBoost。

投票

在這個整合學習模型中,構建多個不同型別的模型,並使用一些簡單的統計資料(例如計算平均值或中位數等)來組合預測。此預測將作為訓練的附加輸入以進行最終預測。

Bagging 整合演算法

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

Bagged 決策樹

眾所周知,Bagging 整合方法適用於具有高方差的演算法,而在這方面,最好的演算法是決策樹演算法。在下面的 Python 示例中,我們將使用 sklearn 的 BaggingClassifier 函式和 DecisionTreeClassifier(一種分類和迴歸樹演算法)在 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

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

隨機森林

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

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

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

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

上面的輸出顯示我們的Bagging隨機森林分類器模型的準確率約為76%。

Extra Trees (極端隨機樹)

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

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

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

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

上面的輸出顯示我們的Bagging Extra Trees分類器模型的準確率約為75.5%。

Boosting整合演算法

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

AdaBoost

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

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

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

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

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

隨機梯度提升 (Stochastic Gradient Boosting)

它也稱為梯度提升機 (Gradient Boosting Machines)。在下面的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.