<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>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                # 在 Python 中使用 XGBoost 進行梯度提升的數據準備 > 原文: [https://machinelearningmastery.com/data-preparation-gradient-boosting-xgboost-python/](https://machinelearningmastery.com/data-preparation-gradient-boosting-xgboost-python/) XGBoost 因其速度和表現而成為 Gradient Boosting 的流行實現。 在內部,XGBoost 模型將所有問題表示為回歸預測建模問題,僅將數值作為輸入。如果您的數據格式不同,則必須將其準備為預期格式。 在這篇文章中,您將了解如何準備數據,以便在 Python 中使用 XGBoost 庫進行梯度提升。 閱讀這篇文章后你會知道: * 如何編碼字符串輸出變量進行分類。 * 如何使用一個熱編碼準備分類輸入變量。 * 如何使用 XGBoost 自動處理丟失的數據。 讓我們開始吧。 * **2016 年 9 月更新**:我在 impute 示例中更新了一些小錯字。 * **2017 年 1 月更新**:已更新,以反映 scikit-learn API 版本 0.18.1 中的更改??。 * **2017 年 1 月更新**:更新了將輸入數據轉換為字符串的乳腺癌示例。 ![Data Preparation for Gradient Boosting with XGBoost in Python](https://img.kancloud.cn/50/67/50671ed93cb0b4f39103b7b30de351fd_640x427.jpg) 使用 Python 中的 XGBoost 進行梯度提升的數據準備 照片由 [Ed Dunens](https://www.flickr.com/photos/blachswan/14990404869/) 拍攝,保留一些權利。 ## 標簽編碼字符串類值 虹膜花分類問題是具有字符串類值的問題的示例。 這是一個預測問題,其中以厘米為單位給出鳶尾花的測量值,任務是預測給定花屬于哪個物種。 下面是原始數據集的示例。您可以從 [UCI 機器學習庫](http://archive.ics.uci.edu/ml/datasets/Iris)中了解有關此數據集的更多信息并以 CSV 格式下載原始數據。 ```py 5.1,3.5,1.4,0.2,Iris-setosa 4.9,3.0,1.4,0.2,Iris-setosa 4.7,3.2,1.3,0.2,Iris-setosa 4.6,3.1,1.5,0.2,Iris-setosa 5.0,3.6,1.4,0.2,Iris-setosa ``` XGBoost 無法按原樣對此問題進行建模,因為它要求輸出變量為數字。 我們可以使用 [LabelEncoder](http://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.LabelEncoder.html) 輕松地將字符串值轉換為整數值。三個類值(Iris-setosa,Iris-versicolor,Iris-virginica)被映射到整數值(0,1,2)。 ```py # encode string class values as integers label_encoder = LabelEncoder() label_encoder = label_encoder.fit(Y) label_encoded_y = label_encoder.transform(Y) ``` 我們將標簽編碼器保存為單獨的對象,以便我們可以使用相同的編碼方案轉換訓練以及稍后的測試和驗證數據集。 下面是一個演示如何加載虹膜數據集的完整示例。請注意,Pandas 用于加載數據以處理字符串類值。 ```py # multiclass classification import pandas import xgboost from sklearn import model_selection from sklearn.metrics import accuracy_score from sklearn.preprocessing import LabelEncoder # load data data = pandas.read_csv('iris.csv', header=None) dataset = data.values # split data into X and y X = dataset[:,0:4] Y = dataset[:,4] # encode string class values as integers label_encoder = LabelEncoder() label_encoder = label_encoder.fit(Y) label_encoded_y = label_encoder.transform(Y) seed = 7 test_size = 0.33 X_train, X_test, y_train, y_test = cross_validation.train_test_split(X, label_encoded_y, test_size=test_size, random_state=seed) # fit model no training data model = xgboost.XGBClassifier() model.fit(X_train, y_train) print(model) # 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 XGBClassifier(base_score=0.5, colsample_bylevel=1, colsample_bytree=1, gamma=0, learning_rate=0.1, max_delta_step=0, max_depth=3, min_child_weight=1, missing=None, n_estimators=100, nthread=-1, objective='multi:softprob', reg_alpha=0, reg_lambda=1, scale_pos_weight=1, seed=0, silent=True, subsample=1) Accuracy: 92.00% ``` 請注意 XGBoost 模型如何配置為使用 **multi:softprob** 目標自動建模多類分類問題,該目標是 softmax loss 函數的一種變體,用于模擬類概率。這表明在內部,輸出類自動轉換為一種熱類型編碼。 ## 一個熱編碼分類數據 一些數據集僅包含分類數據,例如乳腺癌數據集。 該數據集描述了乳腺癌活組織檢查的技術細節,預測任務是預測患者是否復發癌癥。 下面是原始數據集的示例。您可以在 [UCI 機器學習庫](http://archive.ics.uci.edu/ml/datasets/Breast+Cancer)中了解有關此數據集的更多信息,并從 [mldata.org](http://mldata.org/repository/data/viewslug/datasets-uci-breast-cancer/) 以 CSV 格式下載。 ```py '40-49','premeno','15-19','0-2','yes','3','right','left_up','no','recurrence-events' '50-59','ge40','15-19','0-2','no','1','right','central','no','no-recurrence-events' '50-59','ge40','35-39','0-2','no','2','left','left_low','no','recurrence-events' '40-49','premeno','35-39','0-2','yes','3','right','left_low','yes','no-recurrence-events' '40-49','premeno','30-34','3-5','yes','2','left','right_up','no','recurrence-events' ``` 我們可以看到所有 9 個輸入變量都是分類的,并以字符串格式描述。問題是二進制分類預測問題,輸出類值也以字符串格式描述。 我們可以重用上一節中的相同方法,并將字符串類值轉換為整數值,以使用 LabelEncoder 對預測進行建模。例如: ```py # encode string class values as integers label_encoder = LabelEncoder() label_encoder = label_encoder.fit(Y) label_encoded_y = label_encoder.transform(Y) ``` 我們可以在 X 中的每個輸入要素上使用相同的方法,但這只是一個起點。 ```py # encode string input values as integers features = [] for i in range(0, X.shape[1]): label_encoder = LabelEncoder() feature = label_encoder.fit_transform(X[:,i]) features.append(feature) encoded_x = numpy.array(features) encoded_x = encoded_x.reshape(X.shape[0], X.shape[1]) ``` XGBoost 可以假設每個輸入變量的編碼整數值具有序數關系。例如,對于 breast-quad 變量,“left-up”編碼為 0 并且“left-low”編碼為 1 具有作為整數的有意義的關系。在這種情況下,這種假設是不真實的。 相反,我們必須將這些整數值映射到新的二進制變量,每個分類值都有一個新變量。 例如,breast-quad 變量具有以下值: ```py left-up left-low right-up right-low central ``` 我們可以將其建模為 5 個二進制變量,如下所示: ```py left-up, left-low, right-up, right-low, central 1,0,0,0,0 0,1,0,0,0 0,0,1,0,0 0,0,0,1,0 0,0,0,0,1 ``` 這稱為[一個熱編碼](https://en.wikipedia.org/wiki/One-hot)。我們可以使用 scikit-learn 中的 [OneHotEncoder](http://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.OneHotEncoder.html) 類對所有分類輸入變量進行熱編碼。 在我們對其進行標簽編碼后,我們可以對每個功能進行熱編碼。首先,我們必須將要素數組轉換為 2 維 NumPy 數組,其中每個整數值是長度為 1 的要素向量。 ```py feature = feature.reshape(X.shape[0], 1) ``` 然后我們可以創建 OneHotEncoder 并對特征數組進行編碼。 ```py onehot_encoder = OneHotEncoder(sparse=False) feature = onehot_encoder.fit_transform(feature) ``` 最后,我們可以通過逐個連接一個熱編碼特征來建立輸入數據集,將它們作為新列添加(軸= 2)。我們最終得到一個由 43 個二進制輸入變量組成的輸入向量。 ```py # encode string input values as integers encoded_x = None for i in range(0, X.shape[1]): label_encoder = LabelEncoder() feature = label_encoder.fit_transform(X[:,i]) feature = feature.reshape(X.shape[0], 1) onehot_encoder = OneHotEncoder(sparse=False) feature = onehot_encoder.fit_transform(feature) if encoded_x is None: encoded_x = feature else: encoded_x = numpy.concatenate((encoded_x, feature), axis=1) print("X shape: : ", encoded_x.shape) ``` 理想情況下,我們可以嘗試不使用一個熱編碼輸入屬性,因為我們可以使用顯式序數關系對它們進行編碼,例如第一個列的年齡值為'40 -49'和'50 -59'。如果您有興趣擴展此示例,則將其留作練習。 下面是帶有標簽和一個熱編碼輸入變量和標簽編碼輸出變量的完整示例。 ```py # binary classification, breast cancer dataset, label and one hot encoded import numpy from pandas import read_csv from xgboost import XGBClassifier from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score from sklearn.preprocessing import LabelEncoder from sklearn.preprocessing import OneHotEncoder # load data data = read_csv('datasets-uci-breast-cancer.csv', header=None) dataset = data.values # split data into X and y X = dataset[:,0:9] X = X.astype(str) Y = dataset[:,9] # encode string input values as integers encoded_x = None for i in range(0, X.shape[1]): label_encoder = LabelEncoder() feature = label_encoder.fit_transform(X[:,i]) feature = feature.reshape(X.shape[0], 1) onehot_encoder = OneHotEncoder(sparse=False) feature = onehot_encoder.fit_transform(feature) if encoded_x is None: encoded_x = feature else: encoded_x = numpy.concatenate((encoded_x, feature), axis=1) print("X shape: : ", encoded_x.shape) # encode string class values as integers label_encoder = LabelEncoder() label_encoder = label_encoder.fit(Y) label_encoded_y = label_encoder.transform(Y) # split data into train and test sets seed = 7 test_size = 0.33 X_train, X_test, y_train, y_test = train_test_split(encoded_x, label_encoded_y, test_size=test_size, random_state=seed) # fit model no training data model = XGBClassifier() model.fit(X_train, y_train) print(model) # 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 ('X shape: : ', (285, 43)) XGBClassifier(base_score=0.5, colsample_bylevel=1, colsample_bytree=1, gamma=0, learning_rate=0.1, max_delta_step=0, max_depth=3, min_child_weight=1, missing=None, n_estimators=100, nthread=-1, objective='binary:logistic', reg_alpha=0, reg_lambda=1, scale_pos_weight=1, seed=0, silent=True, subsample=1) Accuracy: 71.58% ``` 我們再次看到 XGBoost 框架自動選擇' **binary:logistic** '目標,這是二進制分類問題的正確目標。 ## 支持缺失數據 XGBoost 可以自動學習如何最好地處理丟失的數據。 事實上,XGBoost 被設計為處理稀疏數據,如前一節中的一個熱編碼數據,并且通過最小化損失函數來處理丟失數據的方式與處理稀疏或零值的方式相同。 有關如何在 XGBoost 中處理缺失值的技術細節的更多信息,請參見文章 [XGBoost:可伸縮樹升壓系統](https://arxiv.org/abs/1603.02754)中的第 3.4 節“_ 稀疏感知拆分查找 _”。 Horse Colic 數據集是演示此功能的一個很好的示例,因為它包含大部分缺失數據,大約 30%。 您可以了解有關 Horse Colic 數據集的更多信息,并從 [UCI 機器學習庫](https://archive.ics.uci.edu/ml/datasets/Horse+Colic)下載原始數據文件。 這些值由空格分隔,我們可以使用 Pandas 函數 [read_csv](http://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_csv.html) 輕松加載它。 ```py dataframe = read_csv("horse-colic.csv", delim_whitespace=True, header=None) ``` 加載后,我們可以看到缺少的數據標有問號字符('?')。我們可以將這些缺失值更改為 XGBoost 預期的稀疏值,即值零(0)。 ```py # set missing values to 0 X[X == '?'] = 0 ``` 由于缺少的數據被標記為字符串,因此缺少數據的那些列都作為字符串數據類型加載。我們現在可以將整個輸入數據集轉換為數值。 ```py # convert to numeric X = X.astype('float32') ``` 最后,這是一個二元分類問題,盡管類值用整數 1 和 2 標記。我們將 XGBoost 中的二進制分類問題建模為邏輯 0 和 1 值。我們可以使用 LabelEncoder 輕松地將 Y 數據集轉換為 0 和 1 整數,就像我們在虹膜花示例中所做的那樣。 ```py # encode Y class values as integers label_encoder = LabelEncoder() label_encoder = label_encoder.fit(Y) label_encoded_y = label_encoder.transform(Y) ``` 完整性代碼清單如下所示。 ```py # binary classification, missing data from pandas import read_csv from xgboost import XGBClassifier from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score from sklearn.preprocessing import LabelEncoder # load data dataframe = read_csv("horse-colic.csv", delim_whitespace=True, header=None) dataset = dataframe.values # split data into X and y X = dataset[:,0:27] Y = dataset[:,27] # set missing values to 0 X[X == '?'] = 0 # convert to numeric X = X.astype('float32') # encode Y class values as integers label_encoder = LabelEncoder() label_encoder = label_encoder.fit(Y) label_encoded_y = label_encoder.transform(Y) # 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, label_encoded_y, test_size=test_size, random_state=seed) # fit model no training data model = XGBClassifier() model.fit(X_train, y_train) print(model) # 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 XGBClassifier(base_score=0.5, colsample_bylevel=1, colsample_bytree=1, gamma=0, learning_rate=0.1, max_delta_step=0, max_depth=3, min_child_weight=1, missing=None, n_estimators=100, nthread=-1, objective='binary:logistic', reg_alpha=0, reg_lambda=1, scale_pos_weight=1, seed=0, silent=True, subsample=1) Accuracy: 83.84% ``` 我們可以通過使用非零值(例如 1)標記缺失值來梳理 XGBoost 自動處理缺失值的效果。 ```py X[X == '?'] = 1 ``` 重新運行該示例表明模型的準確性下降。 ```py Accuracy: 79.80% ``` 我們還可以使用特定值來估算缺失的數據。 通常使用列的平均值或中值。我們可以使用 scikit-learn [Imputer](http://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.Imputer.html) 類輕松地估算缺失的數據。 ```py # impute missing values as the mean imputer = Imputer() imputed_x = imputer.fit_transform(X) ``` 下面是完整的示例,其中缺少的數據與每列的平均值估算。 ```py # binary classification, missing data, impute with mean import numpy from pandas import read_csv from xgboost import XGBClassifier from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score from sklearn.preprocessing import LabelEncoder from sklearn.preprocessing import Imputer # load data dataframe = read_csv("horse-colic.csv", delim_whitespace=True, header=None) dataset = dataframe.values # split data into X and y X = dataset[:,0:27] Y = dataset[:,27] # set missing values to 0 X[X == '?'] = numpy.nan # convert to numeric X = X.astype('float32') # impute missing values as the mean imputer = Imputer() imputed_x = imputer.fit_transform(X) # encode Y class values as integers label_encoder = LabelEncoder() label_encoder = label_encoder.fit(Y) label_encoded_y = label_encoder.transform(Y) # split data into train and test sets seed = 7 test_size = 0.33 X_train, X_test, y_train, y_test = train_test_split(imputed_x, label_encoded_y, test_size=test_size, random_state=seed) # fit model no training data model = XGBClassifier() model.fit(X_train, y_train) print(model) # 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)) ``` 運行此示例,我們看到的結果等同于將值固定為一(1)。這表明至少在這種情況下,我們最好用不同的零(0)值而不是有效值(1)或估算值來標記缺失值。 ```py Accuracy: 79.80% ``` 當您缺少值時,嘗試這兩種方法(自動處理和輸入)是一個很好的教訓。 ## 摘要 在這篇文章中,您發現了如何使用 Python 中的 XGBoost 為梯度提升準備機器學習數據。 具體來說,你學到了: * 如何使用標簽編碼為二進制分類準備字符串類值。 * 如何使用一個熱編碼準備分類輸入變量以將它們建模為二進制變量。 * XGBoost 如何自動處理丟失的數據以及如何標記和估算缺失值。 您對如何為 XGBoost 或此帖子準備數據有任何疑問嗎?在評論中提出您的問題,我會盡力回答。
                  <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>

                              哎呀哎呀视频在线观看