通常,此平均值与整个数据集的结果概率混合,以减少很少出现的值的方差。请务必注意,由于类别值是根据输出值计算的,因此这些计算应在训练数据集上完成,然后应用于其他数据集。否则,我们将面临信息泄漏,这意味着我们将在训练集内包含有关测试集输出值的信息。这将使我们的测试无效或给我们虚假的信心。好吧,让我们看看如何在代码中执行此操作:
categorical_data["species"] = categorical_data["species"].cat.codes
island_means = categorical_data.groupby('island')['species'].mean()
sex_means = categorical_data.groupby('sex')['species'].mean()
在这里,我们对输出特征使用标签编码,然后计算分类特征"岛"和"性别"的平均值。以下是我们为"岛屿"功能获得的内容:
island_means
island
Biscoe 1.473054
Dream 0.548387
Torgersen 0.000000
这意味着值 Biscoe、Dream 和 Torgersen 将分别替换为值 1.473054、0.548387 和 0。对于"性别"功能,我们也有类似的情况:
sex_means
sex
FEMALE 0.909091
MALE 0.921348
这意味着值 FEMALE 和 MALE 将分别替换为 0.909091 和 0.921348。以下是数据集中的外观:
categorical_data['island_target_enc'] = categorical_data['island'].map(island_means)
categorical_data['sex_target_enc'] = categorical_data['sex'].map(sex_means)
categorical_data
我们在本教程中探讨的最后一种编码类型是建立在目标编码之上的。它的工作方式与目标编码相同,但有一个区别。当我们计算样本的平均输出值时,我们排除了该样本。下面是在代码中完成它的方法。首先,我们定义一个执行以下操作的函数:
def leave_one_out_mean(series):
series = (series.sum() - series)/(len(series) - 1)
return series
然后,我们将其应用于数据集中的分类值:
categorical_data['island_loo_enc'] = categorical_data.groupby('island')['species'].apply(leave_one_out_mean)
categorical_data['sex_loo_enc'] = categorical_data.groupby('sex')['species'].apply(leave_one_out_mean)
categorical_data
异常值是偏离数据整体分布的值。有时这些值是错误的和错误的测量值,应该从数据集中删除,但有时它们是有价值的边缘情况信息。这意味着有时我们希望将这些值保留在数据集中,因为它们可能携带一些重要信息,而其他时候我们希望删除这些样本,因为信息错误。
简而言之,我们可以使用四分位数间范围来检测这些点。四分位数间范围或 IQR 指示 50% 的数据所在的位置。当我们寻找这个值时,我们首先寻找中位数,因为它将数据分成两半。然后,我们定位数据下端的中位数(表示为Q1)和数据较高端的中位数(表示为Q3)。
Q1 和 Q3 之间的数据是 IQR。异常值定义为低于 Q1 – 1.5(IQR) 或高于 Q3 1.5(IQR) 的样本。我们可以使用箱线图来执行此操作。箱线图的目的是可视化分布。从本质上讲,它包括重要点:最大值,最小值,中位数和两个IQR点(Q1,Q3)。以下是箱线图的一个示例:
让我们将其应用于PalmerPenguins数据集:
fig, axes = plt.subplots(nrows=4,ncols=1)
fig.set_size_inches(10, 30)
sb.boxplot(data=data,y="culmen_length_mm",x="species",orient="v",ax=axes[0], palette="Oranges")
sb.boxplot(data=data,y="culmen_depth_mm",x="species",orient="v",ax=axes[1], palette="Oranges")
sb.boxplot(data=data,y="flipper_length_mm",x="species",orient="v",ax=axes[2], palette="Oranges")
sb.boxplot(data=data,y="body_mass_g",x="species",orient="v",ax=axes[3], palette="Oranges")