Обнаружение разделенных объектов Train / Test

Есть ли какой-нибудь скрипт / функция для разделения данных, подсчитывающего количество появлений классов в каждом изображении и балансирующего их? Я пробовал sklearn train_test_split таким образом:

data = pd.read_csv('train_labels.csv')
data.head()

Класс - это то, что я хочу предсказать, на одном изображении у меня может быть 0..n прямоугольников, и каждый прямоугольник имеет класс.

введите описание изображения здесь

data = data.drop_duplicates(subset="filename")
y = data['class']
X = data.drop('class',axis = 1)
X_train, X_test, y_train, y_test = train_test_split(X, y,test_size=0.2)

Но когда я удаляю дубликаты в именах файлов, я теряю информацию и, возможно, отправляю файлы для обучения или тестирования со многими другими классами, но если я не удаляю их, у меня может быть файл в обучении и тестировании.

Спасибо за вашу помощь.


comment
Возможно, вы ищете stratify аргумент train_test_split . Думаю, звонок будет train_test_split(X, y, test=0.2, stratify=y).   -  person Engineero    schedule 05.03.2020
comment
Если вы хотите сбалансировать несбалансированные классы, вы можете сделать это с помощью различных стратегий, таких как передискретизация. Ознакомьтесь с документацией по пакету Python imbalanced-learn.   -  person Engineero    schedule 05.03.2020
comment
datascience.stackexchange.com / questions / 32818 /   -  person PV8    schedule 06.03.2020


Ответы (1)


Это библиотека scikit-multilearn, которая поможет разделить данные с несколькими метками.

Установка: pip install scikit-multilearn

Документация: http://scikit.ml/stratification.html.

Выполнение:

Предположим, что в фрейме данных df, X1, X2 - это столбцы функций, а y - целевой столбец.

Наши данные можно разделить на следующие классы class1, class2, class3

df = pd.DataFrame({
"X1": [1,2,3,4,5,6,7,8],
"X2": [6,7,8,9,10,11,12,13],
"y": ["class1", "class1", "class2", "class2", "class3", "class3", "class1", "class2"]})

После выполнения вышеуказанного кода у нас есть фрейм данных:

    X1  X2  y
0   1   6   class1
1   2   7   class1
2   3   8   class2
3   4   9   class2
4   5   10  class3
5   6   11  class3
6   7   12  class1
7   8   13  class2

Но scikit multilearn работает с одним горячим целевым столбцом. Итак, нам нужно преобразовать наш целевой столбец.

one_hot_classes = pd.get_dummies(df["y"])

Что выведет:

  class1 class2 class3
0   1      0      0
1   1      0      0
2   0      1      0
3   0      1      0
4   0      0      1
5   0      0      1
6   1      0      0
7   0      1      0

Мы отбросим столбец y и объединим one_hot_classes

df.drop("y", axis = 1, inplace=True)
df = pd.concat([df, one_hot_classes], axis=1)

После выполнения вышеуказанного кода:

    X1  X2   class1 class2 class3
0   1   6       1      0      0
1   2   7       1      0      0
2   3   8       0      1      0
3   4   9       0      1      0
4   5   10      0      0      1
5   6   11      0      0      1
6   7   12      1      0      0
7   8   13      0      1      0

Теперь у нас есть функции и целевые столбцы в переменных X и y.

X = df[["X1", "X2"]]
y = df[["class1", "class2", "class3"]]

Теперь у нас получатся сплиты:

from skmultilearn.model_selection import iterative_train_test_split
X_train, y_train, X_test, y_test = iterative_train_test_split(X.values, y.values, test_size = 0.5)
person Mohit Duklan    schedule 22.10.2020
comment
Я знаю, что это старый вопрос, но я застрял на том, как применить эту библиотеку в своей работе, поэтому я должен задать этот вопрос. Можете ли вы предоставить формат X, y в iterative_train_test_split(X, y, test_size = 0.5), потому что я не смог найти ответ, прочитав документацию автора - person nOpe; 24.02.2021
comment
@nOpe Я отредактировал ответ в более подробной реализации - person Mohit Duklan; 24.02.2021