Удаление элементов из списка и строк из массива numpy, когда условие выполняется в Python - PullRequest
0 голосов
/ 31 октября 2018

Я пишу алгоритм, чтобы классифицировать твиты в моем наборе данных как положительные / отрицательные, и я хочу проверить его точность. Чтобы сделать это и найти наилучшее из возможных решений, я хочу иметь базовую линию (используя классические алгоритмы 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 У меня все еще есть некоторые (несколько, не все - как в начале) элементов, которые должны были быть удалены.

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

Ответы [ 3 ]

0 голосов
/ 31 октября 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]
0 голосов
/ 31 октября 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]
0 голосов
/ 31 октября 2018

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

http://scikit -learn.org / стабильный / модули / полученные / sklearn.metrics.classification_report.html

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

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

predictions = your_clf.predict(X_test1)
classification_report(y_test1, prediction)
...