Как разделить набор данных на основе нескольких атрибутов метаданных в Python - PullRequest
0 голосов
/ 15 октября 2018

Если у нас есть набор данных со следующими метаданными: Age, Gender, PersonId.

Существует ли библиотека Python, которая может разбить набор данных на разделы для обучения, разработки и тестирования на основена все три атрибута метаданных, упомянутых выше, а также на метку c?

1 Ответ

0 голосов
/ 15 октября 2018

Не следует разбивать набор данных на основе независимых переменных (также известных функций) ... Почему?

Просто, потому что в итоге вы получитепочти гарантированное несбалансированное распределение.

Другими словами, предположим, что атрибут age в вашем наборе данных находится в диапазоне от 20 до 60, теперь, если вы разделите их в соответствии сage вы, возможно, в конечном итоге будете иметь молодых людей в вашем тренировочном наборе, а старых - в вашем тестовом наборе или наоборот ... и т. Д.

В этом случае ваша модель не будет тренироваться должным образом, и вы будетев конечном итоге переоснащение / занижение вашей модели!


Надлежащий способ их разделения должен основываться на зависимой переменной (иначе ответ,class или y variable).

Теперь предположим, что ваш набор данных содержит только два класса: Survived, Unsurvived, теперь мы должны стремиться к тому, чтобы каждый фолд (т.е. наборы для обучения, разработки и тестирования)является представителем всех слоев данных.Это означает, что каждый из вышеупомянутых классов (приблизительно) одинаково представлен в каждом тестовом сгибе ... Почему?

Чтобы ваша модель прошла наилучшее возможное обучение, потому что это не имеет смыслачто вы учите свою модель одному классу (например, Survived) больше, чем другому.Мы хотим, чтобы он узнавал обо всех одинаково, и поэтому мы хотим, чтобы все наборы имели как можно больше всех классов .


StratifiedShuffleSplit делает именно то, что я упомянул (на случай, если вы не возражаете против использования Scikit-Learn ).

Вот простой пример для начала:

from sklearn.model_selection import StratifiedShuffleSplit
X = np.array([[1, 2], [3, 4], [1, 2], [3, 4], [1, 2], [3, 4]])
y = np.array([0, 0, 0, 1, 1, 1])
sss = StratifiedShuffleSplit(n_splits=5, test_size=0.5, random_state=0)
for train_index, test_index in sss.split(X, y):
    print("TRAIN:", train_index, "TEST:", test_index)
    X_train, X_test = X[train_index], X[test_index]
    y_train, y_test = y[train_index], y[test_index]
...