Разница в использовании sklearn.utils.resample с стратификацией и без стратификации - PullRequest
1 голос
/ 20 февраля 2020

Какая разница в использовании sklearn.utils.resample с стратификацией и без стратификации?

https://scikit-learn.org/stable/modules/generated/sklearn.utils.resample.html

import numpy
from sklearn.utils import resample


y = [0, 0, 1, 1, 1, 1, 1, 1, 1]
res = resample(y, n_samples=5, replace=False, random_state=0)
print (res)
[1, 1, 0, 1, 1]

res = resample(y, n_samples=5, replace=False, stratify=y, random_state=0)
print (res)

[1, 1, 1, 0, 1]

Ответы [ 3 ]

1 голос
/ 20 февраля 2020

Опция стратификации делает так, чтобы распределение классов, представленных в полных данных, было сохранено в выборке. Тот факт, что в вашем примере это не имело значения (поскольку возвращалось одинаковое количество единиц и нулей), было просто совпадением. Вы можете увидеть, что это не всегда так, изменив random_state и заметив, что отношение 1 к 0 не всегда остается неизменным для не стратифицированных выборок, тогда как для стратифицированных это всегда следует за вашими входными данными (4/5 1):

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]


1 голос
/ 20 февраля 2020

Stratify означает, что распределение в ваших исходных классах сохраняется.

См. Частоты в исходном распределении:

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]))

Затем повторная выборка без stratify:

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]))
0 голосов
/ 20 февраля 2020

стратификация в целом - это подход, позволяющий сохранить исходную пропорцию классов в результирующих подмножествах. Это метод, позволяющий обеспечить, чтобы обучающие и тестовые наборы имели примерно одинаковое соотношение примеров из каждого класса, так что согласованные прогностические оценки производительности могут быть достигнуты в оба набора.

Если набор данных имеет высокий дисбаланс классов, в худшем случае набор тестов может вообще не содержать ни одного экземпляра класса меньшинства. Таким образом, рекомендуемой практикой является разделение набора данных по стратификации. Здесь стратификация просто означает, что мы случайным образом разбиваем набор данных таким образом, чтобы каждый класс был правильно представлен в результирующих подмножествах (обучающий и тестовый набор). Следует отметить, что случайная подвыборка в не стратифицированном виде обычно не представляет большой проблемы при работе. с относительно большими и сбалансированными наборами данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...