Python 使用sklearn.utils.resample进行分层与不进行分层的区别

Python 使用sklearn.utils.resample进行分层与不进行分层的区别,python,scikit-learn,Python,Scikit Learn,使用sklearn.utils.resample进行分层和不进行分层有什么区别 分层意味着保留原始类中的分布 参见原始分布中的频率: from sklearn.utils import resample seed=42 np.random.seed(seed) y = np.random.choice([0,1],size=100000, p=[.5,.5]) np.unique(y,return_counts=True) (array([0, 1]), array([49934, 50066

使用sklearn.utils.resample进行分层和不进行分层有什么区别


分层
意味着保留原始类中的分布

参见原始分布中的频率:

from sklearn.utils import resample
seed=42
np.random.seed(seed)
y = np.random.choice([0,1],size=100000, p=[.5,.5])
np.unique(y,return_counts=True)
(array([0, 1]), array([49934, 50066]))
然后,在不分层的情况下重新采样:

res = resample(y, n_samples=10000, replace=True, stratify=None, random_state=seed)
np.unique(res,return_counts=True)
(array([0, 1]), array([5049, 4951]))
最后是分层:

res = resample(y, n_samples=10000, replace=True, stratify=y,random_state=seed)
np.unique(res,return_counts=True)
(array([0, 1]), array([4993, 5007]))

分层选项使得完整数据中存在的类的分布将保留在样本中。在您的示例中,它似乎并不重要(因为返回的1和0的数量相同),这只是巧合。通过更改随机_状态并注意到非分层样本的1s与0s比率并不总是保持不变,而分层样本的1s与0s比率始终与输入数据的1s比率相同(4/5为1s),可以看出情况并非总是如此:


一般来说,分层是一种在生成的子集中保持原始类比例的方法。它是一种确保训练集和测试集共享每个类的示例比例大致相同的技术,以便在两个集合中都能获得一致的预测性能分数

如果数据集具有高类不平衡性,在最坏的情况下,测试集可能根本不包含少数类的任何实例。因此 推荐的做法是以分层方式划分数据集。在这里,分层仅仅意味着我们随机分割一个数据集,这样每个类都能正确地表示在结果子集(训练集和测试集)中
需要注意的是,在处理相对较大且平衡的数据集时,非分层方式的随机子抽样通常不是一个大问题。

谢谢您的回答。在我真正的问题中,
Ys
是同一个类,但分布有位置(我还有两列经度和纬度)。如何通过分层重新采样,使采样结果保持原始数据的空间分布?我相信您必须找到一种方法,将经度和纬度列合并为一个表示位置的列(可能以某种方式对位置进行聚类),然后将该列作为
分层
参数传递给
重采样
函数。是的,我正在考虑这个问题,但是,不知道如何将经度和纬度列标度化为一个列谢谢您的回答。在我真正的问题中,
Ys
是同一个类,但分布有位置(我还有两列经度和纬度)。我如何通过分层重新采样,以使采样结果保持原始数据的空间分布?将您的数据切割成stratas并相应地重新采样。
将您的数据切割成stratas
,您能详细说明吗?我建议您提出一个新问题,明确说明您想要什么,提供尽可能多的数据。当然我会很快做,请回答我也有。
res = resample(y, n_samples=10000, replace=True, stratify=y,random_state=seed)
np.unique(res,return_counts=True)
(array([0, 1]), array([4993, 5007]))
In [1]: import numpy
   ...: from sklearn.utils import resample

In [2]: y = [0, 0, 1, 1, 1, 1, 1, 1, 1]

In [3]: resample(y, n_samples=5, replace=False, random_state=10)
Out[3]: [1, 1, 1, 1, 1]

In [4]: resample(y, n_samples=5, replace=False, stratify=y, random_state=10)
Out[4]: [1, 1, 1, 1, 0]

In [5]: resample(y, n_samples=5, replace=False, random_state=42)
Out[5]: [1, 0, 1, 0, 1]

In [6]: resample(y, n_samples=5, replace=False, stratify=y, random_state=42)
Out[6]: [1, 0, 1, 1, 1]

In [7]: resample(y, n_samples=5, replace=False, random_state=0)
Out[7]: [1, 1, 0, 1, 1]

In [8]: resample(y, n_samples=5, replace=False, stratify=y, random_state=0)
Out[8]: [1, 1, 1, 0, 1]