色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

處理缺失值的三個層級的方法總結

冬至子 ? 來源:Honzik Jurza ? 作者:Honzik Jurza ? 2023-05-24 17:15 ? 次閱讀

缺失值

缺失值是現實數據集中的常見問題,處理缺失值是數據預處理的關鍵步驟。缺失值可能由于各種原因而發生,例如數據的結構和質量、數據輸入錯誤、傳輸過程中的數據丟失或不完整的數據收集。這些缺失的值可能會影響機器學習模型的準確性和可靠性,因為它們可能會引入偏差并扭曲結果,有些模型甚至在在缺少值的情況下根本無法工作。所以在構建模型之前,適當地處理缺失值是必要的。

本文將展示如何使用三種不同級別的方法處理這些缺失值:

  • 初級:刪除,均值/中值插補,使用領域知識進行估計
  • 中級:回歸插補, K-Nearest neighbors (KNN) 插補
  • 高級:鏈式方程(MICE)的多元插補, MICEforest

檢查缺失的值

首先必須檢查每個特性中有多少缺失值。作為探索性數據分析的一部分,我們可以使用以下代碼來做到這一點:

導入pandas并在數據集中讀取它們,對于下面的示例,我們將使用葡萄酒質量數據集。

importpandasaspd
 df=pd.read_csv('Wine_Quality.csv')

然后可以用下面的代碼行檢查缺失的值。

df.isnull().sum()

可以使用以下方法查看任何特性中包含缺失值的行:

df_filtered=df[df.isnull().any(axis=1)]
 df_filtered.head()

現在我們可以開始處理這些缺失的值了。

初級方法

最簡單的方法是刪除行或列(特性)。這通常是在缺失值的百分比非常大或缺失值對分析或結果沒有顯著影響時進行的。

刪除缺少值的行。

df_droprows=df.dropna()
 df_droprows.isnull().sum()

使用以下方法刪除列或特性:

df_dropcols=df.drop(columns=['type', 'fixed acidity', 'citric acid', 'volatile acidity', 'residual sugar', 'chlorides', 'pH', 'sulphates'])
 df_dropcols.isnull().sum()

通過刪除行,我們最終得到一個更短的數據集。當刪除特征時,我們最終會得到一個完整的數據集,但會丟失某些特征。

print("Shape when dropping rows: ", df_droprows.shape)
 print("Shape when dropping features: ", df_dropcols.shape)

這兩種方法都最直接的方法,而且都會導致丟失有價值的數據——所以一般情況下不建議使用。

均值/中值插補

下一個初級的方法是用特征的平均值或中值替換缺失的值。在這種情況下不會丟失特征或行。但是這種方法只能用于數值特征(如果使用平均值,我們應該確保數據集沒有傾斜或包含重要的異常值)。

比如下面用均值來計算缺失值:

df=df.fillna(df.mean())

現在讓我們檢查其中一個估算值:

df[df.index==86]

如果要用中值,可以使用:

df = df.fillna(df.median())
 df[df.index==86]

可以看到這里中值和平均值還是有區別的

眾數

與上面的方法一樣,該方法用特征的模式或最常見的值替換缺失的值。這種方法可以用于分類特征。

首先,讓我們檢查一下是否有一個類別占主導地位。我們可以通過value_counts方法來實現:

df['type'].value_counts()

可以看到有一個“白色”數量最多。因此可以用下面的方式進行填充:

df['type'] =df['type'].fillna(df['type'].mode())

Scikit-Learn的SimpleImputer類

也可以使用Scikit-learn的SimpleImputer類執行平均值、中值和眾數的插補。將策略設置為“mean”,“median”或“most_frequency”即可

df_numeric=df.drop(columns='type')
 imputer_median=SimpleImputer(strategy='median')
 imputer_median.fit(df_numeric)
 df_imputed_median=pd.DataFrame(imputer_median.transform(df_numeric), columns=df_numeric.columns)
 df_imputed_median.head()

我們也可以將策略設置為' constant ',并指定' fill_value '來填充一個常量值。

均值/中位數/眾數的優點:

  • 簡單和快速實現
  • 它保留了樣本量,并降低了下游分析(如機器學習模型)的偏差風險。
  • 與更復雜的方法相比,它的計算成本更低。

缺點:

  • 沒有說明數據的可變性或分布,可能會導致估算值不能代表真實值。
  • 可能會低估或高估缺失值,特別是在具有極端值或異常值的數據集中。
  • 減少方差和人為夸大相關系數在估算數據集。
  • 它假設缺失的值是完全隨機缺失(MCAR),這可能并不總是這樣

使用領域知識進行評估

處理缺失數據的另一種可能方法是使用基于領域知識或業務規則的估計來替換缺失的值。可以通過咨詢相關領域的專家,讓他們提供專業的見解,這樣能夠估算出合理和可信的缺失值。

但是這種方法并不一定在現實中就能夠很好的實施,因為我們需要專業的人士來確保它產生準確和可靠的估算,但是這樣的領域專家并不多。所以我們這里把它歸在初級方法中。

中級方法

還有一些稍微高級一些的技術來填充那些缺失的值,我們將使用預測模型來解決問題。但在此之前需要更好地理解缺失值的性質。

缺失值的類型

在我們繼續使用更高級的技術之前,需要考慮一下在數據集中可能遇到的缺失類型。數據集中有不同類型的缺失,了解缺失類型有助于確定合適的方法。以下是一些常見的類型:

完全隨機缺失( Missing Completely at Random):在這種類型中,缺失的值是完全隨機的,這意味著一個值缺失的概率不依賴于任何觀察到的或未觀察到的變量。例如,如果一個受訪者在調查中不小心跳過了一個問題,這就是MCAR。

隨機丟失(Missing at Random):在這種類型中,一個值缺失的概率取決于觀察到的變量,而不是值本身。例如,如果調查對象不太可能回答敏感問題,但不回答問題的傾向取決于可觀察到的變量(如年齡、性別和教育),那么這就是MAR。

非隨機丟失(Missing Not at Random):在這種類型中,一個值缺失的概率取決于未觀察到的變量,包括缺失值值本身。例如,如果抑郁程度較高的個體不太可能報告他們的抑郁水平,而不報告的傾向在數據中是無法觀察到的,那么這就是MNAR。

回歸插補

我們將使用一個回歸模型來對那些缺失的值進行有根據的猜測,通過分析數據集中的其他特征,并使用它們的相關性來填補。

在處理遵循某種模式(MAR或MCAR)的缺失數據時,回歸插補特別有用。因為當特征之間存在很強的相關性時,這種方法很有效。

我們這里將創建一個不包含分類特征的數據版本。然后以為每一列的缺失值擬合線性回歸模型。這里就需要使用Scikit-learn的線性回歸模塊。

importpandasaspd
 fromsklearn.linear_modelimportLinearRegression
 
 # Read data
 df=pd.read_csv('Wine_Quality.csv')
 
 # Make sub dataframe with only numeric features
 df=df.drop(columns='type')
 
 # Separate the columns with missing values
 missing_cols=df.columns[df.isna().any()].tolist()
 non_missing_cols=list(set(df.columns) -set(missing_cols))
 
 print(missing_cols)
 
 # loop over each column with missing values
 forcolinmissing_cols:
     # Create a copy of the dataframe without missing values in the current column
     df_temp=df.dropna(subset=[col] +non_missing_cols)
     
     # Split the dataframe into features (X) and target variable (y)
     X=df_temp[non_missing_cols]
     y=df_temp[col]
     
     # Create and fit a linear regression model
     lr=LinearRegression()
     lr.fit(X, y)
     
     # Impute missing values in the current column using the fitted model
     df.loc[df[col].isna(), col] =lr.predict(df.loc[df[col].isna(), non_missing_cols])

回歸插補的優點:

  • 可以處理大量缺失值。
  • 可以保留數據集的統計屬性,例如均值、方差和相關系數。
  • 可以通過減少偏差和增加樣本量來提高下游分析(例如機器學習模型)的準確性。

回歸插補的缺點:

  • 它假設缺失變量和觀察到的變量之間存在線性關系。
  • 如果缺失值不是隨機缺失 (MAR) 或完全隨機缺失 (MCAR),則可能會引入偏差。
  • 可能不適用于分類或有序變量。
  • 在計算上昂貴且耗時,尤其是對于大型數據集。

(KNN) 插補

另一種方法是聚類模型,例如K-最近鄰 (KNN) 來估計那些缺失值。這與回歸插補類似,只是使用不同的算法來預測缺失值。

importpandasaspd
 fromsklearn.imputeimportKNNImputer
 
 # Read data
 df=pd.read_csv('Wine_Quality.csv')
 
 # Make sub dataframe with only numeric features
 df=df.drop(columns='type')
 
 # create a KNN imputer object
 imputer=KNNImputer(n_neighbors=5)
 
 # impute missing values using KNN
 df=pd.DataFrame(imputer.fit_transform(df), columns=df.columns)

這里我們就要介紹一個包fancyimpute,它包含了各種插補方法:

pip install fancyimpute

使用的方法如下:

# Import the necessary libraries
 importnumpyasnp
 importpandasaspd
 fromfancyimputeimportKNN
 
 # Load the dataset
 df=pd.read_csv('Wine_Quality.csv')
 
 # Drop non-numeric features
 df=df.drop(columns='type')
 
 # Get list of columns with missing values
 missing_cols=df.columns[df.isna().any()].tolist()
 
 # Create an instance of the KNN imputer
 imputer=KNN()
 
 # Fit and transform the imputer to the dataset
 imputed_array=imputer.fit_transform(df[missing_cols])
 
 # Replace the missing values in the original dataset
 df[missing_cols] =imputed_array
 
 # View the imputed dataset
 df

KNN 插補的優點:

  • 可以捕獲變量之間復雜的非線性關系。
  • 不對數據的分布或變量之間的相關性做出假設。
  • 比簡單的插補方法(例如均值或中值插補)更準確,尤其是對于中小型數據集。

缺點:

  • 計算上可能很昂貴,尤其是對于大型數據集或高維數據。
  • 可能對距離度量的選擇和選擇的最近鄰居的數量敏感,這會影響準確性。
  • 對于高度傾斜或稀疏的數據表現不佳。

高級方法

通過鏈式方程 (MICE) 進行多元插補

MICE 是一種常用的估算缺失數據的方法。它的工作原理是將每個缺失值替換為一組基于模型的合理值,該模型考慮了數據集中變量之間的關系。

該算法首先根據其他完整的變量為數據集中的每個變量創建一個預測模型。然后使用相應的預測模型估算每個變量的缺失值。這個過程重復多次,每一輪插補都使用前一輪的插補值,就好像它們是真的一樣,直到達到收斂為止。

然后將多個估算數據集組合起來創建一個最終數據集,其中包含所有缺失數據的估算值。MICE 是一種強大而靈活的方法,可以處理具有許多缺失值和變量之間復雜關系的數據集。它已成為許多領域(包括社會科學、健康研究和環境科學)中填補缺失數據的流行選擇。

fancyimpute包就包含了這個方法的實現,我們可以直接拿來使用

importnumpyasnp
 importpandasaspd
 fromfancyimputeimportIterativeImputer
 
 # Read data
 df=pd.read_csv('Wine_Quality.csv')
 
 # Convert type column to category (so that miceforest can handle as a categorical attribute rather than string)
 df=df.drop(columns='type')
 
 # Get list of columns with missing values
 missing_cols=df.columns[df.isna().any()].tolist()
 
 # Create an instance of the MICE algorithm
 imputer=IterativeImputer()
 
 # Fit the imputer to the dataset
 imputed_array=imputer.fit_transform(df[missing_cols])
 
 # Replace the missing values in the original dataset
 df[missing_cols] =imputed_array
 
 # View the imputed dataset
 df

這個實現沒法對分類變量進行填充,那么對于分類變量怎么辦呢?

MICEforest

MICEforest 是 MICE的變體,它使用 lightGBM 算法來插補數據集中的缺失值,這是一個很奇特的想法,對吧。

我們可以使用 miceforest 包來實現它

pipinstallmiceforest
 #或
 condainstall-cconda-forgemiceforest

使用也很簡單:

importpandasaspd
 importmiceforestasmf
 
 # Read data
 df=pd.read_csv('Wine_Quality.csv')
 
 # Convert type column to category (so that miceforest can handle as a categorical attribute rather than string)
 df['type'] =df['type'].astype('category')
 
 # Create an instance of the MICE algorithm
 imputer=mf.ImputationKernel(data=df, 
                               save_all_iterations=True, 
                               random_state=42)
 
 # Fit the imputer to the dataset. Set number of iterations to 3
 imputer.mice(3, verbose=True)
 
 # Generate the imputed dataset
 imputed_df=imputer.complete_data()
 
 # View the imputed dataset
 imputed_df

可以看到,分類變量 'type' 的缺失值已經被填充了

總結

我們這里介紹了三個層級的缺失值的處理方法,這三種方法的選擇將取決于數據集、缺失數據的數量和分析目標。也需要仔細考慮輸入缺失數據對最終結果的潛在影響。處理缺失數據是數據分析中的關鍵步驟,使用合適的填充方法可以幫助我們解鎖隱藏在數據中的見解,而從主題專家那里尋求輸入并評估輸入數據的質量有助于確保后續分析的有效性。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 機器學習
    +關注

    關注

    66

    文章

    8425

    瀏覽量

    132770
  • python
    +關注

    關注

    56

    文章

    4799

    瀏覽量

    84817
  • Mar
    Mar
    +關注

    關注

    0

    文章

    4

    瀏覽量

    5320
收藏 人收藏

    評論

    相關推薦

    STM32H743ADC數據轉換輸出缺失的原因?

    有突變,現象就像這一區域的模擬數據無法轉換成ADC(32585-32767),這樣的區域在真個ADC轉換范圍并不唯一,而且同一芯片,三個ADC有的
    發表于 03-08 06:39

    如何實現VISA三個不同延遲的獨立循環抓

    第一數據控件每100ms循環抓取儀器的,第二數據控件每500ms循環抓取儀器的,第三個數據控件每800ms循環抓取儀器的
    發表于 03-30 10:02

    處理數據缺失的結構化解決辦法

    就是處理缺失數據。首先我們需要明白的是,沒有任何方法能夠完美解決這個問題。不同問題有不同的數據插補方法——時間序列分析,機器學習,回歸模型等等,很難提供通用解決方案。在這篇文章中,我將
    發表于 10-26 15:36

    FPGA三個按鍵給同一信號賦三個不同的按鍵回彈為 000 后變量的將改變怎么解決?

    FPGA 按鍵問題,三個按鍵給同一信號賦三個不同的,可是按鍵回彈為 000 后變量的將改變,如何解決這個問題呢?
    發表于 05-29 09:33

    鑒別可控硅三個極的方法

    鑒別可控硅三個極的方法 鑒別可控硅三個極的方法很簡單,根據P-N結的原理,只要用萬用表測量一下三個極之間的電
    發表于 01-14 16:20 ?1263次閱讀

    無線傳感網絡缺失估計方法

    針對無線傳感器網絡(WSN)中感知數據易缺失問題,提出了一種基于感知數據屬性相關性的缺失估計方法。該方法采用多元線性回歸模型,對屬性相關的
    發表于 12-27 16:56 ?0次下載

    一文讀懂處理器,內核,芯片三個概念的區別

    本文對處理器、內核和芯片的這三個概念分別進行了介紹,最后總結處理器,內核,芯片這三個概念的區別。
    的頭像 發表于 04-23 15:42 ?7.9w次閱讀
    一文讀懂<b class='flag-5'>處理</b>器,內核,芯片<b class='flag-5'>三個</b>概念的區別

    缺失處理你確定你真的會了嗎

    缺失處理是一數據分析工作者永遠避不開的話題,如何認識與理解缺失,運用合適的方式
    的頭像 發表于 10-11 11:21 ?4692次閱讀
    <b class='flag-5'>缺失</b><b class='flag-5'>值</b><b class='flag-5'>處理</b>你確定你真的會了嗎

    工業4.0的工廠自動化系統通常主要包括三個層級的設備

    針對工業4.0的工廠自動化系統通常主要包括三個層級的設備,用于驅動實時通信和控制: 在現場層級,I/O模塊、制動器和驅動器負責工廠內的物理運作; 在控制層級,可編程邏輯控制器(
    的頭像 發表于 01-26 15:50 ?3812次閱讀
    工業4.0的工廠自動化系統通常主要包括<b class='flag-5'>三個</b><b class='flag-5'>層級</b>的設備

    三個不同的去耦電容器

    今天的許多設計都包括三個不同的去耦電容器,或者當只使用一電容器時,可以使用 0.1 uF 這樣的小。這些建議基于 50 年前不適用的假設。是時候重新考慮這些過時的遺留設計指南了。
    的頭像 發表于 07-19 17:30 ?1458次閱讀

    數據清洗、缺失填充和異常值處理

    綜上所述,數據清洗、缺失填充和異常值處理對數據分析非常重要,并且 MATLAB 提供了許多工具來實現這些步驟。可以根據具體情況選擇合適的函數和方法來處理數據。
    的頭像 發表于 06-21 15:30 ?2987次閱讀

    mosfet的三個電極怎么區分 mos管三個極電壓關系

    MOSFET(金屬氧化物半導體場效應晶體管)有三個主要電極,分別是柵極(Gate)、漏極(Source)和源極(Drain)。這三個電極的區分方法如下
    的頭像 發表于 09-18 12:42 ?3.4w次閱讀

    電工三個要點準確判斷和處理故障關鍵

    在電力工作中,電工們需要具備多種技能和素質,其中最為重要的三個要素是“聽”、“看”、“摸”。這三個要素是電工們在工作中迅速準確地判斷和處理故障的關鍵。
    的頭像 發表于 11-09 11:39 ?698次閱讀

    python中input怎么輸入3

    () 函數,每一函數用于獲取一。例如,如果你想要輸入三個整數,你可以這樣寫: a = int ( input ( "請輸入第一整數:
    的頭像 發表于 11-23 15:31 ?1w次閱讀

    eda中常用的數據處理方法

    奠定基礎。 數據清洗 缺失處理 數據集中的缺失是常見的問題。處理
    的頭像 發表于 11-13 10:57 ?358次閱讀
    主站蜘蛛池模板: 韩国精品无码少妇在线观看网站| 大地影院日本韩国电影免费观看| 日韩人妻无码精品久久中文字幕 | bl高h肉文| 最近免费中文MV在线字幕| 亚洲欧美日韩在线码不卡 | gogogo高清在线观看| 99精品国产在热久久| 99精产国品一二产区在线| 97成人精品视频在线播放| 24小时日本在线电影| 2020久久精品永久免费| 51精品少妇人妻AV一区二区| 中文字幕亚洲无线码高清不卡| 伊人久久天堂| 伊人久久丁香色婷婷啪啪| 医生含着我的奶边摸边做| 中国明星16xxxxhd| 9477小游戏| FERRCHINA内入内射| xxxx69美国| 囯产愉拍亚洲精品一区| 国产精品日韩欧美一区二区三区| 国产精品AV色欲蜜臀在线| 国产人妻麻豆蜜桃色在线| 國產麻豆AVMDXMDX| 久久精品国产亚洲AV热无遮挡| 久久久96| 男女高潮又爽又黄又无遮挡 | 少妇无码太爽了视频在线播放| 熟女人妻久久精品AV天堂| 性奴公司 警花| 亚洲呦女专区| 777EY_卡通动漫_1页| DASD-700美谷朱里| 儿子日母亲B好爽| 国产在线观看网址你懂得| 久久精品中文字幕免费| 暖暖 免费 高清 日本在线| 日韩精品特黄毛片免费看| 午夜向日葵视频在线观看|