使用Python預測缺失值

2021-01-15 人工智慧遇見磐創

對於數據科學家來說,處理丟失的數據是數據清理和模型開發過程中的一個重要部分。通常情況下,真實數據包含多個稀疏欄位或包含錯誤值的欄位。在這篇文章中,我們將討論如何建立可以用來填補數據中缺失或錯誤值的模型。

出於我們的目的,我們將使用可以在這裡找到的葡萄酒數據集:https://www.kaggle.com/zynicide/wine-reviews

import pandas as pddf = pd.read_csv("winemag-data-130k-v2.csv")接下來,讓我們輸出前五行數據:

print(df.head())

讓我們從這些數據中隨機抽取500條記錄。這將有助於加快模型訓練和測試,儘管讀者可以很容易地對其進行修改:

import pandas as pddf = pd.read_csv("winemag-data-130k-v2.csv").sample(n=500, random_state = 42)現在,讓我們列印與數據對應的信息,這將使我們了解哪些列缺少值:

print(df.info())

有幾個列的非空值小於500,這與缺少的值相對應。首先,讓我們考慮建立一個模型,用「points」來估算缺失的「price」值。首先,讓我們列印「price」和「points」之間的相關性:

print("Correlation: ", df['points'].corr(df['price']))

我們看到了一個微弱的正相關。讓我們建立一個線性回歸模型,用「points」來預測「price」。首先,讓我們從「scikit learn」導入「LinearRegresssion」模塊:

from sklearn.linear_model import LinearRegression現在,讓我們為訓練和測試拆分數據。我們希望能夠預測缺失值,但我們應該使用真實值「price」來驗證我們的預測。讓我們通過只選擇正價格值來篩選缺少的值:

import numpy as np df_filter = df[df['price'] > 0].copy()我們還可以初始化用於存儲預測和實際值的列表:

y_pred = []y_true = []我們將使用K-fold交叉驗證來驗證我們的模型。讓我們從「scikit learn」導入「KFolds」模塊。我們將使用10折來驗證我們的模型:

from sklearn.model_selection import KFoldkf = KFold(n_splits=10, random_state = 42)for train_index, test_index in kf.split(df_filter): df_test = df_filter.iloc[test_index] df_train = df_filter.iloc[train_index]我們現在可以定義我們的輸入和輸出:

for train_index, test_index in kf.split(df_filter): ... X_train = np.array(df_train['points']).reshape(-1, 1) y_train = np.array(df_train['price']).reshape(-1, 1) X_test = np.array(df_test['points']).reshape(-1, 1) y_test = np.array(df_test['price']).reshape(-1, 1)並擬合我們的線性回歸模型:

for train_index, test_index in kf.split(df_filter): ... model = LinearRegression() model.fit(X_train, y_train)現在讓我們生成並存儲我們的預測:

for train_index, test_index in kf.split(df_filter): ... y_pred.append(model.predict(X_test)[0]) y_true.append(y_test[0])現在讓我們評估一下模型的性能。讓我們用均方誤差來評估模型的性能:

print("Mean Square Error: ", mean_squared_error(y_true, y_pred))

並不太好。我們可以通過訓練平均價格加上一個標準差來改善這一點:

df_filter = df[df['price'] <= df['price'].mean() + df['price'].std() ].copy()...print("Mean Square Error: ", mean_squared_error(y_true, y_pred))

雖然這大大提高了性能,但其代價是無法準確估算葡萄酒的price。與使用單一特徵的回歸模型預測價格不同,我們可以使用樹基模型,例如隨機森林模型,它可以處理類別和數值變量。

讓我們建立一個隨機森林回歸模型,使用「country」、「province」、「variety」、「winery」和「points」來預測葡萄酒的「price」。首先,讓我們將分類變量轉換為可由隨機森林模型處理的分類代碼:

df['country_cat'] = df['country'].astype('category')df['country_cat'] = df['country_cat'].cat.codesdf['province_cat'] = df['province'].astype('category')df['province_cat'] = df['province_cat'].cat.codesdf['winery_cat'] = df['winery'].astype('category')df['winery_cat'] = df['winery_cat'].cat.codesdf['variety_cat'] = df['variety'].astype('category')df['variety_cat'] = df['variety_cat'].cat.codes讓我們將隨機樣本大小增加到5000:

df = pd.read_csv("winemag-data-130k-v2.csv").sample(n=5000, random_state = 42)接下來,讓我們從scikit learn導入隨機森林回歸器模塊。我們還可以定義用於訓練模型的特徵列表:

from sklearn.ensemble import RandomForestRegressorfeatures = ['points', 'country_cat', 'province_cat', 'winery_cat', 'variety_cat']讓我們用一個隨機森林來訓練我們的模型,它有1000個估計量,最大深度為1000。然後,讓我們生成預測並將其附加到新列表中:

for train_index, test_index in kf.split(df_filter): df_test = df_filter.iloc[test_index] df_train = df_filter.iloc[train_index] X_train = np.array(df_train[features]) y_train = np.array(df_train['price']) X_test = np.array(df_test[features]) y_test = np.array(df_test['price']) model = RandomForestRegressor(n_estimators = 1000, max_depth = 1000, random_state = 42) model.fit(X_train, y_train) y_pred_rf.append(model.predict(X_test)[0]) y_true_rf.append(y_test[0])最後,讓我們評估隨機森林和線性回歸模型的均方誤差:

print("Mean Square Error (Linear Regression): ", mean_squared_error(y_true, y_pred))print("Mean Square Error (Random Forest): ", mean_squared_error(y_pred_rf, y_true_rf))

我們看到隨機森林模型具有優越的性能。現在,讓我們使用我們的模型預測缺失的價格值,並顯示price預測:

df_missing = df[df['price'].isnull()].copy()X_test_lr = np.array(df_missing['points']).reshape(-1, 1)X_test_rf = np.array(df_missing[features])X_train_lr = np.array(df_filter['points']).reshape(-1, 1) y_train_lr = np.array(df_filter['price']).reshape(-1, 1)X_train_rf = np.array(df_filter[features])y_train_rf = np.array(df_filter['price'])model_lr = LinearRegression()model_lr.fit(X_train_lr, y_train_lr)print("Linear regression predictions: ", model_lr.predict(X_test_lr)[0][0])model_rf = RandomForestRegressor(n_estimators = 1000, max_depth = 1000, random_state = 42)model_rf.fit(X_train_rf, y_train_rf)print("Random forests regression predictions: ", model_rf.predict(X_test_rf)[0])

我就到此為止,但我鼓勵你嘗試一下特徵選擇和超參數調整,看看是否可以提高性能。此外,我鼓勵你擴展此數據進行插補模型,以填補「region_1」和「designation」等分類欄位中的缺失值。在這裡,你可以構建一個基於樹的分類模型,根據分類和數值特徵來預測所列類別的缺失值。

結論

總而言之,在這篇文章中,我們討論了如何建立機器學習模型,我們可以用來填補數據中的缺失值。首先,我們建立了一個線性回歸模型,用以預測葡萄酒的價格。然後,我們建立了一個隨機森林模型,用「points」和其他分類變量來預測葡萄酒價格。我們發現,隨機森林模型顯著優於基於線性回歸的數據插補模型。本文中的代碼可以在GitHub上找到。謝謝你的閱讀!

Github連結:https://github.com/spierre91/medium_code/blob/master/machine_learning/predict_missing_data.py

相關焦點

  • Python數據清洗(二):缺失值識別與處理
    關於缺失值的判斷可以使用isnull方法。下面使用isnull方法對data3數據(數據可至中---下載)進行判斷,統計輸出的結果如下表所示。需要說明的是,判斷數據是否為缺失值NaN,可以使用isnull「方法」,它會返回與原數據行列數相同的矩陣,並且矩陣的元素為bool類型的值,為了得到每一列的判斷結果,仍然需要any「方法」(且設置「方法」內的axis參數為0);統計各變量的缺失值個數可以在isnull的基礎上使用sum「方法」(同樣需要設置axis參數為0);計算缺失比例就是在缺失數量的基礎上除以總的樣本量
  • 在python中使用KNN算法處理缺失的數據
    處理缺失的數據並不是一件容易的事。 方法的範圍從簡單的均值插補和觀察值的完全刪除到像MICE這樣的更高級的技術。 解決問題的挑戰性是選擇使用哪種方法。 今天,我們將探索一種簡單但高效的填補缺失數據的方法-KNN算法。KNN代表「 K最近鄰居」,這是一種簡單算法,可根據定義的最接近鄰居數進行預測。 它計算從您要分類的實例到訓練集中其他所有實例的距離。
  • 數據的預處理基礎:如何處理缺失值
    從「 age_group」到「 contact」的變量在「 0」級別彼此關聯,並充分預測彼此的存在。 或者,您可以說此部分沒有缺失的值。其餘變量的缺失是MAR或MCAR。 要檢查這一點,我們可以使用2種方法:方法1:可視化變量的缺失如何相對於另一個變量變化。通過使用兩個變量的散點圖,我們可以檢查兩個變量之間的關係是否缺失。x軸變量的缺失值分布在y軸的整個其他變量中。
  • python實現高斯樸素貝葉斯分類器
    python實現高斯樸素貝葉斯分類器    在這篇文章中,我們將使用我最喜歡的機器學習庫scikit-learn在Python中實現樸素貝葉斯分類器。接下來,我們將使用經過訓練的樸素貝葉斯(監督分類法)模型來預測人口收入。
  • Kaggle比賽入門——房價預測
    兩個數據集都包括每棟房子的特徵,如街道類型、建造年份、房頂類型、地下室狀況等特徵值。這些特徵值有連續的數字、離散的標籤甚至是缺失值「na」。只有訓練數據集包括了每棟房子的價格,也就是標籤。我們可以訪問比賽網頁,點擊圖3.8中的「Data」標籤,並下載這些數據集。我們將通過pandas庫讀入並處理數據。在導入本節需要的包前請確保已安裝pandas庫,否則請參考下面的代碼注釋。
  • 學會用Python結合人工智慧嘗試預測股票,下一個股神就是你!
    本文要介紹的就是利用Python+keras對股票進行時間序列上的數字特徵預測。用Python結合人工智慧嘗試預測股票,會成就下一個股神?預備條件:假設您熟悉python,並且已經在系統中安裝了python 3。本教程中使用了jupyter筆記本。您可以使用自己喜歡的IDE。
  • 第五十三講 R-缺失值的注意事項及處理
    在數據分析過程中,我們經常會遇到缺失值的情況。比如要研究血壓、血糖、胰島素水平、懷孕次數與糖尿病的關係。我們需要使用多元邏輯回歸。但是可能數據有10%的血壓確實,10%的胰島素水平缺失,10%的血糖缺失。
  • python應用之基於tensorflow的數據擬合:深度學習之預測入門篇
    實驗目的:1、了解python在深度學習領域的應用2、學習安裝python第三方依賴庫實驗環境:已正確安裝python3.5以及依賴庫tensorflow、matplotlib預測過程展示:1、應用領域python是一種高級面向對象的動態類型語言,具有開發高效,學習簡單的特點,主要應用於大數據、深度學習、
  • SPSS 經典教材:基於回歸法填充缺失值
    2018-03-27 01:16:53 來源: 臨床科研與meta分析 舉報   缺失值在臨床研究
  • 一日一技:從Python列表中刪除重複值
    使用Pandas方法 從列表中刪除重複項使用enumerate()刪除重複值使用Set()方法從列表中刪除重複值要從列表中刪除重複值,可以使用內置函數set()。 set()方法可以返回不同的元素.以下,我們創建一個列表:[1,1,2,3,2,2,4,5,6,2,1]。
  • XGBoost缺失值引發的問題及其深度分析|CSDN博文精選
    然而,在XGBoost on Spark的官方實現中,卻存在一個因XGBoost缺失值和Spark稀疏表示機制而帶來的不穩定問題。事情起源於美團內部某機器學習平臺使用方同學的反饋,在該平臺上訓練出的XGBoost模型,使用同一個模型、同一份測試數據,在本地調用(Java引擎)與平臺(Spark引擎)計算的結果不一致。
  • 如何使用 Python 構建 PC 通信?
    本文就來分享下如何使用Python構建PC與PLC的通信,也算展示一把Python在工控領域的風採。Python對其進行了封裝,具體可以參見:https://github.com/gijzelaerr/python-snap7。
  • Pytest丨如何使用全功能的Python測試框架?小白必看
    pytest斷言前面說到pytest的斷言比較強大,它直接可以使用python自帶的斷言內容,當然不止而已,pytest還有一個重要的功能是可以重寫assert關鍵字,pytest會截斷對python中自帶的assert的調用然後替換成自己定位的assert,從而可以獲取更多的錯誤信息,讓我們知道具體哪裡出現了問題。編寫一個加法進行通過斷言驗證。
  • 怎樣使用python進行PLS-DA建模
    PLS-DA是計算化學中一種常見的分類算法,那麼它在python中如何實現呢?這裡我們使用scikit-learn包首先,導入需要的package:import pandas as pdfrom sklearn.datasets import load_irisfrom sklearn.metrics import accuracy_scorefrom sklearn.cross_decomposition import PLSRegression
  • 使用Python進行VNC身份驗證檢查
    在本文中將描述了一個小的python腳本,該腳本可用於確定VNC伺服器上使用的身份驗證類型。它使用Scapy數據包處理程序來執行所有網絡數據傳輸和檢索。該程序可能並不完美,但是經過有限的測試,它似乎可以正常運行。為了了解程序的工作原理,我需要解釋VNC客戶端如何與VNC伺服器交互。RFB協議用於建立與伺服器的連接。
  • python字符串、列表內的方法使用
    python類型int:bit_lenth()bool:True Falsestr: str --->bool :bool(str): ''--->Falsestr例如:s = 'alexsb's1 = s[1]s2 = s[1:3]s3 = s[0:] s[
  • python字典操作大全,學習python第7天
    python字典python字典概念:python字典可以用來存儲任意類型對象,python字典都是由一個鍵和一個值組成的「鍵值對」,兩者之間用冒號隔開,結構如:sco = {'name':'小明','age
  • 使用Python玩轉高等數學(5):三角函數
    從三角函數開始,我們使用matplotlib繪製函數圖像,matplotlib是圖形繪製庫,使用matplotlib可以方便的繪製函數圖形,以及直方圖
  • 2020 版 Python 數據清理終極指南!
    在本文中,我們將使用Kaggle提供的俄羅斯房地產數據集(https://www.kaggle.com/c/sberbank-russian-housing-market/overview/description),目標是要預測一下俄羅斯近期的房價波動。
  • mac使用python識別圖形驗證碼!
    在網上查了很多版本的圖形驗證碼識別,目前看到最多的兩個模塊是pytesseract和tesserocr,但是因為我這裡安裝tesserocr的時候各種出錯,所以最終我鎖定了使用pytesseract。那麼接下來,就記錄下安裝以及使用過程。這裡的系統環境是mac os 10.14.