У меня есть dataframe
с одним столбцом под названием «метка», который представляет двоичную особенность [0,1]. Фрейм данных является несбалансированным, с большим количеством меток 0, чем 1, поэтому, чтобы построить хорошую оценку, я хочу разбить данные на подмножества обучения и тестирования, где подмножество обучения должно быть хорошо сбалансировано. Я мог бы попытаться использовать алгоритмы повторной выборки, такие как SMOTE или другие; однако я решил go со следующей стратегией:
Выберите все эти строки dataframe
с меткой 1 и сделайте из этого случайный выбор с 80%, например:
train_class1=dataframe[dataframe["label"]==1].iloc[np.random.randint(0, len(dataframe[dataframe["label"]==1]), len(dataframe[dataframe["label"]==1])*80//100)]
Затем из строк с меткой 0 я сделал случайный выбор того же размера, что и train_class1
, и назвал его train_class0
, например:
train_class0=dataframe[dataframe["label"]==0].iloc[np.random.randint(0, len(dataframe[dataframe["label"]==0]), len(dataframe[dataframe["label"]==1])*80//100)]
Итак, я планировал конкатенировать по строкам оба фрейма данных, чтобы они стали моей обучающей подвыборкой:
train_class=pd.concat([train_class1,train_class0])
Теперь, как тестовая подвыборка, я хочу, чтобы она была остальной частью исходного dataframe
, это: все эти строки dataframe
которые не принадлежат train_class
. Я попробовал следующее:
test_class =pd.concat([dataframe, train_class]).drop_duplicates()
, чтобы объединить начальные dataframe
с train_class
и удалить дублирующиеся строки.
Однако это выглядит нормально (по крайней мере, для меня на этом этапе) Когда я проверяю формы dataframe
, train_class
и test_class
, я получаю:
dataframe.shape=(257673, 208)
train_class.shape=(263476, 208)
test_class.shape=(257673, 208)
, что явно противоречиво.
Что я делаю неправильно в коде