Hướng dẫn how do you remove outliers from a dataframe in python? - làm thế nào để bạn loại bỏ các ngoại lệ khỏi khung dữ liệu trong python?

Trước khi trả lời câu hỏi thực tế, chúng ta nên hỏi một câu hỏi khác rất phù hợp tùy thuộc vào bản chất của dữ liệu của bạn:

Một ngoại lệ là gì?

Hãy tưởng tượng một loạt các giá trị [3, 2, 3, 4, 999] (trong đó 999 dường như không phù hợp) và phân tích nhiều cách phát hiện ngoại lệ khác nhau

Z-Score

Vấn đề ở đây là giá trị trong câu hỏi làm biến dạng các biện pháp của chúng tôi meanstd rất nhiều, dẫn đến các điểm Z không đáng kể của [-0.5, -0.5, -0.5, -0.5, 2.0], giữ mọi giá trị trong hai độ lệch chuẩn của giá trị trung bình. Do đó, một ngoại lệ rất lớn có thể làm biến dạng toàn bộ đánh giá của bạn về các ngoại lệ. Tôi sẽ không khuyến khích cách tiếp cận này.

Bộ lọc lượng tử

Một cách tiếp cận mạnh mẽ hơn được đưa ra là câu trả lời này, loại bỏ phần dưới cùng và 1% dữ liệu hàng đầu. Tuy nhiên, điều này giúp loại bỏ một phân số cố định độc lập của câu hỏi nếu những dữ liệu này thực sự là ngoại lệ. Bạn có thể mất rất nhiều dữ liệu hợp lệ và mặt khác vẫn giữ một số ngoại lệ nếu bạn có hơn 1% hoặc 2% dữ liệu của mình dưới dạng ngoại lệ.

IQR-Phân tích từ trung bình

Thậm chí phiên bản mạnh mẽ hơn của nguyên tắc lượng tử: Loại bỏ tất cả dữ liệu nhiều hơn f lần phạm vi liên vùng cách xa trung bình của dữ liệu. Đó cũng là sự chuyển đổi mà ____ 9 của ____ 9 sử dụng chẳng hạn. IQR và Median mạnh mẽ với các ngoại lệ, vì vậy bạn vượt qua các vấn đề của phương pháp điểm Z.

Trong một phân phối bình thường, chúng tôi có khoảng

df.dropna(subset=cols, inplace=True) # drop rows with NaN in numerical columns
# or
df.dropna(inplace=True)  # drop rows with NaN in any column
1, vì vậy bạn sẽ dịch
df.dropna(subset=cols, inplace=True) # drop rows with NaN in numerical columns
# or
df.dropna(inplace=True)  # drop rows with NaN in any column
2 của bộ lọc điểm Z thành
df.dropna(subset=cols, inplace=True) # drop rows with NaN in numerical columns
# or
df.dropna(inplace=True)  # drop rows with NaN in any column
3 của bộ lọc IQR. Điều này sẽ giảm 999 trong ví dụ trên.

Giả định cơ bản là ít nhất là "nửa giữa" của dữ liệu của bạn là hợp lệ và giống với phân phối tốt, trong khi bạn cũng làm rối nếu phân phối của bạn có đuôi rộng và khoảng Q_25% hẹp đến Q_75%.

Phương pháp thống kê nâng cao

Tất nhiên, có những phương pháp toán học lạ mắt như tiêu chí PEIRCE, bài kiểm tra của Grubb hoặc bài kiểm tra Q của Dixon chỉ để đề cập đến một số ít cũng phù hợp với dữ liệu phân phối không bình thường. Không ai trong số họ dễ dàng thực hiện và do đó không được giải quyết thêm.

Mã số

Thay thế tất cả các ngoại lệ cho tất cả các cột số bằng

df.dropna(subset=cols, inplace=True) # drop rows with NaN in numerical columns
# or
df.dropna(inplace=True)  # drop rows with NaN in any column
5 trên khung dữ liệu ví dụ. Phương pháp này mạnh mẽ chống lại tất cả các DTYPE mà gấu trúc cung cấp và có thể dễ dàng áp dụng cho các khung dữ liệu với các loại hỗn hợp:

import pandas as pd
import numpy as np                                     

# sample data of all dtypes in pandas (column 'a' has an outlier)         # dtype:
df = pd.DataFrame({'a': list(np.random.rand(8)) + [123456, np.nan],       # float64
                   'b': [0,1,2,3,np.nan,5,6,np.nan,8,9],                  # int64
                   'c': [np.nan] + list("qwertzuio"),                     # object
                   'd': [pd.to_datetime(_) for _ in range(10)],           # datetime64[ns]
                   'e': [pd.Timedelta(_) for _ in range(10)],             # timedelta[ns]
                   'f': [True] * 5 + [False] * 5,                         # bool
                   'g': pd.Series(list("abcbabbcaa"), dtype="category")}) # category
cols = df.select_dtypes('number').columns  # limits to a (float), b (int) and e (timedelta)
df_sub = df.loc[:, cols]


# OPTION 1: z-score filter: z-score < 3
lim = np.abs((df_sub - df_sub.mean()) / df_sub.std(ddof=0)) < 3

# OPTION 2: quantile filter: discard 1% upper / lower values
lim = np.logical_and(df_sub < df_sub.quantile(0.99, numeric_only=False),
                     df_sub > df_sub.quantile(0.01, numeric_only=False))

# OPTION 3: iqr filter: within 2.22 IQR (equiv. to z-score < 3)
iqr = df_sub.quantile(0.75, numeric_only=False) - df_sub.quantile(0.25, numeric_only=False)
lim = np.abs((df_sub - df_sub.median()) / iqr) < 2.22


# replace outliers with nan
df.loc[:, cols] = df_sub.where(lim, np.nan)

Để thả tất cả các hàng có chứa ít nhất một giá trị nan:

df.dropna(subset=cols, inplace=True) # drop rows with NaN in numerical columns
# or
df.dropna(inplace=True)  # drop rows with NaN in any column

Sử dụng chức năng Pandas 1.3:

  • df.dropna(subset=cols, inplace=True) # drop rows with NaN in numerical columns
    # or
    df.dropna(inplace=True)  # drop rows with NaN in any column
    
    6
  • df.dropna(subset=cols, inplace=True) # drop rows with NaN in numerical columns
    # or
    df.dropna(inplace=True)  # drop rows with NaN in any column
    
    7
  • df.dropna(subset=cols, inplace=True) # drop rows with NaN in numerical columns
    # or
    df.dropna(inplace=True)  # drop rows with NaN in any column
    
    8
  • df.dropna(subset=cols, inplace=True) # drop rows with NaN in numerical columns
    # or
    df.dropna(inplace=True)  # drop rows with NaN in any column
    
    9

Hướng dẫn how do you remove outliers from a dataframe in python? - làm thế nào để bạn loại bỏ các ngoại lệ khỏi khung dữ liệu trong python?

Bạn có nên xóa các ngoại lệ khỏi bộ dữ liệu không?

Các ngoại lệ là các điểm dữ liệu trong một bộ dữ liệu được coi là cực đoan, sai hoặc không đại diện cho những gì dữ liệu đang mô tả. Những ngoại lệ này có thể được gây ra bởi việc thu thập dữ liệu không chính xác hoặc các quan sát xa xôi chính hãng. Loại bỏ các ngoại lệ này thường sẽ giúp mô hình của bạn khái quát hóa tốt hơn vì những quan sát đuôi dài này có thể làm lệch hướng học tập.

Bạn có nên xóa các ngoại lệ khỏi bộ dữ liệu không?

Các ngoại lệ là các điểm dữ liệu trong một bộ dữ liệu được coi là cực đoan, sai hoặc không đại diện cho những gì dữ liệu đang mô tả. Những ngoại lệ này có thể được gây ra bởi việc thu thập dữ liệu không chính xác hoặc các quan sát xa xôi chính hãng. Loại bỏ các ngoại lệ này thường sẽ giúp mô hình của bạn khái quát hóa tốt hơn vì những quan sát đuôi dài này có thể làm lệch hướng học tập.

Các ngoại lệ nên được xóa khỏi bộ dữ liệu của bạn nếu bạn tin rằng điểm dữ liệu không chính xác hoặc điểm dữ liệu không thể hiện được về tình huống trong thế giới thực đến mức nó sẽ khiến mô hình học máy của bạn không khái quát.

Phương pháp xử lý các ngoại lệ trong khung dữ liệu

  1. Loại bỏ các ngoại lệ khỏi bộ dữ liệu của bạn không nhất thiết là cách tiếp cận duy nhất để thực hiện. Theo nguyên tắc thông tin, có ba lựa chọn mà bạn có thể thực hiện khi muốn đối phó với các ngoại lệ trong bộ dữ liệu của bạn. - The observations are incorrect or not representative of what you are modelling
  2. Xóa - Các quan sát không chính xác hoặc không đại diện cho những gì bạn đang mô hình hóa - You want to keep the observations but need to reduce their extreme nature
  3. Tỷ lệ tái - Bạn muốn giữ các quan sát nhưng cần giảm bớt bản chất cực đoan của chúng - Label the outliers to understand if they had an effect on the model afterwards

Mark - Dán nhãn các ngoại lệ để hiểu nếu chúng có ảnh hưởng đến mô hình sau đó

Các phương pháp để phát hiện các ngoại lệ trong khung dữ liệu gấu trúc

  1. Khi bạn đã quyết định xóa các ngoại lệ khỏi bộ dữ liệu của mình, bước tiếp theo là chọn một phương pháp để tìm chúng. Giả sử rằng bộ dữ liệu của bạn quá lớn để loại bỏ thủ công các dòng theo từng dòng, sẽ được yêu cầu một phương thức thống kê. Có một số cách tiếp cận phổ biến để sử dụng: - Remove the values which are a certain number of standard deviations away from the mean, if the data has a Gaussian distribution
  2. Độ lệch chuẩn - Loại bỏ các giá trị là một số độ lệch chuẩn nhất định so với giá trị trung bình, nếu dữ liệu có phân phối Gaussian - Train a machine learning model on a smaller normal set of observations which can then predict data points outside of this normal set
  3. Phát hiện ngoại lệ tự động - Huấn luyện mô hình học máy trên một bộ quan sát bình thường nhỏ hơn sau đó có thể dự đoán các điểm dữ liệu bên ngoài bộ bình thường này - Remove the values which are above the 75th percentile or below the 25th percentile, doesn't require the data to be Gaussian

Phạm vi liên vùng - Loại bỏ các giá trị cao hơn phần trăm thứ 75 hoặc thấp hơn phần trăm thứ 25, không yêu cầu dữ liệu phải là Gaussian

Có sự đánh đổi cho mỗi tùy chọn này, tuy nhiên phương pháp được sử dụng phổ biến nhất trong ngành là độ lệch chuẩn hoặc điểm Z-Score.

Cách tiếp cận độ lệch chuẩn để loại bỏ các ngoại lệ yêu cầu người dùng chọn một số độ lệch chuẩn để phân biệt ngoại lệ với không thoát ra.

Điều này sau đó đặt ra câu hỏi, bạn nên chọn bao nhiêu độ lệch chuẩn?

Thực tiễn công nghiệp chung là sử dụng 3 độ lệch chuẩn từ trung bình để phân biệt ngoại lệ với không xa hơn. Bằng cách sử dụng 3 độ lệch chuẩn, chúng tôi loại bỏ các trường hợp cực đoan 0,3%. Tùy thuộc vào trường hợp sử dụng của bạn, bạn có thể muốn xem xét sử dụng 4 độ lệch chuẩn sẽ chỉ loại bỏ 0,1%hàng đầu.

Xóa các ngoại lệ trong gấu trúc DataFrame bằng cách sử dụng độ lệch chuẩn

Cách tiếp cận phổ biến nhất để loại bỏ các điểm dữ liệu khỏi bộ dữ liệu là độ lệch chuẩn hoặc cách tiếp cận điểm z. Trong ví dụ này, tôi sẽ chỉ ra cách tạo một chức năng để loại bỏ các ngoại lệ nằm cách xa hơn 3 độ lệch chuẩn so với giá trị trung bình:

import pandas as pd

def remove_outliers(df,columns,n_std):
    for col in columns:
        print('Working on column: {}'.format(col))
        
        mean = df[col].mean()
        sd = df[col].std()
        
        df = df[(df[col] <= mean+(n_std*sd))]
        
    return df

Những bài viết liên quan

Tỷ lệ cột vách mã hóa Cột loc vs ILOC
Label encode columns
loc vs iloc

Người giới thiệu

Gấu trúc trung bình tài liệu
Pandas standard deviation documentation
Scipy z-score documentation
Sklearn outlier detection documentation

Hướng dẫn how do you remove outliers from a dataframe in python? - làm thế nào để bạn loại bỏ các ngoại lệ khỏi khung dữ liệu trong python?

Tôi là một nhà khoa học dữ liệu hiện đang làm việc cho ODA, một nhà bán lẻ tạp hóa trực tuyến, ở Oslo, Na Uy. Những bài viết này là cách tôi chia sẻ một số mẹo và thủ thuật tôi đã chọn trên đường đi.

Oslo, Na Uy

Làm thế nào để bạn loại bỏ các ngoại lệ khỏi khung dữ liệu trong Python?

Đối với mỗi chuỗi trong DataFrame, bạn có thể sử dụng giữa và lượng tử để loại bỏ các ngoại lệ ...
Khung dữ liệu.select_dtypes ().
Khung dữ liệu.Lượng tử ().
Khung dữ liệu.ở đâu().
Khung dữ liệu.dropna ().

Làm thế nào để bạn loại bỏ các ngoại lệ khỏi cột DataFrame?

Conclusion..
Gán các cột mới cho DataFrame ..
Loại trừ các ngoại lệ trong một cột ..
Chọn hoặc thả tất cả các cột bắt đầu bằng 'X'.
Chỉ các hàng bộ lọc chỉ khi cột chứa các giá trị từ một danh sách khác ..

Làm thế nào để bạn đối xử với các ngoại lệ trong gấu trúc DataFrame?

Các phương pháp để phát hiện các ngoại lệ trong khung dữ liệu gấu trúc Có một số cách tiếp cận phổ biến để sử dụng: độ lệch chuẩn - loại bỏ các giá trị là một số độ lệch chuẩn nhất định so với giá trị trung bình, nếu dữ liệu có phân phối Gaussian.Standard deviation - Remove the values which are a certain number of standard deviations away from the mean, if the data has a Gaussian distribution.

Làm thế nào để bạn tìm thấy các ngoại lệ trong DataFrame Python?

Tìm kiếm các ngoại lệ bằng các phương pháp thống kê bằng IQR, các điểm dữ liệu ngoại lệ là các phương pháp giảm xuống dưới Q1 Tiết1.5 IQR hoặc trên Q3 + 1.5 IQR.Q1 là phần trăm thứ 25 và Q3 là phần trăm thứ 75 của bộ dữ liệu và IQR đại diện cho phạm vi liên vùng được tính toán bởi Q3 trừ Q1 (Q3, Q1).Using the IQR, the outlier data points are the ones falling below Q1–1.5 IQR or above Q3 + 1.5 IQR. The Q1 is the 25th percentile and Q3 is the 75th percentile of the dataset, and IQR represents the interquartile range calculated by Q3 minus Q1 (Q3–Q1).