python+sklearn進行交叉驗證(使用交叉驗證對數據划分,模型評估和參數估計,使用決策樹舉例)


一、普及

首先普及一下數據評估方法都有哪些:

1.留出法

留出法是將數據集D划分為兩個互斥的集合,其中一個集合作為訓練集S,另一個作為測試集T,即D=S∪T,S∩T=空集,在S上訓練出模型后,用T來評估其測試誤差,作為對泛化誤差的估計。
在采樣的過程中,為了保證數據分布的一致性,比如在分類任務中保證類別比例的采樣方式叫做“分層采樣”。
另外單次的使用留出法得到的結果往往不夠穩定可靠,在使用留出法時,一般采用若干次隨機划分,重復進行實驗評估后取平均值作為留出法的評估結果。

2.自助法(bootstrapping)

以自助采樣為基礎(從自助采樣延申出的Bagging方法,繼而可以引出隨機森林的采樣方法,這里不做詳細講解)。
每次隨機從D中挑選一個樣本,將其拷貝放入D‘,然后再將該樣本放回初始數據集D中,使得樣本在下次采樣時仍然有可能被采集到,循環執行m遍,就得到了m個樣本的數據集D’,這就是自助采樣的結果。

3.交叉驗證法

通常把交叉驗證法叫做K折交叉驗證法,其先將數據集D划分為 k個大小相似的互斥子集,即D=D1∪D2∪…∪Dk,Di∩Dj=空集(i≠j),每個自己Di都盡可能保持數據分布的一致性,即從D中通過分層采樣得到。
比較常用的是10折交叉驗證法,示意圖如下:

交叉驗證法
(鼠標不好畫,看懂就好了😪)

總結:
自助法在數據集較小、難以有效划分訓練/測試集時很有用;此外,自助法能從初始數據集中產生多個不同的訓練集,這對集成學習(隨機森林用到)等方法有很大的好處。然而,自助法產生的數據集改變了初始數據集的分布,這會引入估計偏差。因此,在初始數據量足夠時,留出法和交叉驗證法更常用一些

二、使用交叉驗證法進行數據划分

提前說一下,這部分提到的函數其實在代碼中,只是將其實例化作為一個參數使用。

在這里終於要回歸題目,在sklearn中有很多交叉驗證的庫進行數據的划分,分別是:
KFold,GroupKFold,StratifiedKFold,LeaveOneGroupOut,LeavePGroupsOut,LeaveOneOut,LeavePOut,ShuffleSplit,GroupShuffleSplit,StratifiedShuffleSplit(train_test_split,個人理解這個方法和StratifiedShuffleSplit作用是相同的),PredefinedSplit,TimeSeriesSplit。

分類:

從原理上來分類:

  1. K折交叉驗證:KFold,GroupKFold,StratifiedKFold,RepeatedKFold
  2. 留一法(是k折交叉驗證的特列,如果數據有m個樣本,那么k當等於m,就是留一法,這樣划分之后每一個樣本都是一個獨立的數據集,這種方法雖然效果被認為很好,但是當數據量很多的時候,比如100萬個樣本,那么就要訓練100萬個模型,計算開銷很大,no free launch對於實驗評估方法仍然適用):LeaveOneGroupOut,LeavePGroupsOut,LeaveOneOut,LeavePOut
  3. 隨機划分法:ShuffleSplit,GroupShuffleSplit,StratifiedShuffleSplit

從應用上來分類

  1. 對於分類數據來說,它們的target可能分配是不均勻的,比如在醫療數據當中得癌症的人比不得癌症的人少很多,這個時候,使用的數據划分方法有 StratifiedKFold ,StratifiedShuffleSplit
  2. 對於分組數據來說,它的划分方法是不一樣的,主要的方法有 GroupKFold,LeaveOneGroupOut,LeavePGroupOut,GroupShuffleSplit
  3. 對於時間關聯的數據,方法有TimeSeriesSplit

在這里我具體說一下StratifiedShuffleSplit,后面實例會用到,其他可以到sklearn官網進行學習:

一共有四個參數
Parameters:
原文如下:

n_splitsint, default=10
	Number of re-shuffling & splitting iterations.

test_size, float or int, default=None
	If float, should be between 0.0 and 1.0 and represent the proportion of the dataset to include in the test split. If int, represents the absolute number of test samples. If None, the value is set to the complement of the train size. If train_size is also None, it will be set to 0.1.()

train_size, float or int, default=None
	If float, should be between 0.0 and 1.0 and represent the proportion of the dataset to include in the train split. If int, represents the absolute number of train samples. If None, the value is automatically set to the complement of the test size.

random_state, int or RandomState instance, default=None
	Controls the randomness of the training and testing indices produced. Pass an int for reproducible output across multiple function calls. See Glossary.

解釋:
n_splitsint, default=10(重新洗牌和拆分迭代次數,也就是默認會把原數據集D分成10組和進行10折交叉驗證)
test_size和train_size就是簡單的訓練和測試數據集的比例,整數代表具體數量,百分比代表占總數據集的多少比例
random_state 這個值在參數估計很重要,我們需要將其設置為一個大於0的整數,這樣對於在不同的參數估計中,可以保證每次k折划分的數據都是相同的;如果設置為0,那么每次進行交叉驗證進行數據划分結果是不相同的,這樣沒辦法保證參數評估的准確性)

舉例:

>>> import numpy as np
>>> from sklearn.model_selection import StratifiedShuffleSplit
>>> X = np.array([[1, 2], [3, 4], [1, 2], [3, 4], [1, 2], [3, 4]])
>>> y = np.array([0, 0, 0, 1, 1, 1])
>>> sss = StratifiedShuffleSplit(n_splits=5, test_size=0.5, random_state=0)
>>> sss.get_n_splits(X, y)
5
>>> print(sss)
StratifiedShuffleSplit(n_splits=5, random_state=0, ...)
>>> for train_index, test_index in sss.split(X, y):
...     print("TRAIN:", train_index, "TEST:", test_index)
...     X_train, X_test = X[train_index], X[test_index]
...     y_train, y_test = y[train_index], y[test_index]
TRAIN: [5 2 3] TEST: [4 1 0]
TRAIN: [5 1 4] TEST: [0 2 3]
TRAIN: [5 0 2] TEST: [4 3 1]
TRAIN: [4 1 0] TEST: [2 3 5]
TRAIN: [0 5 1] TEST: [3 4 2]

使用這個函數是為了保證每個分類樣本中每個類別的占比相同,避免出現某一個類別過多或者過少的情況,train_test_split作用也一樣

三、適用交叉驗證進行模型評估

列舉sklearn中三種模型評估方法:

  1. cross_val_score
  2. cross_validate
  3. cross_val_predict

這里舉例說一下cross_val_score函數:
原文:(有點多😥,可跳過看后面解釋)
Parameters:

estimator: estimator object implementing ‘fit’
	The object to use to fit the data.

X: array-like of shape (n_samples, n_features)
	The data to fit. Can be for example a list, or an array.

y: array-like of shape (n_samples,) or (n_samples, n_outputs), default=None
	The target variable to try to predict in the case of supervised learning.

groups: array-like of shape (n_samples,), default=None
	Group labels for the samples used while splitting the dataset into train/test set. Only used in conjunction with a “Group” cv instance (e.g., GroupKFold).

scoring: str or callable, default=None
	A str (see model evaluation documentation) or a scorer callable object / function with signature scorer(estimator, X, y) which should return only a single value.

	Similar to cross_validate but only a single metric is permitted.

	If None, the estimator’s default scorer (if available) is used.

cv: int, cross-validation generator or an iterable, default=None
	Determines the cross-validation splitting strategy. Possible inputs for cv are:

	None, to use the default 5-fold cross validation,

	int, to specify the number of folds in a (Stratified)KFold,

	CV splitter,

	An iterable yielding (train, test) splits as arrays of indices.

	For int/None inputs, if the estimator is a classifier and y is either binary or multiclass, StratifiedKFold is used. In all other cases, KFold is used.

	Refer User Guide for the various cross-validation strategies that can be used here.

	Changed in version 0.22: cv default value if None changed from 3-fold to 5-fold.

n_jobs: int, default=None
	The number of CPUs to use to do the computation. None means 1 unless in a joblib.parallel_backend context. -1 means using all processors. See Glossary for more details.

verbose: int, default=0
	The verbosity level.

fit_params: dict, default=None
	Parameters to pass to the fit method of the estimator.

pre_dispatch: int or str, default=’2*n_jobs’
	Controls the number of jobs that get dispatched during parallel execution. Reducing this number can be useful to avoid an explosion of memory consumption when more jobs get dispatched than CPUs can process. This parameter can be:

	None, in which case all the jobs are immediately created and spawned. Use this for lightweight and fast-running jobs, to avoid delays due to on-demand spawning of the jobs

	An int, giving the exact number of total jobs that are spawned

	A str, giving an expression as a function of n_jobs, as in ‘2*n_jobs’

error_score: ‘raise’ or numeric, default=np.nan
	Value to assign to the score if an error occurs in estimator fitting. If set to ‘raise’, the error is raised. If a numeric value is given, FitFailedWarning is raised. This parameter does not affect the refit step, which will always raise the error.

在這里!
對於這個函數cross_val_score,其實用到參數不多😂,大多是默認。
cross_val_score(clf, x, y, cv=cv),大概就是這四個參數,
第一個是機器算法,看要對什么算法進行模型評估,我用的是決策樹,后面有代碼樣例;
第二個參數和第三個參數就是訓練和測試數據的list
第四個參數最重要
確定交叉驗證拆分策略。cv的可能輸入包括:

  1. 無,要使用默認的5倍交叉驗證
  2. int,指定(分層)k文件夾中的折疊數
  3. CV分離器
  4. 一個可承受的屈服(訓練,測試)分裂成一系列的指數(翻譯的好像不對,但不影響后續使用)

對於int/None輸入,如果估計器是分類器且y是二進制或多類,則使用StratifiedKFold。在所有其他情況下,使用KFold。

最后,本人也是在摸着石頭過河,對於第二部分和第三部分本人不敢保證說的很全,或者說沒有瑕疵,如果有,歡迎大家評論區指正,這些是在大量查閱資料后總結的,算是綜合眾多大佬的智慧結晶,可查看最后一部分的參考文章進行加深閱讀理解。

或者直接看后續樣例代碼更容易理解

四、決策樹樣例

1.數據的簡單處理

data = np.genfromtxt(data, delimiter='\t')
    x = data[:, 1:]
    y = data[:, 0]
    x[:, 0], x[:, 1], x[:, 2], x[:, 3], x[:, 4], x[:, 5] = \
        x[:, 0] * 0.2, x[:, 1] * 0.2, x[:, 2] * 0.1, x[:, 3] * 0.1, x[:, 4] * 0.2, x[:, 5] * 0.2

主要為數據加了權重(對於決策樹不需要標准化)

2.參數分析

在進行參數分析時,就需要知道哪些參數重要,哪些參數不重要。而分類決策樹總共有12個參數可以自己調整,這么多參數一個個記起來太麻煩,我們可以把這些參數分成三個類別。

  1. 用於模型調參的參數:
    1)criterion(划分標准):有兩個參數 ‘entropy’(熵) 和 ‘gini’(基尼系數)可選,默認為gini。
    2)max_depth(樹的最大深度):默認為None,此時決策樹在建立子樹的時候不會限制子樹的深度。也可以設置具體的整數,一般來說,數據少或者特征少的時候可以不管這個值。如果模型樣本量多,特征也多的情況下,推薦限制這個最大深度,具體的取值取決於數據的分布。常用的可以取值10-100之間。
    3)min_samples_split(分割內部節點所需的最小樣本數):意思就是只要在某個結點里有k個以上的樣本,這個節點才需要繼續划分,這個參數的默認值為2,也就是說只要有2個以上的樣本被划分在一個節點,如果這兩個樣本還可以細分,這個節點就會繼續細分
    4)min_samples_leaf(葉子節點上的最小樣本數):當你划分給某個葉子節點的樣本少於設定的個數時,這個葉子節點會被剪枝,這樣可以去除一些明顯異常的噪聲數據。默認為1,也就是說只有有兩個樣本類別不一樣,就會繼續划分。如果是int,那么將min_samples_leaf視為最小數量。如果為float,則min_samples_leaf為分數,ceil(min _ samples _ leaf * n _ samples)為每個節點的最小樣本數。
  2. 用於不平衡樣本預處理參數:
    class_weight: 這個參數是用於樣本不均衡的情況下,給正負樣本設置不同權重的參數。默認為None,即不設置權重。具體原理和使用方法見:【機器學習超詳細實踐攻略(12):三板斧干掉樣本不均衡問題之2——通過正負樣本的懲罰權重解決樣本不均衡】
  3. 不重要的參數:
    這些參數一般無需自己手工設定,只需要知道具體的含義,在遇到特殊情況再有針對性地調節即可。
    1)‘max_features’:如果我們訓練集的特征數量太多,用這個參數可以限制生成決策樹的特征數量的,這個參數在隨機森林中有一定的作用,但是因為隨機抽取特征,這個算法有概率把數據集中很重要的特征篩選掉,所以就算特征太多,我寧願采用降維算法、或者計算特征重要度自己手工篩選也不會設置這個參數。
    2) ‘min_impurity_decrease’(節點划分最小不純度): 這是樹增長提前結束的閾值,如果某節點的不純度(基於基尼系數,均方差)小於這個閾值,則該節點不再生成子節點 。一般不推薦改動。
    3)‘max_leaf_nodes’(最大葉子節點數): 默認是"None”,即不限制最大的葉子節點數。如果加了限制,算法會建立一個在最大葉子節點數內最優的決策樹。限制這個值可以防止過擬合,如果特征不多,可以不考慮這個值,但是如果特征多的話,可以加以限制。
    4)‘random_state’(隨機數種子): 默認為None,這里隨便設置一個值,可以保證每次隨機抽取樣本的方式一樣。
    5)‘splitter’:用來控制決策樹中划分節點的隨機性,可選”best"和“random"兩個值,默認為“best”。當輸入”best",決策樹在分枝時雖然隨機,但是還是會優先選擇更重要的特征進行分枝,輸入“random",決策樹在分枝時會更加隨機,從而降低對訓練集的擬合成都。這也是防止過擬合的一種方式。當然,這種防止過擬合的方法屬於“傷敵一千自損八百”的方法,樹的隨機分枝會使得樹因為含有更多的不必要信息而更深更大,所以我們最好使用上邊的剪枝參數來防止過擬合,這個參數一般不用動。
    6)min_weight_fraction_leaf(葉子節點最小的樣本權重和):這個值限制了葉子節點所有樣本權重和的最小值,如果小於這個值,則會被剪枝。 默認是0,就是不考慮權重問題。一般來說,如果我們有較多樣本有缺失值,或者分類樹樣本的分布類別偏差很大,就會引入樣本權重,這時我們才會稍微注意一下這個值。
    7)‘ccp_alpha’(復雜性參數):這個參數同樣是是用於避免樹的過度擬合。在樹生成節點的過程中,加入一個懲罰因子(邏輯回歸里的懲罰項),避免生成的樹過於冗余,公式如下:
    公式
    其中T就是樹的總節點個數,α \alphaα 就是我們設置的參數,隨着樹節點的增多,最終損失函數就會變得更大。默認為0,即不加入懲罰項。

以上就是分類決策樹12個參數的介紹。

說完了分類決策樹,回歸決策樹就自然而然懂了,它和分類決策樹在參數上的區別只有兩個地方:
1) ‘criterion’: 評價划分節點質量的參數,類似於分類決策樹的熵,有三個參數可選,‘mse’(default)均方誤差;'friedman_mse’均方誤差近似,最小化L2 loss;'mae’平均絕對誤差,最小化L1 loss。
2)少了’class_weight’: None,當然,回歸問題也就不存在給每個類別加不同的權重了。

3.開始調參

在知道了哪些是重要的參數,那么就可以開始調參了,分別是:
1)確定criterion參數(決策樹划分標准):這里可以簡單比較一下。

2)通過繪制得分曲線縮小max_depth(樹的最大深度)的搜索范圍,得到一個暫定的max_depth。

之所以第一個參數調max_depth,是因為模型得分一般隨着max_depth單調遞增,之后會區域穩定。

3)利用暫定的max_depth參數,繪制曲線,觀察得分隨着min_samples_split(分割內部節點所需的最小樣本數)的變化規律,從而確定min_samples_split參數的大概范圍。

因為隨着min_samples_split的增大,模型會傾向於向着簡單的方向發展。所以如果模型過擬合,那么隨着min_samples_split的增大,模型得分會先升高后下降,我們選取得分最高點附近的min_samples_split參數;如果模型欠擬合,那么隨着min_samples_split的增大,模型得分會一直下降,接下來調參時只需要從默認值2開始取就好。

4)利用暫定的max_depth和min_samples_split參數,繪制曲線,觀察得分隨着min_samples_leaf(葉子節點上應有的最少樣例數)的變化規律,從而確定min_samples_leaf參數的大概范圍。該參數的范圍確定方法同上。

5)利用網格搜索,在一個小范圍內聯合調max_depth、min_samples_split和min_samples_leaf三個參數,確定最終的參數。

4.代碼分析

對《3.開始調參》中步驟一一填寫代碼

在這里特別強調一下random_state,一定要將其設置為一個大於0的整數,否則參數評估中每次數據都不相同,那就沒有評估的意義了!具體多少沒有要求

調用所需庫:

from sklearn import tree
from sklearn.model_selection import StratifiedShuffleSplit, GridSearchCV, cross_val_score
import matplotlib.pyplot as plt
import numpy as np

1)確定criterion參數(決策樹划分標准):這里可以簡單比較一下。

cv = StratifiedShuffleSplit(n_splits=10, test_size=0.1, random_state=42)
clf = tree.DecisionTreeClassifier(criterion='entropy', random_state=42)
score = cross_val_score(clf, x, y, cv=cv).mean()
print(score)
clf = tree.DecisionTreeClassifier(criterion='gini', random_state=42)
score = cross_val_score(clf, x, y, cv=cv).mean()
print(score)

0.764375
0.7543749999999999
有的說gini效果好一點,但我數據跑出來entropy效果更好一點

2)通過繪制得分曲線縮小max_depth(樹的最大深度)的搜索范圍,得到一個暫定的max_depth。

之所以第一個參數調max_depth,是因為模型得分一般隨着max_depth單調遞增,之后會區域穩定。

ScoreAll = []
cv = StratifiedShuffleSplit(n_splits=10, test_size=0.1, random_state=42)
for i in range(5, 100, 5):
    clf = tree.DecisionTreeClassifier(criterion='entropy', max_depth=i, random_state=42)
    score = cross_val_score(clf, x, y, cv=cv).mean()
    ScoreAll.append([i, score])
ScoreAll = np.array(ScoreAll)

max_score = np.where(ScoreAll == np.max(ScoreAll[:, 1]))[0][0]  # 找出最高得分對應的索引
print("最優參數以及最高得分:", ScoreAll[max_score])
plt.figure(figsize=[20, 5])
plt.plot(ScoreAll[:, 0], ScoreAll[:, 1])
plt.show()

輸出:

最優參數以及最高得分: 最優參數以及最高得分: [10.       0.78375]

max_depth

不要忘記,我們還需要在10左右進行具體的分析

ScoreAll = []
cv = StratifiedShuffleSplit(n_splits=10, test_size=0.1, random_state=42)
for i in range(5, 15):
    clf = tree.DecisionTreeClassifier(criterion='entropy', max_depth=i, random_state=42)
    score = cross_val_score(clf, x, y, cv=cv).mean()
    ScoreAll.append([i, score])
ScoreAll = np.array(ScoreAll)

max_score = np.where(ScoreAll == np.max(ScoreAll[:, 1]))[0][0]  # 找出最高得分對應的索引
print("最優參數以及最高得分:", ScoreAll[max_score])
plt.figure(figsize=[20, 5])
plt.plot(ScoreAll[:, 0], ScoreAll[:, 1])
plt.show()

輸出:

最優參數以及最高得分: [7.       0.791875]

1
我們暫定樹的高度為7,達到了0.791875
3)利用暫定的max_depth參數,繪制曲線,觀察得分隨着min_samples_split(分割內部節點所需的最小樣本數)的變化規律,從而確定min_samples_split參數的大概范圍。

ScoreAll = []
cv = StratifiedShuffleSplit(n_splits=10, test_size=0.1, random_state=42)
for i in range(5, 15):
    clf = tree.DecisionTreeClassifier(criterion='entropy', max_depth=9, min_samples_split=i, random_state=42)
    score = cross_val_score(clf, x, y, cv=cv).mean()
    ScoreAll.append([i, score])
ScoreAll = np.array(ScoreAll)

max_score = np.where(ScoreAll == np.max(ScoreAll[:, 1]))[0][0]  # 找出最高得分對應的索引
print("最優參數以及最高得分:", ScoreAll[max_score])
plt.figure(figsize=[20, 5])
plt.plot(ScoreAll[:, 0], ScoreAll[:, 1])
plt.show()

輸出:

最優參數以及最高得分: [5.      0.79375]

min_samples_split
確定min_samples_split為5

4)利用暫定的max_depth和min_samples_split參數,繪制曲線,觀察得分隨着min_samples_leaf(葉子節點上應有的最少樣例數)的變化規律,從而確定min_samples_leaf參數的大概范圍。該參數的范圍確定方法同上。

ScoreAll = []
cv = StratifiedShuffleSplit(n_splits=10, test_size=0.1, random_state=42)
for i in range(5, 15):
    clf = tree.DecisionTreeClassifier(criterion='entropy', min_samples_leaf=i, max_depth=7, min_samples_split=5, random_state=42)
    score = cross_val_score(clf, x, y, cv=cv).mean()
    ScoreAll.append([i, score])
ScoreAll = np.array(ScoreAll)

max_score = np.where(ScoreAll == np.max(ScoreAll[:, 1]))[0][0]  # 找出最高得分對應的索引
print("最優參數以及最高得分:", ScoreAll[max_score])
plt.figure(figsize=[20, 5])
plt.plot(ScoreAll[:, 0], ScoreAll[:, 1])
plt.show()

輸出:

最優參數以及最高得分: [2.    0.795]

min_samples_leaf
5)利用網格搜索,在一個小范圍內聯合調max_depth、min_samples_split和min_samples_leaf三個參數,確定最終的參數。

cv = StratifiedShuffleSplit(n_splits=10, test_size=0.1, random_state=42)
param_grid = {
    'max_depth': np.arange(2, 10),
    'min_samples_leaf': np.arange(1, 8),
    'min_samples_split': np.arange(2, 10)}

clf = tree.DecisionTreeClassifier(criterion='entropy', random_state=42)
GS = GridSearchCV(clf, param_grid, cv=cv)
GS.fit(x, y)
print(GS.best_params_)
print(GS.best_score_)

輸出:

{'max_depth': 9, 'min_samples_leaf': 7, 'min_samples_split': 2}
0.796875

可以看到,最終模型提高到了0.796875。這里我們可以看到,上述三個參數和我們前邊所暫定的參數都不一樣。證明三者之間確實是相互影響的!
GridSearchCV():窮盡的網格搜索
RandomizedSearchCV():隨機參數的優化
我這里使用了網格搜索,想嘗試的可以試試RandomizedSearchCV()

五、參考文章

  1. https://www.cnblogs.com/nolonely/p/7007432.html
  2. https://blog.csdn.net/qq_30815237/article/details/87904205
  3. https://www.cnblogs.com/jiaxin359/p/8552800.html#_label3_5
  4. https://blog.csdn.net/u013044310/article/details/103996047
  5. https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.StratifiedShuffleSplit.html?highlight=stratifiedshufflesplit#sklearn.model_selection.StratifiedShuffleSplit
  6. 周志華的《機器學習》,俗稱的🍉書
  7. https://blog.csdn.net/robin_pi/article/details/103971343(強推,巨詳細)

六、總結

  • 最后的最后,再多說幾句,整篇文章,其實概括就是
    1.選數據划分算法,我是使用了交叉驗證中的一個算法
    2.對某個機器學習算法中影響較大的參數進行參數估計和模型評估,通過不同的參數選擇,使用交叉驗證進行模型評估,從而選出最優的參數
  • 數據和特征決定了機器學習的上限,而模型和算法只是逼近這個上限而已,與其找出最優的模型和算法,不如對數據和特征進行嚴格的處理,我這里的決策時模型,最終達到了0.796875的精度,沒能拿下0.8的高分😥,這和我數據的提取有關系;當然提升模型和算法也是一種思路,說不定決策樹的上限就那了,換個模型和算法又會有更好的表現,說不定我的數據上限更高呢😏,哈哈哈哈哈,這就是后話了,還得進行稍后的實驗證明才可以。
  • 調參的目標(以隨機森林為例):
      調參的目標就是為了達到整體模型的偏差和方差的大和諧!進一步,這些參數又可分為兩類:過程影響類及子模型影響類。在子模型不變的前提下,某些參數可以通過改變訓練的過程,從而影響模型的性能,諸如:“子模型數”(n_estimators)、“學習率”(learning_rate)等。另外,我們還可以通過改變子模型性能來影響整體模型的性能,諸如:“最大樹深度”(max_depth)、“分裂條件”(criterion)等。正由於bagging的訓練過程旨在降低方差,而boosting的訓練過程旨在降低偏差,過程影響類的參數能夠引起整體模型性能的大幅度變化。一般來說,在此前提下,我們繼續微調子模型影響類的參數,從而進一步提高模型的性能。
      疑問:
      那么從這段話可以分析:隨機森林基於bagging方法做了小改動,AdaBoost基於boosting方法,而隨機森林和AdaBoost都算是集成類算法,都是在決策樹為基學習器,一個降低偏差,一個減低方差,而且隨機森林會降低決策樹過擬合的風險,那么是否可以認為這兩個方法都會比決策樹有更好的訓練結果呢?日后解決。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM