1. ホーム
  2. パイソン

[解決済み] IndexError: スカラー変数への無効なインデックスを修正する方法

2022-03-03 21:33:29

質問

このコードはエラーを発生させます。

IndexError: invalid index to scalar variable.

をラインアップしています。 results.append(RMSPE(np.expm1(y_train[testcv]), [y[1] for y in y_test]))

どうすれば直るのか?

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 です。

[False False False ...,  True  True  True]

どのように解決するのですか?

スカラー値(反復不可能な値)へのインデックスを作成しようとしている。

[y[1] for y in y_test]
#  ^ this is the problem

を呼び出すと [y for y in test] ではすでに値に対して繰り返し処理を行なっているので y .

あなたのコードは、次のようにしようとしているのと同じです。

y_test = [1, 2, 3]
y = y_test[0] # y = 1
print(y[0]) # this line will fail

結果の配列に何を入れようとしているのかよくわかりませんが、とりあえずは [y[1] for y in y_test] .

y_testの各yをresultsに追加したい場合は、リスト内包をさらに拡張して以下のようにします。

[results.append(..., y) for y in y_test]

あるいは、forループを使うだけです。

for y in y_test:
    results.append(..., y)