Попытка установить подмножество вектора равным другому вектору, но все равно 0 - PullRequest
0 голосов
/ 03 июня 2018

Я пытаюсь войти в Python для статистики, исходя из R фона.Я установил скрипт для перекрестной проверки набора данных, с которым работал:

cvIndex = np.remainder(np.arange(dat.shape[0]), 10)
pred = np.arange(dat.shape[0])

for i in range(10):
    #get training and test set
    trFeatures = dat[cvIndex != i, :]
    teFeatures = dat[cvIndex == i, :]
    trY = y[cvIndex != i]

    #fit random forest
    rf = RandomForestClassifier(n_estimators = 500, random_state = 42)
    rf.fit(trFeatures, trY);

    #make and store prediction
    tePred = rf.predict_proba(teFeatures)[:, 1]
    pred[cvIndex == i] = tePred.copy()

print(pred)

, который возвращает вектор всех нулей.Насколько я могу судить, это правильный способ установить подмножество вектора равным другому вектору (и действительно, я попытался сделать это с некоторыми фиктивными векторами, но с успехом).Другая очевидная потенциальная проблема заключается в том, что tePred может быть всеми нулями, но, например, извлечение любого конкретного случая (i = 9) дает следующее:

i = 9
#get training and test set
trFeatures = dat[cvIndex != i, :]
teFeatures = dat[cvIndex == i, :]
trY = y[cvIndex != i]

#fit random forest
rf = RandomForestClassifier(n_estimators = 500, random_state = 42)
rf.fit(trFeatures, trY);

#make and store prediction
tePred = rf.predict_proba(teFeatures)[:, 1]

print(tePred[1:50])

[ 0.264  0.034  0.02   0.002  0.     0.014  0.     0.     0.     0.102
  0.14   0.     0.024  0.002  0.     0.002  0.004  0.     0.044  0.     0.382
  0.042  0.     0.004  0.     0.112  0.002  0.074  0.     0.016  0.012
  0.004  0.     0.     0.006  0.002  0.01   0.     0.     0.     0.     0.004
  0.002  0.002  0.044  0.004  0.     0.     0.004]

Было бы очень признательно за помощь.

1 Ответ

0 голосов
/ 03 июня 2018

Выглядит как целочисленное принуждение для меня.np.arange возвращает целочисленный массив, который вы затем обновляете на месте.Поскольку операция на месте не может изменить dtype массива, rhs будет преобразован в int.Если ваши входные данные являются вероятностями, это будут все нули.

Поскольку вы перезаписываете все pred, в конце концов вам не нужно ничего инициализировать, поэтому используйте np.empty(dat.shape[0]), который по умолчанию имеет тип float dtype вместо np.arange должен исправить ваш код.

Два несвязанных примечания:

  • копировать tePred в последнюю строку цикла не нужно.
  • Pythonподобно C использует индексирование с нуля, поэтому tePred[1:50] пропускает первый элемент.
...