Scikit-Learn MemoryError с RandomForestClassifier - PullRequest
0 голосов
/ 06 июня 2019

Я следую инструкциям здесь: https://blog.hyperiondev.com/index.php/2019/02/18/machine-learning/

У меня точно такой же код, который использует автор, но я все же поделюсь им ниже ...

train_data = scipy.io.loadmat('train_32x32.mat')
X = train_data['X']
y = train_data['y']

img_index = 24

X = X.reshape(X.shape[0]*X.shape[1]*X.shape[2],X.shape[3]).T
y = y.reshape(y.shape[0],)
X, y = shuffle(X, y, random_state=42)

clf = RandomForestClassifier(n_estimators=10, n_jobs=1)

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
clf.fit(X_train, y_train) <-----------(MEMORY ERROR)

preds = clf.predict(X_test)
print("Accuracy:", accuracy_score(y_test,preds))

Набор данных, который я использую, представляет собой словарь чисел и рисунков чисел.Каждый раз, когда я добираюсь до линии, которую я указал выше, я получаю MemoryError.Полное отслеживание ошибок приведено ниже:

Traceback (most recent call last):
  File "C:/Users/jack.walsh/Projects/img_recog/main.py", line 22, in <module>
    clf.fit(X_train, y_train)
  File "C:\Users\jack.walsh\AppData\Local\Programs\Python\Python37-32\lib\site-packages\sklearn\ensemble\forest.py", line 249, in fit
    X = check_array(X, accept_sparse="csc", dtype=DTYPE)
  File "C:\Users\jack.walsh\AppData\Local\Programs\Python\Python37-32\lib\site-packages\sklearn\utils\validation.py", line 496, in check_array
    array = np.asarray(array, dtype=dtype, order=order)
  File "C:\Users\jack.walsh\AppData\Local\Programs\Python\Python37-32\lib\site-packages\numpy\core\numeric.py", line 538, in asarray
    return array(a, dtype, copy=False, order=order)
MemoryError

Я запускал Resource Monitor параллельно с ним и понял, что моя используемая память никогда не превышает 30%.Дайте мне знать, как я могу обойти это без изменения результатов!

X.shape = (73257, 3072)

X_train.shape = (51279, 3072)

У меня 16 ГБ ОЗУ на этой машине.

1 Ответ

1 голос
/ 06 июня 2019

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

Что-то, что я бы сделал в этой ситуации:

  1. Уменьшите количество функций перед тренировкой, что сложно сделать, поскольку ваши данные - это изображение, а каждый столбец - просто пиксельное значение, возможно, вы можете изменить размер изображения, чтобы оно стало меньше.

  2. Добавьте регуляризацию в ваш классификатор случайных лесов, например, установите max_depth на меньшее или установите max_features, чтобы при каждом расщеплении учитывались не все 3072 объекта. Вот полный список параметров, которые вы можете настроить: https://scikit -learn.org / stable / modules / generate / sklearn.ensemble.RandomForestClassifier.html

  3. Согласно Ошибка памяти Scikit Learn RandomForest , настройка n_jobs=1 также может помочь.

  4. Наконец, я бы лично не использовал случайный лес для классификации изображений. Я бы выбрал классификаторы типа SVM или углубился в модели глубокого обучения.

...