需要帮助理解一个小例子

数据挖掘 Python 熊猫 预处理
2022-02-26 16:59:55

请原谅我,我同意问题的标题不清楚。我想知道从教科书“机器学习动手”中挑选的以下步骤的理解。

 >>> housing['income_cat'].value_counts() 
 >>> 3.0    7236
     2.0    6581
     4.0    3639
     5.0    2362
     1.0     822

如果我没记错的话,上面的步骤是获取每个类的计数。例如,对于“3”类,有 7236 个实例。同样,对于“2”类,有 6581 个实例。

>>>  housing['income_cat'].value_counts / len(housing) 
>>>  3.0    0.350581
     2.0    0.318847
     4.0    0.176308
     5.0    0.114438
     1.0    0.039826

接下来,我不清楚上述步骤背后的意图是什么。通过执行上述步骤,我想学习什么?

 >>> from sklearn.model_selection import StratifiedShuffleSplit

 >>> split = StratifiedShuffleSplit(n_splits=1, test_size=0.2, random_state=42)
 >>> for train_index, test_index in split.split(housing, housing["income_cat"]):
         strat_train_set = housing.loc[train_index]
         strat_test_set = housing.loc[test_index]

 >>>  strat_test_set['income_cat'].value_counts() / len(strat_test_set)
 >>>  3.0    0.350533
      2.0    0.318798
      4.0    0.176357
      5.0    0.114583
      1.0    0.039729
      Name: income_cat, dtype: float64

为什么strat_test_set['income_cat'].value_counts() / len(strat_test_set)结果与 的结果几乎相同housing['income_cat'].value_counts / len(housing)

3个回答

关于你的第一个问题,除以长度,你得到每个类别的百分比,你可以看到一个类别的百分比非常低。

如果您使用常规train_test_split,则每个集合中类别的比例将不同,因为拆分是随机进行的,这可能会引入偏差。

想象一下观察数量非常少的类别,您甚至可能在任何一组中都完全缺少类别,这会给您的模型带来麻烦。

分层抽样的使用允许您对类别具有相同的比例。这就是您看到相同结果的原因:这是本次抽样的目标。

答案很清楚,因为您自己回答了问题,

还要检查 value_counts 中的 normalize Param ..

分层抽样所做的是将每个相同的实际百分比保持在与原始数据集中不同的折叠中......

(这就是为什么他们都一样..)

为什么会这样?

这样做是为了减少每个样本中的总体偏差,并且没有一个人会凌驾于另一个人之上。

考虑一个最坏的情况,您提取了几行并且在特定列中都具有相同的值......

这对模型来说将是灾难性的,因为除了该折叠中的价值之外,它没有看到其他任何东西......

(您可以参考 sklearn 文档了解Stratified Sampling..

在此示例中,已验证http://scikit-learn.org/stable/modules/generated/sklearn.model_selection.StratifiedKFold.html声称的数据分布(折叠是通过保留每个样本的百分比来实现的)类。)确实如此。

你的数据和最后的观察证实了这一点。