【问题标题】:Remove outliers from pandas with different types从不同类型的熊猫中去除异常值
【发布时间】:2019-11-20 04:55:44
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 你能分享一些示例数据吗?
  • 没有上下文,我只能建议查看scipy.stats.zscore。它计算给定列的 z 分数(不是整个数据框,至少我不这么认为),您可以根据值(2.58 或 1.96)轻松删除异常值
  • 您要从哪些列中删除异常值?我想不是日期或对象类型?
  • 感谢您的快速回复!目的是删除所有表的异常值(但也许这是没有意义的)。但是,即使我只想删除数值的异常值,如何在不创建 2 个数据帧(一个使用 get_numeric,另一个使用其他类型)的情况下做到这一点。因此,在这种情况下,我必须合并它们并且数据不会位于同一位置?如果你有任何线索,请告诉我

标签: pandas jupyter-notebook numeric categorical-data outliers


【解决方案1】:

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

  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. 您应该找出有多少数据是异常值。 Empirical Rule of Normal Distribution 可以在这里提供帮助。

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

【讨论】:

    猜你喜欢
    • 2018-01-09
    • 2021-07-20
    • 2012-12-08
    • 1970-01-01
    • 2020-07-26
    • 1970-01-01
    • 2018-02-24
    • 2015-07-14
    • 2021-05-03
    相关资源
    最近更新 更多