<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                # 通過提前停止(early stopping)避免Python中應用XGBoost時發生得過擬合(overfitting)現象 > 原文: [https://machinelearningmastery.com/avoid-overfitting-by-early-stopping-with-xgboost-in-python/](https://machinelearningmastery.com/avoid-overfitting-by-early-stopping-with-xgboost-in-python/) 過擬合是非線性學習算法(例如梯度提升)中常見的一個復雜問題。 在這篇文章中,您將了解如何通過提前停止(early stopping)來抑制在Python中應用XGBoost時的過擬合現象。 閱讀這篇文章,您會學習到: * 提前停止(early stopping)是減少訓練數據過擬合的一種方法。 * 如何在訓練期間監測XGBoost模型的表現并繪制學習曲線。 * 如何使用提前停止(early stopping)來適時及早終止訓練處于最佳epoch中的XGBoost模型。 請在我的[新書](https://machinelearningmastery.com/xgboost-with-python/)中找到如何通過XGBoost配置、訓練、調試和評估梯度提升模型,其中包括了15個手把手(Step-by-Step)的示例課程以及完整的Python代碼。 讓我們開始吧。 * **2017年1月更新**:此次更新為對應scikit-learn API版本0.18.1中的更改。 * **2018年3月更新**:為下載數據集添加了備用鏈接,舊鏈接已被移除。 ![Avoid Overfitting By Early Stopping With XGBoost In Python](https://img.kancloud.cn/2d/1a/2d1a2b5998686d3d4d480cde50da9681_640x424.jpg) 通過提前停止(early stopping)避免Python中應用XGBoost時發生得過擬合(overfitting)現象 照片由[Michael Hamann](https://www.flickr.com/photos/michitux/7218180540/)拍攝,保留部分版權。 ## 通過提前停止(early stopping)避免過擬合 [提前停止(early stopping)](https://en.wikipedia.org/wiki/Early_stopping)是一種訓練復雜機器學習模型時避免過擬合的方法。 它通過監測在單獨的測試數據集上訓練模型的表現,并且觀察到一旦在固定數量的訓練迭代之后測試數據集上的表現沒有得到改善,就會停止訓練過程。 通過嘗試自動選出測試數據集上的表現開始降低而訓練數據集上的表現繼續提高這樣的過擬合發生跡象拐點來避免過擬合。 表現度量可以是通過訓練模型而進行優化的損失函數(例如對數損失函數(logarithmic loss)),或者通常情況下問題所關注的外部指標(例如分類精度)。 ## 在XGBoost中監測訓練表現 XGBoost模型可以在訓練期間評估和報告模型在測試集上的表現。 它通過在訓練模型和獲取verbose output中調用 **model.fit()**的同時指定測試數據集以及評估度量(evaluation metric)來支持此功能。 例如,我們可以在訓練XGBoost模型時,在獨立測試集( **eval_set** )上報告二值分類誤差("error"),如下所示: ```py eval_set = [(X_test, y_test)] model.fit(X_train, y_train, eval_metric="error", eval_set=eval_set, verbose=True) ``` XGBoost所支持的評估度量(evaluation metric)集合包括但不僅限于: * “rmse”表示均方根誤差。 * “mae”表示平均絕對誤差。 * “logloss”表示二值對數損失,“mlogloss”表示多類對數損失(交叉熵)。 * “error”表示分類誤差。 * “auc”表示ROC 曲線下的面積。 完整列表請參照XGBoost參數網頁“[學習任務參數(Learning Task Parameters)](http://xgboost.readthedocs.io/en/latest//parameter.html)”。 例如,我們可以展示如何追蹤XGBoost模型訓練的表現,應用對象是[Pima印第安人糖尿病數據集(Pima Indians onset of diabetes dataset)](https://archive.ics.uci.edu/ml/datasets/Pima+Indians+Diabetes),可以從UCI機器學習庫(UCI Machine Learning Repository)獲取下載(更新:[從此處下載](https://raw.githubusercontent.com/jbrownlee/Datasets/master/pima-indians-diabetes.data.csv))。 完整示例代碼如下: ```py # monitor training performance from numpy import loadtxt from xgboost import XGBClassifier from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score # load data dataset = loadtxt('pima-indians-diabetes.csv', delimiter=",") # split data into X and y X = dataset[:,0:8] Y = dataset[:,8] # split data into train and test sets X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=0.33, random_state=7) # fit model no training data model = XGBClassifier() eval_set = [(X_test, y_test)] model.fit(X_train, y_train, eval_metric="error", eval_set=eval_set, verbose=True) # make predictions for test data y_pred = model.predict(X_test) predictions = [round(value) for value in y_pred] # evaluate predictions accuracy = accuracy_score(y_test, predictions) print("Accuracy: %.2f%%" % (accuracy * 100.0)) ``` 運行這個例子將會在67%的數據上訓練模型,并在剩余33%的測試數據集上,于每一個訓練epoch評估一次模型。 每一次迭代的結果都將會報告分類誤差,而分類精度將會在最后給出。 下面展示了結果輸出,為簡潔明了,只截取末尾部分。我們可以看到每次訓練迭代都會報告分類誤差(在每個boosted tree被添加到模型之后)。 ```py ... [89] validation_0-error:0.204724 [90] validation_0-error:0.208661 [91] validation_0-error:0.208661 [92] validation_0-error:0.208661 [93] validation_0-error:0.208661 [94] validation_0-error:0.208661 [95] validation_0-error:0.212598 [96] validation_0-error:0.204724 [97] validation_0-error:0.212598 [98] validation_0-error:0.216535 [99] validation_0-error:0.220472 Accuracy: 77.95% ``` 回顧所有輸出,我們可以看到在測試集上模型表現平穩,不過在訓練即將結束時表現有些下降。 ## 通過學習曲線評估XGBoost模型 我們可以在評估數據集上檢視模型的表現,并通過繪制圖像以更深入地展開了解訓練中是如何學習的。 在訓練XGBoost模型時,我們為**eval_metric**參數提供了一對X和y數組。除了測試集,我們也可以一并提供訓練數據集。它將說明模型在訓練期間在訓練集和測試集上分別表現的情況。 例如: ```py eval_set = [(X_train, y_train), (X_test, y_test)] model.fit(X_train, y_train, eval_metric="error", eval_set=eval_set, verbose=True) ``` 此外,通過調用 **model.evals_result()**函數,在每個評估集上訓練的模型都可以存儲并再度可用。這將返回評估數據集和評分的dictionary,例如: ```py results = model.evals_result() print(results) ``` 這將print如下結果(為簡潔明了,只截取部分作說明): ```py { 'validation_0': {'error': [0.259843, 0.26378, 0.26378, ...]}, 'validation_1': {'error': [0.22179, 0.202335, 0.196498, ...]} } ``` 'validation_0'和'validation_1'對應于在**fit()**調用中向 **eval_set** 參數提供數據集的順序。 若需要訪問特定的結果數組,例如針對第一個數據集和其誤差指標,可以操作如下: ```py results['validation_0']['error'] ``` 此外,我們可以通過向**fit()**函數的eval_metric參數提供度量數組,來指定更多的評估度量(evaluation metric)用于評價和匯總。 我們可以使用這些匯總的表現度量來創建曲線圖,并進一步解讀模型在訓練epochs過程中分別在訓練數據集和測試數據集上的表現。 下面是完整的代碼示例,顯示了如何在曲線圖上可視化匯總的結果。 ```py # plot learning curve from numpy import loadtxt from xgboost import XGBClassifier from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score from matplotlib import pyplot # load data dataset = loadtxt('pima-indians-diabetes.csv', delimiter=",") # split data into X and y X = dataset[:,0:8] Y = dataset[:,8] # split data into train and test sets X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=0.33, random_state=7) # fit model no training data model = XGBClassifier() eval_set = [(X_train, y_train), (X_test, y_test)] model.fit(X_train, y_train, eval_metric=["error", "logloss"], eval_set=eval_set, verbose=True) # make predictions for test data y_pred = model.predict(X_test) predictions = [round(value) for value in y_pred] # evaluate predictions accuracy = accuracy_score(y_test, predictions) print("Accuracy: %.2f%%" % (accuracy * 100.0)) # retrieve performance metrics results = model.evals_result() epochs = len(results['validation_0']['error']) x_axis = range(0, epochs) # plot log loss fig, ax = pyplot.subplots() ax.plot(x_axis, results['validation_0']['logloss'], label='Train') ax.plot(x_axis, results['validation_1']['logloss'], label='Test') ax.legend() pyplot.ylabel('Log Loss') pyplot.title('XGBoost Log Loss') pyplot.show() # plot classification error fig, ax = pyplot.subplots() ax.plot(x_axis, results['validation_0']['error'], label='Train') ax.plot(x_axis, results['validation_1']['error'], label='Test') ax.legend() pyplot.ylabel('Classification Error') pyplot.title('XGBoost Classification Error') pyplot.show() ``` 運行這段代碼會顯示每個epoch中訓練數據集和測試數據集的分類誤差。我們可以通過在 **fit()**函數的調用中設置 **verbose = False** (默認值)來關閉這個功能。 我們看到結果創建了兩張圖。第一張圖顯示了訓練數據集和測試數據集每個epoch中XGBoost模型的對數損失(logarithmic loss)。 ![XGBoost Learning Curve Log Loss](https://img.kancloud.cn/94/59/945905b5b18d9265b7908951b9a99d0c_800x600.jpg) XGBoost學習曲線(對數損失(log loss)) 第二張圖顯示了訓練數據集和測試數據集每個epoch中XGBoost模型的分類誤差(classification error)。 ![XGBoost Learning Curve Classification Error](https://img.kancloud.cn/25/eb/25eb469f94e690cad9d7b322dfb3afaf_800x600.jpg) XGBoost學習曲線(分類誤差(classification error)) 通過回顧logloss的圖像,我們看起來是有提前停止學習過程的機會,也許在epoch 20到epoch 40之間的某個階段。 在分類誤差的圖像中,我們也觀察到了類似的情況,誤差似乎在epoch 40左右出現上升。 ## 在XGBoost中使用提前停止(early stopping) XGBoost可以支持在固定次數的迭代后提前停止(early stopping)。 除了為每個epoch指定用于評估的度量和測試數據集之外,還必須指定一個epoch窗長,它代表沒有觀察到任何改善的epoch數目。它可以在**early_stopping_rounds**參數中實現。 例如,我們可以在10個epoch中檢查對數損失沒有得到改善,代碼如下: ```py eval_set = [(X_test, y_test)] model.fit(X_train, y_train, early_stopping_rounds=10, eval_metric="logloss", eval_set=eval_set, verbose=True) ``` 如果提供了多個評估數據集或多個評估度量(evaluation metric),則提前停止(early stopping)將使用列表中的最后一個。 下面展示提前停止(early stopping)的一個完整示例。 ```py # early stopping from numpy import loadtxt from xgboost import XGBClassifier from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score # load data dataset = loadtxt('pima-indians-diabetes.csv', delimiter=",") # split data into X and y X = dataset[:,0:8] Y = dataset[:,8] # split data into train and test sets seed = 7 test_size = 0.33 X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=test_size, random_state=seed) # fit model no training data model = XGBClassifier() eval_set = [(X_test, y_test)] model.fit(X_train, y_train, early_stopping_rounds=10, eval_metric="logloss", eval_set=eval_set, verbose=True) # make predictions for test data y_pred = model.predict(X_test) predictions = [round(value) for value in y_pred] # evaluate predictions accuracy = accuracy_score(y_test, predictions) print("Accuracy: %.2f%%" % (accuracy * 100.0)) ``` 運行示例代碼將給出如下輸出(為簡潔明了,只截取部分作說明): ```py ... [35] validation_0-logloss:0.487962 [36] validation_0-logloss:0.488218 [37] validation_0-logloss:0.489582 [38] validation_0-logloss:0.489334 [39] validation_0-logloss:0.490969 [40] validation_0-logloss:0.48978 [41] validation_0-logloss:0.490704 [42] validation_0-logloss:0.492369 Stopping. Best iteration: [32] validation_0-logloss:0.487297 ``` 我們可以看到模型在epoch 42停止訓練(接近我們對學習曲線人為判斷的預期),并且在epoch 32觀察到具有最佳損失結果的模型。 通常情況下,選擇 **early_stopping_rounds** 作為訓練epoch總數(在這種情況下為 10%)是個不錯的主意,或者嘗試找到可能觀察到的學習曲線拐點時期。 ## 總結 在這篇文章中,您了解到了如何監測性能表現和提前停止(early stopping)。 所學到的要點是: * 提前停止(early stopping)技術能夠在訓練數據集發生過擬合之前就停止模型訓練。 * 如何在訓練期間監測XGBoost模型的表現并繪制學習曲線。 * 如何在訓練XGBoost模型中配置提前停止(early stopping)。 您對過擬合或這篇文章有任何疑問嗎?請在評論中提出您的問題,我將會盡力回答。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看