Стратификация не удалась в train_test_splitPython

Программы на Python
Ответить
Anonymous
 Стратификация не удалась в train_test_split

Сообщение Anonymous »

Рассмотрите следующий код:

Код: Выделить всё

import pandas as pd
from sklearn.model_selection import train_test_split

# step 1
ids = list(range(1000))
label = 500 * [1.0] + 500 * [0.0]
df = pd.DataFrame({"id": ids, "label": label})

# step 2
train_p = 0.8
val_p = 0.1
test_p = 0.1

# step 3
n_train = int(len(df) * train_p)
n_val = int(len(df) * val_p)
n_test = len(df) - n_train - n_val

print("* Step 3")
print("train:", n_train)
print("val:", n_val)
print("test:", n_test)
print()

# step 4
train_ids, test_ids = train_test_split(df["id"], stratify=df.label, test_size=n_test, random_state=42)

# step 5
print("* Step 5. First split")
print( df.loc[df.id.isin(train_ids), "label"].value_counts() )
print( df.loc[df.id.isin(test_ids), "label"].value_counts() )
print()

# step 6
train_ids, val_ids = train_test_split(train_ids, stratify=df.loc[df.id.isin(train_ids), "label"], test_size=n_val, random_state=42)

# step 7
train_df = df[df["id"].isin(train_ids)]
val_df = df[df["id"].isin(val_ids)]
test_df = df[df["id"].isin(test_ids)]

# step 8
print("* Step 8. Final split")
print("train:", train_df["label"].value_counts())
print("val:", val_df["label"].value_counts())
print("test:", test_df["label"].value_counts())
с выводом:

Код: Выделить всё

* Step 3
train: 800
val: 100
test: 100

* Step 5. First split
label
1.0    450
0.0    450
Name: count, dtype: int64
label
1.0    50
0.0    50
Name: count, dtype: int64

* Step 8. Final split
train: label
0.0    404
1.0    396
Name: count, dtype: int64
val: label
1.0    54
0.0    46
Name: count, dtype: int64
test: label
1.0    50
0.0    50
Name: count, dtype: int64
  • Создайте Dataframe с 1000 элементами, идеально сбалансированными между классом 1 и 0 (положительным и отрицательным);
  • Определите соотношение примеров, которые должны войти в разделы обучения, проверки и тестирования. Мне нужно 800 примеров в обучающем разбиении, по 100 примеров в каждом из двух других.
  • Вычислите размеры трех разделов и распечатайте их значения.
  • Выполните первое разбиение, чтобы получить тестовый набор, стратифицированный по метке.
  • Выведите статистику меток первого разбиения. Два раздела по-прежнему сбалансированы.
  • Выполните второе разделение на обучение и проверку, стратифицированное по метке.
  • Выберите примеры
  • Распечатайте статистику этикетки.
Как видите, второе разделение на шаге 6 не дает сбалансированного разделения (статистика распечатывается на шаге 8). После первого разделения примеры (выходные данные на шаге 5) по-прежнему сбалансированы, и можно было бы выполнить второе разделение, сохраняя идеальный баланс классов.
Что я делаю неправильно?

Подробнее здесь: https://stackoverflow.com/questions/795 ... test-split
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»