sklearn train_test_split - ValueError: обнаружены входные переменные с несовместимым количеством выборок - PullRequest
0 голосов
/ 14 июля 2020

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

Я использую это для своих этикеток ( который я отделяю от самого набора данных) следующим образом:

ohe = MultiLabelBinarizer()
labels = ohe.fit_transform(labels)
train, test, train_labels, test_labels = train_test_split(dataset, labels, test_size=0.2) #80% train split

Но это вызывает следующую ошибку:

Traceback (most recent call last): 
  File "learn.py", line 114, in <module> 
    train, test, train_labels, test_labels = train_test_split(dataset, labels, test_size=0.2) #80% train split
  File "C:\Users\xwb18152\AppData\Roaming\Python\Python38\site-packages\sklearn\model_selection\_split.py", line 2127, 
in train_test_split
    arrays = indexable(*arrays)
  File "C:\Users\xwb18152\AppData\Roaming\Python\Python38\site-packages\sklearn\utils\validation.py", line 293, in indexable
    check_consistent_length(*result)
  File "C:\Users\xwb18152\AppData\Roaming\Python\Python38\site-packages\sklearn\utils\validation.py", line 256, in check_consistent_length
    raise ValueError("Found input variables with inconsistent numbers of"
ValueError: Found input variables with inconsistent numbers of samples: [83292, 5]

-

EDIT: Набор данных меток выглядит следующим образом (игнорируйте столбец Interval, его там не должно быть и фактически не учитывается в строках - не знаете, почему?):

          Movement  Distance  Speed  Delay  Loss 
Interval
0                1         1     25      0     0
2                1         1     25      0     0
4                1         1     25      0     0
6                1         1     25      0     0
8                1         1     25      0     0
...            ...       ...    ...    ...   ...
260              3         5     50      0     0
262              3         5     50      0     0
264              3         5     50      0     0
266              3         5     50      0     0
268              3         5     50      0     0

Отсюда мы можем видите, что это проблема классификации с несколькими метками и несколькими классами. shape из dataset и labels до и после бинаризатора выглядят следующим образом:

             Before             After
dataset      (83292, 15)        (83292, 15)
labels       (83292, 5)         (5, 18)

Ответы [ 2 ]

1 голос
/ 15 июля 2020

Как вы заявили, исходная форма меток - (83292, 5), и как только вы применили MultiLabelBinarizer, она стала (5, 18).

train_test_split(X, y) функция ожидает, что X и y должны иметь одинаковые строки . Например: 83292 точек данных, доступных в вашей X, и соответствующая метка точек данных должна быть доступна в вашей переменной y. Следовательно, в вашем случае это должно быть X, а y форма должна быть (83292, 15) и (83292, 18).

Попробуйте следующее: Ваш результат MultiLabelBinarizer имеет неправильный размер здесь . Итак, если ваш labels является объектом фрейма данных, вы должны применить mlb.fit_transform(labels.values.tolist()). это приведет к тому же количеству строк, что и вывод здесь 83292.

Пример ваших меток должен иметь следующий формат:

ваш y ввод может быть например, list of list или фрейм данных с one column which having list of values. Убедитесь, что у X и y одинаковое количество строк. Вы можете представить переменную multi-label multi-class y, как показано ниже. Или dataframe.shape должен быть (no_of_rows, 1)

[[1, 1, 25, 0, 0],
 [1, 1, 25, 0, 0],
 [1, 1, 25, 0, 0],
 [1, 1, 25, 0, 0],
 [1, 1, 25, 0, 0],
 [3, 5, 50, 0, 0],
 [3, 5, 50, 0, 0],
 [3, 5, 50, 0, 0],
 [3, 5, 50, 0, 0],
 [3, 5, 50, 0, 0]]
0 голосов
/ 14 июля 2020

Это означает, что длина различных элементов, которые вы пытаетесь разделить, не совпадает. Для X и y, sklearn будет принимать одни и те же индексы, обычно это случайная выборка из 80% индексы ваших данных. Итак, длины должны совпадать.

Представьте, что он пытается сохранить эти индексы. Что будет делать sklearn, если в каком-то индексе ничего нет?

 0 1 0 0 1 0 1 0 0 1 0 1 0 1
 a b b a b a b a a b b b 
 ^   ^     ^ ^   ^   ^   ^ ^ 

Выполните эту проверку, чтобы убедиться, что длины совпадают. Это возвращает True?

len(dataset) == len(labels)
...