Разделите информационный кадр на два, но зная уже один - PullRequest
0 голосов
/ 12 апреля 2020

У меня есть 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)

, что явно противоречиво.

Что я делаю неправильно в коде

1 Ответ

0 голосов
/ 12 апреля 2020

Я действительно решил проблему ...

Именно в определении train_class1 и train_class0 я изменил на:

train_class1=dataframe[dataframe["label"]==1].sample(len(dataframe[dataframe["label"]==0])*80//100)
train_class0=dataframe[dataframe["label"]==0].sample(len(dataframe[dataframe["label"]==0])*80//100)

с помощью встроенного pandas функция df.sample ().

...