从 pandas 中移除不同类型的异常值

Remove outliers from pandas with different types

目前正在处理回归问题,我在模型性能方面遇到了一些问题。为了 'maybe' 获得更好的性能,我想删除一些异常值。

问题:从包含不同类型的数据框中删除异常值。

DF 看起来像:

   df.dtypes
CONTRACT_TYPE                           object
CONTRACT_COC                            object
ORIGINATION_DATE                datetime64[ns]
MATURITY_DATE                   datetime64[ns]
ORIGINAL_TERM                          float64
REMAINING_TERM                           int64
INTEREST_RATE_INTERNAL                 float64
INTEREST_RATE_FUNDING                  float64

然而,在尝试如下所示的代码后,没有成功,甚至没有 zscore,我正在寻求帮助。

# Computing IQR
Q1 = df.quantile(0.25)
Q3 = df.quantile(0.75)
IQR = Q3 - Q1

df_out = df[~((df < (Q1 - 1.5 * IQR)) |(df > (Q3 + 1.5 * IQR))).any(axis=1)]

总而言之,我希望在图表(散点图、箱线图)中看到更多 'normal' 分布,没有或有更少的异常值。

如果您需要更多信息,请不要犹豫。

首先,我假设你的数据分布是正常的。 这是删除异常值的好策略。

  1. 制作一个 Pandas 具有所有数值特征的数据框,其中有异常值。
  2. 在您的 Dataframe 上使用 sklearn.preprocessing.StandardScaler。它通过去除均值和缩放到单位方差来标准化特征。实现很简单,如下;

    # Declare Sklearn standard_scaler
    standard_scaler = StandardScaler(copy=True, with_mean=True, with_std=True)        
    
    # Fitting
    standard_scaler.fit(x_train_df)        
    
    # Transforming
    x_train_normal_scaled_df = standard_scaler.transform(x_train_df)        
    
    # Fitting and Transforming together 
    x_train_normal_scaled_df = x_scaler_lev1.fit_transform(x_train_df)        
    
    # Inverting the transformed data back.
    x_train_df = standard_scaler.inverse_transform()
    
    print(x_train_normal_scaled_df.describe())
    x_train_normal_scaled_df.plot()
    
  3. 您应该找出您的数据中有多少是异常值。 Empirical Rule of Normal Distribution 可以在这里提供帮助。

在实验上,我总是选择3倍标准差范围内的数据作为我的主要数据,超出这个范围的就是离群值。正态分布可以保证主要数据有大约99.73%的信息。