Требует ли отчет о классификации для sklearn одинаковой длины для входных данных x и y? - PullRequest
0 голосов
/ 31 января 2020

https://scikit-learn.org/stable/modules/generated/sklearn.metrics.classification_report.html

Я получаю сообщение об ошибке с отчетом о классификации sklearn.

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-30-6a63be1ce4c8> in <module>
----> 1 classification_report(y_test, predictions)

/usr/local/lib/python3.7/site-packages/sklearn/metrics/classification.py in classification_report(y_true, y_pred, labels, target_names, sample_weight, digits, output_dict)
   1522     """
   1523 
-> 1524     y_type, y_true, y_pred = _check_targets(y_true, y_pred)
   1525 
   1526     labels_given = True

/usr/local/lib/python3.7/site-packages/sklearn/metrics/classification.py in _check_targets(y_true, y_pred)
     69     y_pred : array or indicator matrix
     70     """
---> 71     check_consistent_length(y_true, y_pred)
     72     type_true = type_of_target(y_true)
     73     type_pred = type_of_target(y_pred)

/usr/local/lib/python3.7/site-packages/sklearn/utils/validation.py in check_consistent_length(*arrays)
    233     if len(uniques) > 1:
    234         raise ValueError("Found input variables with inconsistent numbers of"
--> 235                          " samples: %r" % [int(l) for l in lengths])
    236 
    237 

ValueError: Found input variables with inconsistent numbers of samples: [360, 144]

Это единственное, что я передаю, и y_test.shape - это (360,), а предсказания - это (144,).

classification_report(y_test, predictions)

Должны ли они быть одинаковой длины? (Я так полагаю из-за этой второй трассировки стека). Если это так, как длина X и Y может быть одинаковой при разделении данных? Разве они не всегда будут разной длины?

1 Ответ

0 голосов
/ 31 января 2020

Похоже, здесь есть некоторое недопонимание относительно структуры разделения данных stats / ML.

Как вы и подозревали, y_test и pred должны быть одинаковой длины - давайте назовем это к . Почему? Потому что нам нужно k примеров тестирования (( x , y ) пар) для тестирования модели. X_test и y_test имеют длину k . (Каждая запись x в X_test может иметь несколько функций, но она считается одной записью.) Для каждой x в X_test мы делаем прогноз относительно ее метки. Затем, чтобы вычислить метрическую c подобную точность классификации, мы сравниваем предсказанную метку с истинной меткой для каждого примера тестирования.

Если да, то как можно определить длину X и Y могут быть одинаковыми при разделении данных?

Посмотрите на API sklearn.model_selection.train_test_split. Вы бы назвали это примерно так:

X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.33, random_state=42)

Это показывает, что X_test и y_test будут иметь одинаковое количество записей в них - они всегда будут одинаковой формы, дизайн. Затем для каждой записи в X_test вы делаете прогноз, используя вашу модель. Он будет связан с соответствующей записью в y_test, и таким образом вы сможете вычислить свой балл классификации.

...