Удаление элементов из списка и строк из массива numpy, когда условие выполняется в Python

Я пишу алгоритм, чтобы классифицировать твиты в моем наборе данных как положительные/отрицательные, и я хочу проверить его точность. Чтобы сделать это и найти наилучшее возможное решение, я хочу иметь базовый уровень (используя классические алгоритмы ML). После предварительной обработки твитов, вдохновленный соответствующей работой, я сначала изучил модель Bag-of-Words, и мне удалось успешно запустить код и рассчитать точность и Fscore. После некоторой предварительной обработки текста и разделения набора данных на набор поездов и набор тестов:

from sklearn.cross_validation import train_test_split
X_train, X_test1, y_train, y_test1 = train_test_split(X, y, test_size = 0.11, random_state = 0)

Я хочу иметь возможность исключить все твиты, помеченные как отрицательные, из тестового набора (оставив только положительные) и рассчитать точность, отзыв и Fscore алгоритма (а затем сделать то же самое для твитов, помеченных как положительные) . Я пытался сделать это так:

finRow = len(X_test1) 
finCol = len(X_test1[0])

for o in range(0, finrow):
    if y_test1[o]== 1:
       del y_test1[o]
       X_test1 = np.delete(X_test1, o, axis=0)

но я получаю эту ошибку:

Traceback (most recent call last):

File "<ipython-input-4-5ed18876a8b5>", line 2, in <module>
if y_test1[o]== 1:

IndexError: list index out of range

X_test1 содержит твиты и имеет размер 1102 x 564, а y_test1 содержит нули и единицы (твит положительный или отрицательный) и имеет размер 1102. Ошибка появляется в 774-я итерация, когда длина y_test1 уменьшается с 1102 до 774.

Теперь я попытался сделать это и так:

a = 1
for o in range(0, finrow):
    if (y_test1[o] == 1 and o <= finrow - a):
       del y_test1[o]
       a = a + 1
       X_test1 = np.delete(X_test1, o, axis=0)

но я все еще получаю ту же ошибку, и я не знаю, является ли это лучшим подходом к удалению строк матрицы и элементов списка, потому что, когда я проверяю значения y_test1 я остались некоторые (несколько, не все - как в начале) элементы, которые должны были быть удалены.

Я новичок в этом, и я понятия не имею, где моя ошибка.


person moz_szt    schedule 30.10.2018    source источник
comment
Когда вы del составляете список, его размер меняется, а индексы путаются. Если вы должны перебирать список, а del элементов начинаются с конца и продвигаются к началу. Экспериментируйте с небольшими списками в интерактивном режиме, если вы не можете представить, что происходит.   -  person hpaulj    schedule 31.10.2018
comment
Спасибо за совет! Будет использовать его в будущем.   -  person moz_szt    schedule 31.10.2018


Ответы (3)


Возможно, вы захотите взглянуть на функцию classification_report в scikit-learn.

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

Это самый простой способ вычислить Precision/Recall и F1 для каждого класса.

Вам просто нужно передать два массива, первый с истинными прогнозами, а второй с прогнозами из вашего классификатора, например:

predictions = your_clf.predict(X_test1)
classification_report(y_test1, prediction)
person David Batista    schedule 30.10.2018
comment
Благодарю вас! Он делает именно то, что я хотел, и даже больше. Работает как шарм! - person moz_szt; 31.10.2018

y_test == 0 создает массив логических значений, которые можно использовать для фильтрации строк из y_test и x_test.

positive_indexes = y_test == 0
y_test_positive = y_test[positive_indexes]
x_test_positive = x_test[positive_indexes]
person daz    schedule 30.10.2018

In [328]: alist = list(range(10))
In [329]: alist
Out[329]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

Удаление элементов из списка изменяет индексы последующих элементов.

In [330]: del alist[7]          # removes the 7
In [331]: alist
Out[331]: [0, 1, 2, 3, 4, 5, 6, 8, 9]
In [332]: del alist[8]          # removes the 9, not the 8       
In [333]: alist
Out[333]: [0, 1, 2, 3, 4, 5, 6, 8]
In [334]: del alist[8]          # with only 8 items left, error
IndexError: list assignment index out of range

Удаление элементов, начинающихся с конца, сохраняет индексы оставшихся элементов:

In [335]: alist = list(range(10))
In [336]: del alist[9]
In [337]: del alist[8]
In [338]: del alist[7]
In [339]: del alist[6]
In [340]: alist
Out[340]: [0, 1, 2, 3, 4, 5]
person hpaulj    schedule 31.10.2018