Python for loop, перебирающий значения из метода numpyrange - PullRequest
0 голосов
/ 24 октября 2019

Мне нужно написать код, который проверяет массив значений обрезки для задачи классификации. Проверяемые значения хранятся в переменной cutoff_list. Затем я хочу поместить список полученных матриц путаницы в словарь. Однако приведенный ниже код дает мне только первую запись в словаре (матрицу путаницы для первого значения теста):

cutoff_list = [np.arange(0,1,0.01)]  # list of test values
dictionary = {}  
for i, v in enumerate(cutoff_list):
    actual = (df.observed)
    predicted = np.where(df.indicator > i, 1, 0)

    df_confusion = confusion_matrix(actual, predicted) / len(df.indicator)   

    dictionary[i] = df_confusion

print(dictionary)

Библиотеки, которые я использую:

from pandas import Series, DataFrame
import pandas as pd
import numpy as np
from sklearn.metrics import confusion_matrix

Это проблема? с циклом или шагом обновления словаря? Я новичок в Python, имею больше опыта работы с R и до сих пор борюсь здесь. Любая помощь приветствуется.

1 Ответ

0 голосов
/ 24 октября 2019

Ваш цикл for запускается только один раз из-за способа его настройки.

Вы заключаете возврат np.arrange(0.1.0.01) в список, который нарушает способ выполнения цикла for. Вы получаете только одно значение, потому что цикл for выполняется только один раз, поскольку во внешнем списке есть только один элемент.

>>> cutoff_list = [np.arange(0,1,0.01)]
>>> cutoff_list
[array([0.  , 0.01, ... 0.98, 0.99])]
>>> type(cutoff_list)
<class 'list'>

Вы хотите получить фактический массив numpy:

>>> cutoff_list = np.arange(0,1,0.01)
>>> cutoff_list
array([0.  , 0.01, ... 0.98, 0.99])
>>> type(cutoff_list)
<class 'numpy.ndarray'>

Изменитьстроку cutoff_list = [np.arange(0,1,0.01)] до cutoff_list = np.arange(0,1,0.01) и посмотрите, решит ли это вашу проблему.

Я бы также подумал, что вы хотите использовать v вместо i в этой строке:

    predicted = np.where(df.indicator > i, 1, 0)

в качестве i будет содержать только перечисляемое значение, которое вы используете в качестве ключа для своего dict, тогда как v будет содержать значения от cutoff_list.

...