Ошибка регрессора случайного леса Python Scikit

Я пытаюсь загрузить данные обучения и тестирования из CSV, запустить регрессор случайного леса в scikit / sklearn, а затем спрогнозировать результат из тестового файла.

Файл TrainLoanData.csv содержит 5 столбцов; первый столбец - это выходные данные, а следующие 4 столбца - это характеристики. TestLoanData.csv содержит 4 столбца - характеристики.

Когда я запускаю код, я получаю ошибку:

    predicted_probs = ["%f" % x[1] for x in predicted_probs]
IndexError: invalid index to scalar variable.

Что это значит?

Вот мой код:

import numpy, scipy, sklearn, csv_io //csv_io from https://raw.github.com/benhamner/BioResponse/master/Benchmarks/csv_io.py
from sklearn import datasets
from sklearn.ensemble import RandomForestRegressor

def main():
    #read in the training file
    train = csv_io.read_data("TrainLoanData.csv")
    #set the training responses
    target = [x[0] for x in train]
    #set the training features
    train = [x[1:] for x in train]
    #read in the test file
    realtest = csv_io.read_data("TestLoanData.csv")

    # random forest code
    rf = RandomForestRegressor(n_estimators=10, min_samples_split=2, n_jobs=-1)
    # fit the training data
    print('fitting the model')
    rf.fit(train, target)
    # run model against test data
    predicted_probs = rf.predict(realtest)
    print predicted_probs
    predicted_probs = ["%f" % x[1] for x in predicted_probs]
    csv_io.write_delimited_file("random_forest_solution.csv", predicted_probs)

main()

person user1137778    schedule 09.01.2013    source источник


Ответы (3)


Возвращаемое значение из RandomForestRegressor - это массив чисел с плавающей запятой:

In [3]: rf = RandomForestRegressor(n_estimators=10, min_samples_split=2, n_jobs=-1)

In [4]: rf.fit([[1,2,3],[4,5,6]],[-1,1])
Out[4]: 
RandomForestRegressor(bootstrap=True, compute_importances=False,
           criterion='mse', max_depth=None, max_features='auto',
           min_density=0.1, min_samples_leaf=1, min_samples_split=2,
           n_estimators=10, n_jobs=-1, oob_score=False,
           random_state=<mtrand.RandomState object at 0x7fd894d59528>,
           verbose=0)

In [5]: rf.predict([1,2,3])
Out[5]: array([-0.6])

In [6]: rf.predict([[1,2,3],[4,5,6]])
Out[6]: array([-0.6,  0.4])

Итак, вы пытаетесь проиндексировать число с плавающей запятой, например (-0.6)[1], что невозможно.

Кстати, модель не возвращает вероятностей.

person Fred Foo    schedule 09.01.2013

Во-первых, всегда полезно иметь образцы данных для воспроизведения и отладки вашей проблемы. Если они слишком большие или секретные, вы можете извлечь из них интересную часть.

Кажется, что содержимое переменной predicted_probs не такое, как вы ожидали. Похоже, это список (или массив) целых чисел, и это то, чего я ожидал.

В sklearn метод X.train() всегда принимает обучающие данные и соответствующие им классы (обычно целые числа или строки). Затем метод X.predict() принимает только данные проверки и возвращает результаты прогнозирования, то есть для каждого набора в данных проверки один класс (снова целое число или строка).

Если вы хотите знать, насколько хороша точность обученного классификатора, вы должны не просто обучать и прогнозировать, но вы должны выполнять перекрестную проверку, то есть многократно обучать и проверять и каждый раз проверять, сколько прогнозов было правильным. У sklean отличная документация, я уверен, вы найдете соответствующий раздел. Если нет, спросите меня.

person Thorsten Kranz    schedule 09.01.2013
comment
Фактически результат predict - это массив чисел с плавающей запятой. RandomForestRegressor - это регрессионная модель, а не классификатор. - person Fred Foo; 09.01.2013

Попробуйте использовать numpy "genfromtxt" вместо "csv_io.read_data" для загрузки набора данных - он автоматически преобразует ваши данные из csv в массив numpy. И чтение статьи Начало работы с Python для науки о данных будет полезно для вас ...

person Emkan    schedule 24.01.2013