Не следует разбивать набор данных на основе независимых переменных (также известных функций) ... Почему?
Просто, потому что в итоге вы получитепочти гарантированное несбалансированное распределение.
Другими словами, предположим, что атрибут 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]