Как исправить ошибку IndexError

#python #scikit-learn

#python #scikit-учиться

Вопрос:

Используя алгоритм логистической регрессии, реализованный в Python Scikit-learn, классифицируйте три типа цветов (Setosa, Versicolor, Virgin) в наборе данных Iris в соответствии с длиной и шириной лепестка.

Могу ли я узнать, как исправить кодировку, см. прикрепленный файл —

 from sklearn import datasets

#load data
iris=datasets.load_iris()
X=iris.data[:,[2,3]]
y=iris.target
from sklearn.model_selection import train_test_split
X_train, X_test,y_train, y_test=train_test_split(X,y,test_size=0.3, random_state=0,stratify=y)
#feature scaling
from sklearn.preprocessing import StandardScaler
sc=StandardScaler()
sc.fit(X_train)
X_train_std=sc.transform(X_train)
X_test_std=sc.transform(X_test)
#Logistic regression
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score
C1=[]
A=[]
C1=[0.01,0.1,1,10,100,1000]
for i in range(len(C1)):
    lr=LogisticRegression(C=C1[i], random_state=0)
    lr.fit(X_train_std,y_train)
    y_pred=lr.predict(X_test_std)
    A[i].append(accuracy_score(y_test,y_pred))

#draw figure
import matplotlib.pyplot as plt
plt.plot(C1,A)
plt.title('Logistic Regression')
plt.xlabel('C')
plt.ylabel('Accuracy')
plt.show()
  

Пожалуйста, посмотрите на картинку — введите описание изображения здесь
.

Вот ошибка —

 runfile('C:/Users/HSIPL/Desktop/testttttttttttttttttt.py', wdir='C:/Users/HSIPL/Desktop')
Reloaded modules: __mp_main__
Traceback (most recent call last):

  File "<ipython-input-4-94a347d3dde0>", line 1, in <module>
    runfile('C:/Users/HSIPL/Desktop/testttttttttttttttttt.py', wdir='C:/Users/HSIPL/Desktop')

  File "C:UsersHSIPLAnaconda3libsite-packagesspyder_kernelscustomizespydercustomize.py", line 668, in runfile
    execfile(filename, namespace)

  File "C:UsersHSIPLAnaconda3libsite-packagesspyder_kernelscustomizespydercustomize.py", line 108, in execfile
    exec(compile(f.read(), filename, 'exec'), namespace)

  File "C:/Users/HSIPL/Desktop/testttttttttttttttttt.py", line 26, in <module>
    A[i].append(accuracy_score(y_test,y_pred))

IndexError: list index out of range
  

Ответ №1:

Выполняя A[i].append(accuracy_score(y_test,y_pred)) , вы говорите, что это A само по себе содержит lists и пытаетесь добавить по одному значению к каждому из них.

Однако, A является пустым list , и, соответственно, вы просто хотите A.append(accuracy_score(y_test,y_pred))

Комментарии:

1. Ваш ответ правильный, но картинка по-прежнему неправильная — скажите мне, что произошло?

2. @vokoyo что вы подразумеваете под «неправильным»? Пожалуйста, предоставьте ожидаемый результат.

3. Пожалуйста, посмотрите на картинку — ссылку выше

4. Пожалуйста, посмотрите на картинку — введите описание изображения здесь

5. @vokoyo поскольку мой ответ решил проблему, с которой вы столкнулись, пожалуйста, примите его. Опять же, вам следует задать новый вопрос относительно масштаба графика, поскольку это вопрос, отличный от темы этого вопроса.

Ответ №2:

главное: проблема была рядом, train_test_split(X,y,test_size=0.3, random_state=0) вам не нужно делать stratified sampling

другое: вам нужно изменить scale на log . и A.append вместо A[i].append

 from sklearn import datasets

import numpy as np
#load data
iris=datasets.load_iris()
X=iris.data[:,[2,3]]
y=iris.target
from sklearn.model_selection import train_test_split
X_train, X_test,y_train, y_test=train_test_split(X,y,test_size=0.3, random_state=0)
#feature scaling
from sklearn.preprocessing import StandardScaler
sc=StandardScaler()
sc.fit(X_train)
X_train_std=sc.transform(X_train)
X_test_std=sc.transform(X_test)
#Logistic regression
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score
A=[]
C1=[0.01,0.1,1,10,100,1000]
for i in range(len(C1)):
    lr=LogisticRegression(C=C1[i], random_state=0)
    lr.fit(X_train_std,y_train)
    y_pred=lr.predict(X_test_std)
    A.append(accuracy_score(y_test,y_pred))

#draw figure
import matplotlib.pyplot as plt
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)
line, = ax.plot(C1,A)
ax.set_xscale("log")
new_tick_label  = ['{:1.2f}'.format(x) for x in C1]
ax.set_xticks(C1)
ax.set_xticklabels(new_tick_label)

ax.set_yticks(np.arange(.6,1.01,.05))
plt.grid(True)

plt.title('Logistic Regression')
plt.xlabel('C')
plt.ylabel('Accuracy')
plt.show()
  

Комментарии:

1. Я получаю картинку, но все еще не очень похожую на прикрепленное изображение — почему?

2. @vokoyo пожалуйста, проверьте обновления сейчас и примите ответ, если это решит вашу проблему.

3. Могу ли я получить ваш контактный email?