我成功地应用了四分位距原则,但在显示去除异常值后的数据集的箱形图时,我发现总有一些异常值。这是怎么回事?我这里是代码:
# 加载库import pandas as pd;from pandas import read_csv, set_option;from matplotlib import pyplot as plt;# 加载数据集filename = "/home/fogang/dataset/Regression/Housing Boston/housing.csv";df = read_csv(filename, header=0);df = df.drop('Unnamed: 0', axis=1); # 让我们删除'Unnamed: 0'列one_dim = pd.DataFrame();one_dim['rm'] = df['rm'];# 数据集形状print(one_dim.shape);# 查看数据集print(one_dim.head(10));# 检查是否有NaN值print(one_dim.isnull().sum());# 箱形图one_dim.plot(kind='box', subplots=True, layout=(1, 1), sharex=False, sharey=False, fontsize=12);plt.show();# 描述数据集print(one_dim.describe());# 让我们找出四分位距unidim = one_dim['rm'];unidim_Q1 = unidim.quantile(0.25);unidim_Q3 = unidim.quantile(0.75);unidim_IQR = unidim_Q3 - unidim_Q1;unidim_lower = unidim_Q1 - (1.5 * unidim_IQR);unidim_upper = unidim_Q3 + (1.5 * unidim_IQR);# 异常值unidim_outliers = pd.DataFrame();unidim_outliers['outliers'] = unidim[(unidim < unidim_lower) | (unidim > unidim_upper)]unidim_outliers.info()# 良好数据unidim_good = pd.DataFrame();unidim_good['good'] = unidim[(unidim >= unidim_lower) & (unidim <= unidim_upper)];unidim_good.info();unidim_good.plot(kind='box', subplots=True, layout=(1, 2), sharex=False, sharey=False, fontsize=12);plt.show();
该怎么做?
回答:
你的数据集两端(上尾和下尾)的异常值分布非常广泛。因此,当你去除一些异常值并再次检查时,截取的数据中会出现新的异常值。如果你想通过一次截取完全去除异常值,可以使用更严格的规则进行截取,例如这样做:
unidim_lower = unidim_Q1 - (1.3 * unidim_IQR);unidim_upper = unidim_Q3 + (1.3 * unidim_IQR);
但我必须提醒你:并不是所有的“异常值”对模型都是有害的,你应该谨慎选择哪些被视为“异常值”,哪些是有用的数据。