Deze code genereert een fout:
IndexError: invalid index to scalar variable.
op de regel: results.append(RMSPE(np.expm1(y_train[testcv]), [y[1] for y in y_test]))
Hoe dit op te lossen?
import pandas as pd
import numpy as np
from sklearn import ensemble
from sklearn import cross_validation
def ToWeight(y):
w = np.zeros(y.shape, dtype=float)
ind = y != 0
w[ind] = 1./(y[ind]**2)
return w
def RMSPE(y, yhat):
w = ToWeight(y)
rmspe = np.sqrt(np.mean( w * (y - yhat)**2 ))
return rmspe
forest = ensemble.RandomForestRegressor(n_estimators=10, min_samples_split=2, n_jobs=-1)
print ("Cross validations")
cv = cross_validation.KFold(len(train), n_folds=5)
results = []
for traincv, testcv in cv:
y_test = np.expm1(forest.fit(X_train[traincv], y_train[traincv]).predict(X_train[testcv]))
results.append(RMSPE(np.expm1(y_train[testcv]), [y[1] for y in y_test]))
testcv
is:
[False False False ..., True True True]
Antwoord 1, autoriteit 100%
U probeert te indexeren in een scalaire (niet-itereerbare) waarde:
[y[1] for y in y_test]
# ^ this is the problem
Als je [y for y in test]
aanroept, herhaal je de waarden al, dus je krijgt een enkele waarde in y
.
Uw code is hetzelfde als proberen om het volgende te doen:
y_test = [1, 2, 3]
y = y_test[0] # y = 1
print(y[0]) # this line will fail
Ik weet niet zeker wat je in je resultatenreeks probeert te krijgen, maar je moet [y[1] for y in y_test]
verwijderen.
Als je elke y in y_test aan resultaten wilt toevoegen, moet je je lijstbegrip verder uitbreiden tot iets als dit:
[results.append(..., y) for y in y_test]
Of gebruik gewoon een for-lus:
for y in y_test:
results.append(..., y)
Antwoord 2, autoriteit 5%
Kortom, 1
is geen geldige index van y
. Als de bezoeker uit zijn eigen code komt, moet hij controleren of zijn y
de index bevat die hij probeert te openen (in dit geval is de index 1
).
Antwoord 3
In de for heb je een iteratie, en voor elk element van die lus, dat waarschijnlijk een scalair is, heeft het geen index. Als elk element een lege array, enkele variabele of scalair is en geen lijst of array, kun je geen indices gebruiken.