我正在对UCI的“成人数据集”做一些数据分析。我有一个名为“每周小时”的数字特征和另一个叫做“年龄”的特征。这些是我在dataset中考虑的唯一的数值特性。我为每一项功能做了一个盒形图,以确定是否存在异常值,如下所示。
# Select the numerical variables of interest
num_vars = ['age', 'hours-per-week']
# Create a dataframe with the numerical variables
data = df[num_vars]
# Plot side by side vertical boxplots for each variable
fig, axes = plt.subplots(nrows=1, ncols=len(num_vars), figsize=(10,5))
for i, var in enumerate(num_vars):
sns.boxplot(y=var, data=data, ax=axes[i])
axes[i].set_ylabel(var)
plt.tight_layout()
plt.show() 这是输出:

通过收集数据,我能够处理“年龄”异常值。然而,对于“每周小时数”的离群点来说,效果并不好:
from scipy.stats.mstats import winsorize
# Winsorize the 'age' column
age_wins = winsorize(df['age'], limits=[0.05, 0.05])
# Winsorize the 'hours-per-week' column
hours_wins = winsorize(df['hours-per-week'], limits=[0.05, 0.1])
# Create a new dataframe without the outliers
df_wins = df.assign(age=age_wins, hours_per_week=hours_wins)
# Select the numerical variables of interest
num_vars = ['age', 'hours-per-week']
# Create a dataframe with the numerical variables
data = df_wins[num_vars]
# Plot side by side vertical boxplots for each variable
fig, axes = plt.subplots(nrows=1, ncols=len(num_vars), figsize=(10,5))
for i, var in enumerate(num_vars):
sns.boxplot(y=var, data=data, ax=axes[i])
axes[i].set_ylabel(var)
plt.tight_layout()
plt.show()下面是后面的输出:

我试图在为“每周小时”的功能赢得数据时增加限制,但它也不起作用,而且似乎也不是处理它的最佳方法。
下面是所讨论的变量的分布:

我不知道是否应该删除这些异常值,我的目标是以后在分类机器学习模型中实现这些数据。
我尝试使用IQR方法删除异常值,但它也没有删除这些异常值,而且似乎也不是处理这些异常值的正确方法。
发布于 2023-04-13 02:23:37
让我们退一步:为什么我们要删除异常值?
答:因为它们阻碍了我们的申请。尽管如此,在某些应用中,异常值是非常有用的,我们不想扔掉。
例如,假设我有一个特征,即顾客从我的商店购买商品的频率(每周)有多频繁,而且有几个异常值具有很高的购买频率。如果我的目标是“将客户分为高的和低的终身价值”,我是否应该抛弃这些“离群点”?可能不会。他们是有价值的顾客。
另一个例子。我在野外有几个温度感应器。他们通常在摄氏10-30度之间读书,但有一次读200度.
我应该删除这个“离群点”吗?可能是的,因为这是传感器故障,很可能是。然而,如果这些传感器位于核电站内,我肯定不会这么做,我正在为核电站编写一个警报系统。
回到您的问题:如何处理异常值取决于您的确切应用程序;由于您只泛泛地声明应用程序是“分类机器学习模型”,我建议您保留所有数据点,直到有了可靠的应用程序为止。这些“异常值”很有可能对你的工作很有价值。
https://datascience.stackexchange.com/questions/120788
复制相似问题