7.Handling Missing Values
本教程是學習機器學習課程的第2部分。 本教程選擇了1級完成的位置,因此如果您從1級完成練習,您將獲得最大的收益。
在此步驟中,您將學習三種處理缺失值的方法。 然后,您將學習如何比較這些方法在任何給定數據集上的有效性。
Introduction
數據可以通過多種方式以缺失值終止。 例如
- ???? 兩臥室房子不包括第三間臥室有多大的答案
- ???? 接受調查的人可能會選擇不分享收入
Python庫將缺少的數字表示為nan,這是“not a number”的縮寫。 您可以檢測哪些單元格缺少值,然后使用以下命令計算每列中有多少單元格:
missing_val_count_by_column =(data.isnull().sum()) print(missing_val_count_by_column [missing_val_count_by_column]> 0)如果您嘗試使用缺少值的數據構建模型,則大多數庫(包括scikit-learn)都會給您一個錯誤。 因此,您需要選擇以下策略之一。
Solutions
1)A Simple Option:Drop Columns with Missing Values
如果您的數據位于名為original_data的DataFrame中,則可以刪除缺少值的列。 一種方法是
data_without_missing_values = original_data.dropna(axis=1)在許多情況下,您將同時擁有訓練數據集和測試數據集。 您需要在兩個DataFrame中刪除相同的列。 在那種情況下,你會寫
cols_with_missing = [col for col in original_data.columns if original_data[col].isnull().any()] redued_original_data = original_data.drop(cols_with_missing, axis=1) reduced_test_data = test_data.drop(cols_with_missing, axis=1)如果這些列具有有用信息(在未丟失的位置),則在刪除列時,模型將失去對此信息的訪問權限。 此外,如果您的測試數據在您的訓練數據有信息的地方缺少值,則會導致錯誤。
所以,它通常不是最好的解決方案。 但是,當缺少列中的大多數值時,它可能很有用。
2)A Better Option:Imputation
插值是用一些數字填充缺失值。 在大多數情況下,估算值并不完全正確,但它通常會提供比完全刪除列更準確的模型。
是這樣完成的:
默認情況為插入平均值。 統計學家已經研究了更復雜的策略,但是一旦將結果插入復雜的機器學習模型,那些復雜的策略通常沒有任何好處。
關于Imputation的一個(很多)好處是它可以包含在scikit-learn Pipeline中。 管道簡化了模型構建,模型驗證和模型部署。
3)An Extension To Imputation
估算是標準方法,通常效果很好。 但是,估算值可能在系統上高于或低于其實際值(未在數據集中收集)。 或者具有缺失值的行是唯一的。 在這種情況下,您的模型會通過考慮最初缺少哪些值來做出更好的預測。 以下是它的外觀:
# make copy to avoid changing original data (when Imputing) new_data = original_data.copy()# make new columns indicating what will be imputed cols_with_missing = (col for col in new_data.columns if new_data[col].isnull().any()) for col in cols_with_missing:new_data[col + '_was_missing'] = new_data[col].isnull()# Imputation my_imputer = SimpleImputer() new_data = pd.DataFrame(my_imputer.fit_transform(new_data)) new_data.columns = original_data.columns在某些情況下這個方法會有效改善結果,在其它情況下,這可能會根本沒有幫助。
Example(Comparing All Solutions)
我們將看到從墨爾本房屋數據預測房價的例子。 要掌握缺失值處理,請復制此筆記并使用Iowa Housing數據重復相同的步驟。 在標題菜單的“數據”部分中查找有關這兩者的信息。
Basic Problem Set-up
[1]
import pandas as pd# Load data melb_data = pd.read_csv('../input/melbourne-housing-snapshot/melb_data.csv')from sklearn.ensemble import RandomForestRegressor from sklearn.metrics import mean_absolute_error from sklearn.model_selection import train_test_splitmelb_target = melb_data.Price melb_predictors = melb_data.drop(['Price'], axis=1)# For the sake of keeping the example simple, we'll use only numeric predictors. melb_numeric_predictors = melb_predictors.select_dtypes(exclude=['object'])Create Function to Measure Quality of An Approach
我們將數據分為訓練和測試。
我們加載了一個函數score_dataset(X_train,X_test,y_train,y_test)來比較不同方法與缺失值的質量。 此函數報告來自RandomForest的樣本外MAE分數。
【2】
from sklearn.ensemble import RandomForestRegressor from sklearn.metrics import mean_absolute_error from sklearn.model_selection import train_test_splitX_train, X_test, y_train, y_test = train_test_split(melb_numeric_predictors, melb_target,train_size=0.7, test_size=0.3, random_state=0)def score_dataset(X_train, X_test, y_train, y_test):model = RandomForestRegressor()model.fit(X_train, y_train)preds = model.predict(X_test)return mean_absolute_error(y_test, preds)Get Model Score from Dropping Columns with Missing Values
【3】
cols_with_missing = [col for col in X_train.columns if X_train[col].isnull().any()] reduced_X_train = X_train.drop(cols_with_missing, axis=1) reduced_X_test = X_test.drop(cols_with_missing, axis=1) print("Mean Absolute Error from dropping columns with Missing Values:") print(score_dataset(reduced_X_train, reduced_X_test, y_train, y_test)) Mean Absolute Error from dropping columns with Missing Values: 187283.10974589147Get Model Score from Imputation
【4】
from sklearn.impute import SimpleImputermy_imputer = SimpleImputer() imputed_X_train = my_imputer.fit_transform(X_train) imputed_X_test = my_imputer.transform(X_test) print("Mean Absolute Error from Imputation:") print(score_dataset(imputed_X_train, imputed_X_test, y_train, y_test)) Mean Absolute Error from Imputation: 184651.6439862543Get Score from Imputation with Extra Columns Showing What Was Imputed
【5】
imputed_X_train_plus = X_train.copy() imputed_X_test_plus = X_test.copy()cols_with_missing = (col for col in X_train.columns if X_train[col].isnull().any()) for col in cols_with_missing:imputed_X_train_plus[col + '_was_missing'] = imputed_X_train_plus[col].isnull()imputed_X_test_plus[col + '_was_missing'] = imputed_X_test_plus[col].isnull()# Imputation my_imputer = SimpleImputer() imputed_X_train_plus = my_imputer.fit_transform(imputed_X_train_plus) imputed_X_test_plus = my_imputer.transform(imputed_X_test_plus)print("Mean Absolute Error from Imputation while Track What Was Imputed:") print(score_dataset(imputed_X_train_plus, imputed_X_test_plus, y_train, y_test))Conclusion
通常,與丟棄這些列相比,輸入缺失值允許我們改進模型。 通過跟蹤估算的值,我們得到了額外的提升。
Your Turn
1)在數據集中查找一些缺少值的列。
2)使用Imputer類,以便可以輸入缺失值
3)將具有缺失值的列添加到預測變量中。
如果找到正確的列,您可能會看到模型得分有所改善。 也就是說,lowa的數據沒有很多缺少值的列。 因此,您是否看到此時的改進取決于您的模型的其他一些細節。
添加Imputer后,請繼續使用這些列以用于將來的步驟。 最后,它將改進您的模型(在大多數其他數據集中,這是一個很大的改進)。
Keep Going
一旦添加了Imputer并且包含缺失值的列,您就可以添加分類變量,這些變量是表示類別的非數字數據(例如房屋所在社區的名稱)。
總結
以上是生活随笔為你收集整理的7.Handling Missing Values的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: islp2sta.exe - islp2
- 下一篇: 网易云音乐发布首款音乐社交APP:主打高