首页 > 解决方案 > 从不同类型的熊猫中去除异常值

问题描述

目前正在研究回归问题,我在模型的性能方面面临一些问题。为了“也许”有更好的表现,我有一些我想删除的异常值。

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

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)]

总而言之,我想在图表(散点图、箱线图)中看到一个更“正态”的分布,没有或有更少的异常值。

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

标签: pandasjupyter-notebooknumericcategorical-dataoutliers

解决方案


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

  1. 制作一个包含所有数值特征的 Pandas 数据框,其中包含异常值。
  2. 在您的数据框上使用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. 您应该找出有多少数据是异常值。正态分布的经验法则在这里可以提供帮助。

经验法则

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


推荐阅读