数据集中的离群值(或者说异常值)是一个杂集。一方面,它们可能包含关键信息,因为它们与主体部分有很大区别。另一方面,由于我们必须看得更远才能看到离群值,所以他们抛弃了我们对主体部分的观察。在ML方面,包含离群值的训练可能会使你的模型得到很好的概括性,但也会远离从大多数数据所在的主体部分。
一般来说,我推荐有无离群值的情况都要考虑。无论是否有离群值,都可以研究你的数据。如果你认为ML模型需要它们,那么选择一个足够稳健的方法来处理它们。如果你发现那些异常值对于获取数据信息和数据建模没有用处,那么最好删除它们,如上一节所示。
此外,如果想要过滤掉这些异常值,可以使用以下方法:
# Get the 98th and 2nd percentile as the limits of our outliers
upper_limit = np.percentile(train_df.logerror.values, 98)
lower_limit = np.percentile(train_df.logerror.values, 2)
# Filter the outliers from the dataframe
data[‘target’].loc[train_df[‘target’]>upper_limit] = upper_limit data[‘target’].loc[train_df[‘target’]
包含异常值的图(左)和删除了异常值的直方图(右)
错误和重复的数据
错误的数据的意思是不应存在或者完全错误的数据点或值。例如,假设你的一个特征变量称为“性别”,其中大多数值是“男性”或“女性”。但是当你浏览数据集时,你会注意到有几个数据点的“性别”的值为67.3。显然67.3在这个变量的环境中没有任何意义。此外,如果你尝试将“性别”特征变量转换为分类浮点数:male = 0.0且female = 1.0,那么,你需要额外做一个:67.3 = 2.0!
重复的数据是数据集中完全重复的数据点。如果有太多这种数据,它会影响ML模型的训练。如前所述,可以简单地从你的数据中删除重复数据。
可以通过删除或使用某些智能替换来处理错误数据。比如,我们可能会查看所有具有67.3性别的数据点,然后发现这些数据点,正确的值应为“女性”。因此,我们只需将所有67.3转换为“女性”即可。这样做的好处是我们已经有效地获得了用于ML训练的的数据点,而不必直接删除。pandas中的转换如下:
value_map = {'male': 'male', 'female': 'female', '67.3': 'female'}
pd_dataframe['gender'].map(value_map)
不相关的特征
并非所有特征的价值都相同。有些特征可能根本不需要!例如,你查看过去一年从亚马逊购买的书籍数据集,其中一个特征变量称为“font-type”,表示书中使用的字体类型。这与预测图书的销售情况是无关的!你可以放心的删除它,如下所示:
df.drop('feature_variable_name', axis=1)
这样做会减少你查看的内容,从而使你更容易探索数据集。它还有助于更快、更简单的训练你的ML模型,因为你不需要处理那么多数据。如果你不确定变量是否重要,你可以研究完数据集之后再决定。计算特征变量和目标输出之间的相关性矩阵可以帮助确定变量的重要性。
当你的特征变量无用时
标准化
每个特征变量中的所有数据都应采用相同的标准化格式。这会让你的数据探索和建模的变得更加容易。例如,让我们仍然以“男性”或“女性”的值来举例说明“性别”变量。如果数据是由人类收集的,那么你可能会得到不同的值:
- male, female (正常的)
- MALE, FEMALE (大写的)
- Male, Female (首字母大写的)
- Make, Femall (写错的)
如果我们要继续将特征变量转换为分类浮点数,我们比如有很多个值!也就是说,实际上我们会像下面这样做:
{
'male': 0,
'female': 1,
'MALE': 2,
'FEMALE': 3,
'Male': 4,
'Female': 5,
'Make': 6,
'Femall': 7
}
有几种方法可以处理这种情况。比如,让所有字母小写或者让首字母大写,如下:
# Make the whole string lower case
s.lower()
# Make the first letter capitalised
s.capitalize()
如果有拼写错误,那么你需要使用映射函数:
value_map = {'Make': 'male', 'Femall': 'female'}
pd_dataframe['gender'].map(value_map)