Удалить выбросы из панд с различными типами - PullRequest
0 голосов
/ 10 июля 2019

В настоящее время работаю над проблемой регрессии, у меня возникают некоторые проблемы с производительностью моделей. Чтобы иметь «возможно» лучшую производительность, у меня есть некоторые выбросы, которые я бы хотел удалить.

Проблема: удаление выбросов из информационного кадра, содержащего различные типы.

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

Подводя итог, я хотел бы видеть на графиках (scatter, boxplot) более «нормальное» распределение без или с меньшим количеством выбросов.

Пожалуйста, не стесняйтесь, если вам нужна дополнительная информация.

1 Ответ

0 голосов
/ 11 июля 2019

Прежде всего, я предполагаю, что ваше распределение данных нормальное. Вот отличная стратегия для устранения выбросов.

  1. Создайте Pandas Dataframe со всеми числовыми функциями, который имеет выбросы.
  2. Используйте sklearn.preprocessing.StandardScaler на вашем Dataframe. Он стандартизирует функции, удаляя среднее значение и масштабируя до единичной дисперсии. Реализация так же проста, как показано ниже:

    # 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

Экспериментально, я всегда выбираю данные в диапазоне от 3-х раз стандартного отклонения, поскольку мои основные данные и вне этого диапазона будут выбросы. Нормальное распределение гарантирует, что основные данные содержат около 99,73% информации.

...