www.machinelearningmastery.ru

Машинное обучение, нейронные сети, искусственный интеллект
Header decor

Home

5 алгоритмов выборки, которые каждый ученый должен знать

Дата публикации Jul 21, 2019

Наука о данных - это изучение алгоритмов.

Я сталкиваюсь со многими алгоритмами на ежедневной основе, поэтому я подумал о том, чтобы перечислить некоторые из наиболее распространенных и наиболее используемых алгоритмов, которые в конечном итоге будут использованы в этом новомСерия DS Алгоритм,

Этот пост о некоторых наиболее распространенных методах выборки, которые можно использовать при работе с данными.


Простая случайная выборка

Скажем, вы хотите выбрать подмножество населения, в котором каждый член подмножества имеет равную вероятность быть выбранным.

Ниже мы выбираем 100 точек выборки из набора данных.

sample_df = df.sample(100)

Стратифицированная выборка

Предположим, что нам нужно оценить среднее количество голосов для каждого кандидата на выборах. Предположим, что в стране есть 3 города:

Город А имеет 1 миллион рабочих,

Город B имеет 2 миллиона рабочих, и

Город C имеет 3 миллиона пенсионеров.

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

Вместо этого, если мы выберем случайную выборку 10, 20 и 30 из городов A, B и C соответственно, то мы можем получить меньшую ошибку в оценке для того же общего размера выборки.

Вы можете сделать что-то вроде этого довольно легко с Python:

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y,
stratify=y,
test_size=0.25)

Отбор проб из водохранилища

Мне нравится это постановка проблемы:

Допустим, у вас есть поток элементов большой и неизвестной длины, который мы можем повторять только один раз.

Создайте алгоритм, который случайным образом выбирает элемент из этого потока, так что каждый элемент с равной вероятностью будет выбран.

Как мы можем сделать это?

Давайте предположим, что нам нужно выбрать 5 объектов из бесконечного потока, чтобы каждый элемент имел равную вероятность быть выбранным.

import randomdef generator(max):
number = 1
while number < max:
number += 1
yield number# Create as stream generator
stream = generator(10000)# Doing Reservoir Sampling from the stream
k=5
reservoir = []
for i, element in enumerate(stream):
if i+1<= k:
reservoir.append(element)
else:
probability = k/(i+1)
if random.random() < probability:
# Select item in stream and remove one of the k items already selected
reservoir[random.choice(range(0,k))] = elementprint(reservoir)
------------------------------------
[1369, 4108, 9986, 828, 5589]

Можно математически доказать, что в выборке каждый элемент имеет одинаковую вероятность выбора из потока.

Как?

Это всегда помогает думать о меньшей проблеме, когда дело доходит до математики.

Итак, давайте подумаем о потоке только из 3 предметов, и мы должны оставить 2 из них.

Мы видим первый элемент, мы держим его в списке, так как в нашем резервуаре достаточно места. Мы видим второй элемент, мы держим его в списке, так как в нашем резервуаре достаточно места.

Мы видим третий пункт. Здесь вещи становятся интересными. Мы выбираем третий элемент в списке с вероятностью 2/3.

Давайте теперь посмотрим вероятность выбора первого элемента:

Вероятность удаления первого элемента - это вероятность выбора элемента 3, умноженная на вероятность случайного выбора элемента 1 в качестве кандидата на замену из 2 элементов в резервуаре. Эта вероятность:

2/3*1/2 = 1/3

Таким образом, вероятность выбора 1:

1–1/3 = 2/3

У нас может быть точно такой же аргумент для Второго элемента, и мы можем расширить его для многих элементов.

Таким образом, каждый элемент имеет одинаковую вероятность быть выбранным:2/3или вообщеk/n


Случайная выборка и избыточная выборка

Источник

Слишком часто мы сталкиваемся с несбалансированным набором данных.

Широко принятый метод для работы с сильно несбалансированными наборами данных называется повторной выборкой. Он состоит из удаления выборок из класса большинства (недостаточная выборка) и / или добавления большего количества примеров из класса меньшинства (избыточная выборка).

Давайте сначала создадим пример несбалансированных данных.

from sklearn.datasets import make_classificationX, y = make_classification(
n_classes=2, class_sep=1.5, weights=[0.9, 0.1],
n_informative=3, n_redundant=1, flip_y=0,
n_features=20, n_clusters_per_class=1,
n_samples=100, random_state=10
)X = pd.DataFrame(X)
X['target'] = y

Теперь мы можем сделать случайную передискретизацию и недостаточную выборку, используя:

num_0 = len(X[X['target']==0])
num_1 = len(X[X['target']==1])
print(num_0,num_1)# random undersampleundersampled_data = pd.concat([ X[X['target']==0].sample(num_1) , X[X['target']==1] ])
print(len(undersampled_data))# random oversampleoversampled_data = pd.concat([ X[X['target']==0] , X[X['target']==1].sample(num_0, replace=True) ])
print(len(oversampled_data))------------------------------------------------------------
OUTPUT:
90 10
20
180

Перебор сэмплирования и сэмплирование с использованием imbalanced-learn

imbalanced-learn (imblearn) - это пакет Python для преодоления проклятия несбалансированных наборов данных.

Он предоставляет различные методы для отбора проб и проб.

а. Отбор проб с использованием Tomek Links:

Один из таких методов называется Tomek Links. Ссылки Tomek - это пары примеров противоположных классов в непосредственной близости.

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

Источник

from imblearn.under_sampling import TomekLinks

tl = TomekLinks(return_indices=True, ratio='majority')
X_tl, y_tl, id_tl = tl.fit_sample(X, y)

б. Передискретизация с использованием SMOTE:

В SMOTE (методика сэмплирования синтетического меньшинства) мы синтезируем элементы для класса меньшинства в непосредственной близости от уже существующих элементов.

Источник
from imblearn.over_sampling import SMOTE

smote = SMOTE(ratio='minority')
X_sm, y_sm = smote.fit_sample(X, y)

Есть множество других методов вimblearnпакет для недосэмплирования (Cluster Centroids, NearMiss и т. д.) и передискретизации (ADASYN и bSMOTE), которые вы можете проверить.


Вывод

Алгоритмыжизненная основа науки о данных.

Выборка является важной темой в науке о данных, и мы действительно не говорим об этом столько, сколько должны.

Хорошая стратегия выборки иногда может продвинуть весь проект вперед. Плохая стратегия выборки может дать нам неверные результаты. Поэтому следует быть осторожным при выборе стратегии выборки.

Так что используйте выборку, будь то на работе или в барах


Если вы хотите узнать больше о науке данных, я хотел бы напомнить этоотличный курсЭндрю Нг. Это было то, что заставило меня начать. Проверьте это.


Спасибо за прочитанное. Я собираюсь писать больше постов для начинающих в будущем. Следуй за мной всреднийили подписаться на мойблогбыть в курсе о них. Как всегда, я приветствую отзывы и конструктивную критику, и я могу найти их в Твиттере@mlwhiz,

Оригинальная статья

Footer decor

© www.machinelearningmastery.ru | Ссылки на оригиналы и авторов сохранены. | map