Индекс списка вне диапазона при итерации в цикле - Python - PullRequest
0 голосов
/ 28 ноября 2018

Я работаю над проверкой модели без разрешения.Когда я запускаю цикл, оставляя один элемент списка для проверки, он останавливается, когда я = 19. Но когда я просто запускаю один за другим вручную с i = 19, он работает нормально.Длина объектов - 36.

for i in range(len(features)):
        # i = 18
        w_count = word_count[i]
        x_test_c = features[i][['count']].copy()
        x_test = features[i]
        x_test.drop('count', axis=1, inplace=True)
        x_train_list = features
        x_train_list.pop(i)
        y_test = summaries[i]
        y_train_list = summaries
        y_train_list.pop(i)

        x_train = merge_data(x_train_list)
        x_train.drop('count', axis=1, inplace=True)
        y_train = merge_data(y_train_list)
        print(x_train.shape,"\t",y_train.shape)
        print(x_test.shape,"\t",y_test.shape)

        model = sm.OLS(y_train, x_train, missing='drop').fit()

        predictions = model.predict(x_test)
        predictions = predictions.sort_values(ascending=False)

        print("\n\nLeave one out cross validation \nTest report:",i+1)
        match(predictions, w_count, x_test_c, y_test)

Пример вывода такой:

(sysenv) D:\pythonprojects\rec_proj>python main.py 
Leave one out cross validation
Test report: 1
total word count of report: 509
summary word count: ~ 127.25
['2.4', '1.5', '3.2']
Precision= 1.0
Recall= 0.21428571428571427
F1= 0.35294117647058826
....
Leave one out cross validation
Test report: 18
total word count of report: 380
summary word count: ~ 95.0
['5.3', '12.2', '1.14', '5.2']
Precision= 0.75
Recall= 0.12
F1= 0.20689655172413793

Останавливается после этой итерации.Erorr похож на это.

Traceback (most recent call last):
  File "main.py", line 49, in <module>
    lou(df_len, df_summary, word_count)
  File "D:\pythonprojects\rec_proj\model_eval.py", line 33, in lou
    x_test_c = features[i][['count']].copy()
IndexError: list index out of range

Но если я подключу, я = 18

Leave one out cross validation
Test report: 19
total word count of report: 741
summary word count: ~ 185.25
['3.10', '10.1', '2.2', '4.1', '5.3', '2.4']
Precision= 0.8333333333333334
Recall= 0.22727272727272727
F1= 0.35714285714285715

Так обнаружил, что цикл потерпел неудачу в 18, 27, 30, 33, 35. Я не моготладьте это, потому что он работает нормально при ручном подключении этих значений.

1 Ответ

0 голосов
/ 28 ноября 2018

В Python range(n) выдаст все числа от 0 до n.Чтобы помочь визуализировать вашу проблему, представьте, что у нас есть простая программа:

array = [0, 1, 2, 3, 4]
for m in range(len(array)): # len(array) evaluates to 5
    print(m) 
for n in array:
    print(n)

Вывод (замена строк с пробелами) будет:

0 1 2 3 4 5
0 1 2 3 4

Как видите, range(len(array))пошел дальше, чем длина массива.Вот где приходит ваш код. В первой строке вы запускаете цикл for, который будет циклически повторять range(len(features)), но затем в четвертой строке вы получаете доступ к features[i].Таким образом, на последней итерации цикла range пересекает длину массива, и Python выдает ошибку, потому что код пытается получить доступ к элементу features, которого там нет.

...