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

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                # 如何使用 Python 處理丟失的數據 > 原文: [https://machinelearningmastery.com/handle-missing-data-python/](https://machinelearningmastery.com/handle-missing-data-python/) 實際數據通常缺少值。 數據可能由于多種原因而丟失,例如未記錄的觀察和數據損壞。 處理缺失數據非常重要,因為許多機器學習算法不支持缺少值的數據。 在本教程中,您將了解如何使用 Python 處理機器學習的缺失數據。 具體來說,完成本教程后,您將了解: * 如何在數據集中將無效或損壞的值標記為缺失。 * 如何從數據集中刪除缺少數據的行。 * 如何使用數據集中的平均值來估算缺失值。 讓我們開始吧。 **注意**:本文中的示例假設您安裝了 Pandas,NumPy 和 Scikit-Learn 的 Python 2 或 3,特別是 scikit-learn 版本 0.18 或更高版本。 * **更新 March / 2018** :添加了備用鏈接以下載數據集,因為原始圖像已被刪除。 ![How to Handle Missing Values with Python](https://img.kancloud.cn/71/bf/71bf4f3f7254daeb6f1a5cd8bdd09db7_640x480.jpg) 如何使用 Python 處理缺失的值 照片由 [CoCreatr](https://www.flickr.com/photos/cocreatr/2265030196/) ,保留一些權利。 ## 概觀 本教程分為 6 個部分: 1. **皮馬印第安人糖尿病數據集**:我們查看已知缺失值的數據集。 2. **標記缺失值**:我們學習如何在數據集中標記缺失值。 3. **缺少值導致問題**:我們看到機器學習算法在包含缺失值時如何失敗。 4. **刪除缺少值的行**:我們在哪里看到如何刪除包含缺失值的行。 5. **Impute Missing Values** :我們用合理的值替換缺失值。 6. **支持缺失值的算法**:我們了解支持缺失值的算法。 首先,讓我們看一下缺少值的樣本數據集。 ## 1.皮馬印第安人糖尿病數據集 [皮馬印第安人糖尿病數據集](https://archive.ics.uci.edu/ml/datasets/Pima+Indians+Diabetes)涉及在 Pima 印第安人中根據醫療細節預測 5 年內糖尿病的發病。 這是一個二元(2 級)分類問題。每個班級的觀察數量不均衡。有 768 個觀測值,有 8 個輸入變量和 1 個輸出變量。變量名稱如下: * 0.懷孕的次數。 * 1.口服葡萄糖耐量試驗中血漿葡萄糖濃度為 2 小時。 * 2.舒張壓(mm Hg)。 * 3.三頭肌皮褶厚度(mm)。 * 4\. 2 小時血清胰島素(μU/ ml)。 * 5.體重指數(體重 kg /(身高 m)^ 2)。 * 6.糖尿病譜系功能。 * 7.年齡(年)。 * 8.類變量(0 或 1)。 預測最普遍類別的基線表現是大約 65%的分類準確度。最佳結果實現了大約 77%的分類準確度。 下面列出了前 5 行的樣本。 ``` 6,148,72,35,0,33.6,0.627,50,1 1,85,66,29,0,26.6,0.351,31,0 8,183,64,0,0,23.3,0.672,32,1 1,89,66,23,94,28.1,0.167,21,0 0,137,40,35,168,43.1,2.288,33,1 ``` 已知此數據集具有缺失值。 具體而言,對于標記為零值的某些列,缺少觀察結果。 我們可以通過這些列的定義以及零值對這些度量無效的領域知識來證實這一點,例如:體重指數或血壓為零無效。 [從這里](https://archive.ics.uci.edu/ml/machine-learning-databases/pima-indians-diabetes/pima-indians-diabetes.data)下載數據集并將其保存到當前工作目錄,文件名為 _pima-indians-diabetes.csv_ (更新:[從這里下載](https://raw.githubusercontent.com/jbrownlee/Datasets/master/pima-indians-diabetes.data.csv))。 ## 2.標記缺失值 在本節中,我們將了解如何識別和標記缺失的值。 我們可以使用繪圖和摘要統計信息來幫助識別丟失或損壞的數據。 我們可以將數據集作為 Pandas DataFrame 加載,并打印每個屬性的摘要統計信息。 ``` from pandas import read_csv dataset = read_csv('pima-indians-diabetes.csv', header=None) print(dataset.describe()) ``` 運行此示例將生成以下輸出: ``` 0 1 2 3 4 5 \ count 768.000000 768.000000 768.000000 768.000000 768.000000 768.000000 mean 3.845052 120.894531 69.105469 20.536458 79.799479 31.992578 std 3.369578 31.972618 19.355807 15.952218 115.244002 7.884160 min 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 25% 1.000000 99.000000 62.000000 0.000000 0.000000 27.300000 50% 3.000000 117.000000 72.000000 23.000000 30.500000 32.000000 75% 6.000000 140.250000 80.000000 32.000000 127.250000 36.600000 max 17.000000 199.000000 122.000000 99.000000 846.000000 67.100000 6 7 8 count 768.000000 768.000000 768.000000 mean 0.471876 33.240885 0.348958 std 0.331329 11.760232 0.476951 min 0.078000 21.000000 0.000000 25% 0.243750 24.000000 0.000000 50% 0.372500 29.000000 0.000000 75% 0.626250 41.000000 1.000000 max 2.420000 81.000000 1.000000 ``` 這很有用。 我們可以看到有些列的最小值為零(0)。在某些列上,值為零沒有意義,表示值無效或缺失。 具體而言,以下列具有無效的零最小值: * 1:血漿葡萄糖濃度 * 2:舒張壓 * 3:肱三頭肌皮褶厚度 * 4:2 小時血清胰島素 * 5:體重指數 讓'確認這是我查看原始數據,該示例打印前 20 行數據。 ``` from pandas import read_csv import numpy dataset = read_csv('pima-indians-diabetes.csv', header=None) # print the first 20 rows of data print(dataset.head(20)) ``` 運行該示例,我們可以清楚地看到第 2,3,4 和 5 列中的 0 值。 ``` 0 1 2 3 4 5 6 7 8 0 6 148 72 35 0 33.6 0.627 50 1 1 1 85 66 29 0 26.6 0.351 31 0 2 8 183 64 0 0 23.3 0.672 32 1 3 1 89 66 23 94 28.1 0.167 21 0 4 0 137 40 35 168 43.1 2.288 33 1 5 5 116 74 0 0 25.6 0.201 30 0 6 3 78 50 32 88 31.0 0.248 26 1 7 10 115 0 0 0 35.3 0.134 29 0 8 2 197 70 45 543 30.5 0.158 53 1 9 8 125 96 0 0 0.0 0.232 54 1 10 4 110 92 0 0 37.6 0.191 30 0 11 10 168 74 0 0 38.0 0.537 34 1 12 10 139 80 0 0 27.1 1.441 57 0 13 1 189 60 23 846 30.1 0.398 59 1 14 5 166 72 19 175 25.8 0.587 51 1 15 7 100 0 0 0 30.0 0.484 32 1 16 0 118 84 47 230 45.8 0.551 31 1 17 7 107 74 0 0 29.6 0.254 31 1 18 1 103 30 38 83 43.3 0.183 33 0 19 1 115 70 30 96 34.6 0.529 32 1 ``` 我們可以計算每列上缺失值的數量。我們可以這樣做,標記我們感興趣的 DataFrame 子集中的所有值,其值為零。然后我們可以計算每列中的真值數。 我們可以這樣做,標記我們感興趣的 DataFrame 子集中的所有值,其值為零。然后我們可以計算每列中的真值數。 ``` from pandas import read_csv dataset = read_csv('pima-indians-diabetes.csv', header=None) print((dataset[[1,2,3,4,5]] == 0).sum()) ``` 運行該示例將輸出以下輸出: ``` 1 5 2 35 3 227 4 374 5 11 ``` 我們可以看到第 1,2 和 5 列只有幾個零值,而第 3 列和第 4 列顯示了更多,接近一半的行。 這突出了不同列可能需要不同的“缺失值”策略,例如確保仍有足夠數量的記錄來訓練預測模型。 在 Python 中,特別是 Pandas,NumPy 和 Scikit-Learn,我們將缺失值標記為 NaN。 具有 NaN 值的值將在 sum,count 等操作中被忽略。 我們可以通過在我們感興趣的列子集上使用 [replace()函數](http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.replace.html),使用 Pandas DataFrame 輕松地將值標記為 NaN。 在我們標記缺失值之后,我們可以使用 [isnull()函數](http://pandas.pydata.org/pandas-docs/stable/generated/pandas.isnull.html)將數據集中的所有 NaN 值標記為 True,并獲取每列的缺失值計數。 ``` from pandas import read_csv import numpy dataset = read_csv('pima-indians-diabetes.csv', header=None) # mark zero values as missing or NaN dataset[[1,2,3,4,5]] = dataset[[1,2,3,4,5]].replace(0, numpy.NaN) # count the number of NaN values in each column print(dataset.isnull().sum()) ``` 運行該示例將打印每列中缺失值的數量。我們可以看到列 1:5 具有與上面標識的零值相同數量的缺失值。這表明我們已正確標記了已識別的缺失值。 我們可以看到列 1 到 5 具有與上面標識的零值相同數量的缺失值。這表明我們已正確標記了已識別的缺失值。 ``` 0 0 1 5 2 35 3 227 4 374 5 11 6 0 7 0 8 0 ``` 這是一個有用的總結。我總是喜歡看實際的數據,以確認我沒有欺騙自己。 下面是相同的例子,除了我們打印前 20 行數據。 ``` from pandas import read_csv import numpy dataset = read_csv('pima-indians-diabetes.csv', header=None) # mark zero values as missing or NaN dataset[[1,2,3,4,5]] = dataset[[1,2,3,4,5]].replace(0, numpy.NaN) # print the first 20 rows of data print(dataset.head(20)) ``` 運行該示例,我們可以清楚地看到第 2,3,4 和 5 列中的 NaN 值。第 1 列中只有 5 個缺失值,因此我們在前 20 行中沒有看到示例也就不足為奇了。 從原始數據可以清楚地看出,標記缺失值具有預期效果。 ``` 0 1 2 3 4 5 6 7 8 0 6 148.0 72.0 35.0 NaN 33.6 0.627 50 1 1 1 85.0 66.0 29.0 NaN 26.6 0.351 31 0 2 8 183.0 64.0 NaN NaN 23.3 0.672 32 1 3 1 89.0 66.0 23.0 94.0 28.1 0.167 21 0 4 0 137.0 40.0 35.0 168.0 43.1 2.288 33 1 5 5 116.0 74.0 NaN NaN 25.6 0.201 30 0 6 3 78.0 50.0 32.0 88.0 31.0 0.248 26 1 7 10 115.0 NaN NaN NaN 35.3 0.134 29 0 8 2 197.0 70.0 45.0 543.0 30.5 0.158 53 1 9 8 125.0 96.0 NaN NaN NaN 0.232 54 1 10 4 110.0 92.0 NaN NaN 37.6 0.191 30 0 11 10 168.0 74.0 NaN NaN 38.0 0.537 34 1 12 10 139.0 80.0 NaN NaN 27.1 1.441 57 0 13 1 189.0 60.0 23.0 846.0 30.1 0.398 59 1 14 5 166.0 72.0 19.0 175.0 25.8 0.587 51 1 15 7 100.0 NaN NaN NaN 30.0 0.484 32 1 16 0 118.0 84.0 47.0 230.0 45.8 0.551 31 1 17 7 107.0 74.0 NaN NaN 29.6 0.254 31 1 18 1 103.0 30.0 38.0 83.0 43.3 0.183 33 0 19 1 115.0 70.0 30.0 96.0 34.6 0.529 32 1 ``` 在我們處理缺失值之前,讓我們首先證明在數據集中缺少值可能會導致問題。 ## 3.缺少值會導致問題 在數據集中缺少值可能會導致某些機器學習算法出錯。 在本節中,我們將嘗試在具有缺失值的數據集上評估線性判別分析(LDA)算法。 這是一種在數據集中缺少值時不起作用的算法。 下面的示例標記數據集中的缺失值,就像我們在上一節中所做的那樣,然后嘗試使用 3 倍交叉驗證來評估 LDA 并打印平均精度。 ``` from pandas import read_csv import numpy from sklearn.discriminant_analysis import LinearDiscriminantAnalysis from sklearn.model_selection import KFold from sklearn.model_selection import cross_val_score dataset = read_csv('pima-indians-diabetes.csv', header=None) # mark zero values as missing or NaN dataset[[1,2,3,4,5]] = dataset[[1,2,3,4,5]].replace(0, numpy.NaN) # split dataset into inputs and outputs values = dataset.values X = values[:,0:8] y = values[:,8] # evaluate an LDA model on the dataset using k-fold cross validation model = LinearDiscriminantAnalysis() kfold = KFold(n_splits=3, random_state=7) result = cross_val_score(model, X, y, cv=kfold, scoring='accuracy') print(result.mean()) ``` 運行該示例會導致錯誤,如下所示: ``` ValueError: Input contains NaN, infinity or a value too large for dtype('float64'). ``` 這是我們所期望的。 我們無法在具有缺失值的數據集上評估 LDA 算法(和其他算法)。 現在,我們可以查看處理缺失值的方法。 ## 4.刪除缺少值的行 處理缺失數據的最簡單策略是刪除包含缺失值的記錄。 我們可以通過創建一個包含缺失值的行的新 Pandas DataFrame 來完成此操作。 Pandas 提供 [dropna()函數](http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.dropna.html),可用于刪除缺少數據的列或行。我們可以使用 dropna()刪除缺少數據的所有行,如下所示: ``` from pandas import read_csv import numpy dataset = read_csv('pima-indians-diabetes.csv', header=None) # mark zero values as missing or NaN dataset[[1,2,3,4,5]] = dataset[[1,2,3,4,5]].replace(0, numpy.NaN) # drop rows with missing values dataset.dropna(inplace=True) # summarize the number of rows and columns in the dataset print(dataset.shape) ``` 運行此示例,我們可以看到行數已經從原始數據集中的 768 積極地減少到 392,并且所有行都包含 NaN。 ``` (392, 9) ``` 我們現在有一個數據集可以用來評估對缺失值敏感的算法,比如 LDA。 ``` from pandas import read_csv import numpy from sklearn.discriminant_analysis import LinearDiscriminantAnalysis from sklearn.model_selection import KFold from sklearn.model_selection import cross_val_score dataset = read_csv('pima-indians-diabetes.csv', header=None) # mark zero values as missing or NaN dataset[[1,2,3,4,5]] = dataset[[1,2,3,4,5]].replace(0, numpy.NaN) # drop rows with missing values dataset.dropna(inplace=True) # split dataset into inputs and outputs values = dataset.values X = values[:,0:8] y = values[:,8] # evaluate an LDA model on the dataset using k-fold cross validation model = LinearDiscriminantAnalysis() kfold = KFold(n_splits=3, random_state=7) result = cross_val_score(model, X, y, cv=kfold, scoring='accuracy') print(result.mean()) ``` 該示例成功運行并打印模型的準確性。 ``` 0.78582892934 ``` 刪除缺少值的行可能會對某些預測建模問題造成太大限制,另一種方法是估算缺失值。 ## 5.估算缺失值 輸入是指使用模型替換缺失值。 替換缺失值時我們可以考慮許多選項,例如: * 在域中具有意義的常量值,例如 0,與所有其他值不同。 * 來自另一個隨機選擇的記錄的值。 * 列的平均值,中值或模式值。 * 由另一個預測模型估計的值。 當需要從最終模型進行預測時,將來必須對新數據執行對訓練數據集執行的任何估算。在選擇如何估算缺失值時需要考慮這一點。 例如,如果您選擇使用平均列值進行估算,則需要將這些平均列值存儲到文件中,以便以后用于具有缺失值的新數據。 Pandas 提供 [fillna()函數](http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.fillna.html),用于替換具有特定值的缺失值。 例如,我們可以使用 fillna()將缺失值替換為每列的平均值,如下所示: ``` from pandas import read_csv import numpy dataset = read_csv('pima-indians-diabetes.csv', header=None) # mark zero values as missing or NaN dataset[[1,2,3,4,5]] = dataset[[1,2,3,4,5]].replace(0, numpy.NaN) # fill missing values with mean column values dataset.fillna(dataset.mean(), inplace=True) # count the number of NaN values in each column print(dataset.isnull().sum()) ``` 運行該示例提供了每列中缺失值數量的計數,顯示零缺失值。 ``` 0 0 1 0 2 0 3 0 4 0 5 0 6 0 7 0 8 0 ``` scikit-learn 庫提供 [Imputer()預處理類](http://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.Imputer.html),可用于替換缺失值。 它是一個靈活的類,允許您指定要替換的值(它可以是除 NaN 之外的其他東西)和用于替換它的技術(例如均值,中位數或模式)。 Imputer 類直接在 NumPy 數組而不是 DataFrame 上運行。 下面的示例使用 Imputer 類將缺失值替換為每列的平均值,然后在轉換后的矩陣中打印 NaN 值的數量。 ``` from pandas import read_csv from sklearn.preprocessing import Imputer import numpy dataset = read_csv('pima-indians-diabetes.csv', header=None) # mark zero values as missing or NaN dataset[[1,2,3,4,5]] = dataset[[1,2,3,4,5]].replace(0, numpy.NaN) # fill missing values with mean column values values = dataset.values imputer = Imputer() transformed_values = imputer.fit_transform(values) # count the number of NaN values in each column print(numpy.isnan(transformed_values).sum()) ``` 運行該示例顯示所有 NaN 值都已成功估算。 在任何一種情況下,我們都可以訓練對變換數據集中的 NaN 值敏感的算法,例如 LDA。 下面的示例顯示了在 Imputer 轉換數據集中訓練的 LDA 算法。 ``` from pandas import read_csv import numpy from sklearn.preprocessing import Imputer from sklearn.discriminant_analysis import LinearDiscriminantAnalysis from sklearn.model_selection import KFold from sklearn.model_selection import cross_val_score dataset = read_csv('pima-indians-diabetes.csv', header=None) # mark zero values as missing or NaN dataset[[1,2,3,4,5]] = dataset[[1,2,3,4,5]].replace(0, numpy.NaN) # split dataset into inputs and outputs values = dataset.values X = values[:,0:8] y = values[:,8] # fill missing values with mean column values imputer = Imputer() transformed_X = imputer.fit_transform(X) # evaluate an LDA model on the dataset using k-fold cross validation model = LinearDiscriminantAnalysis() kfold = KFold(n_splits=3, random_state=7) result = cross_val_score(model, transformed_X, y, cv=kfold, scoring='accuracy') print(result.mean()) ``` 運行該示例將在已轉換的數據集上打印 LDA 的準確性。 ``` 0.766927083333 ``` 嘗試用其他值替換缺失的值,看看是否可以提升模型的表現。 也許缺失值在數據中有意義。 接下來,我們將研究使用在建模時將缺失值視為另一個值的算法。 ## 6.支持缺失值的算法 當缺少數據時,并非所有算法都會失敗。 有些算法可以對丟失的數據進行魯棒處理,例如 k-Nearest Neighbors 可以在缺少值時忽略距離測量中的列。 還有一些算法可以在構建預測模型時使用缺失值作為唯一且不同的值,例如分類和回歸樹。 遺憾的是,決策樹和 k-Nearest Neighbors 的 scikit-learn 實現對于缺失值并不健壯。 [雖然正在考慮](https://github.com/scikit-learn/scikit-learn/issues/5870)。 然而,如果您考慮使用其他算法實現(例如 [xgboost](http://machinelearningmastery.com/xgboost-python-mini-course/) )或開發自己的實現,這仍然是一個選項。 ## 進一步閱讀 * [在 Pandas](http://pandas.pydata.org/pandas-docs/stable/missing_data.html) 中處理丟失的數據 * [在 scikit-learn](http://scikit-learn.org/stable/modules/preprocessing.html#imputation-of-missing-values) 中對缺失值的估算 ## 摘要 在本教程中,您了解了如何處理包含缺失值的機器學習數據。 具體來說,你學到了: * 如何將數據集中的缺失值標記為 numpy.nan。 * 如何從數據集中刪除包含缺失值的行。 * 如何用合理的值替換缺失值。 您對處理缺失值有任何疑問嗎? 在評論中提出您的問題,我會盡力回答。
                  <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>

                              哎呀哎呀视频在线观看