【问题标题】:Scikit-learn MemoryError with RandomForestClassifier带有 RandomForestClassifier 的 Scikit-learn MemoryError
【发布时间】:2019-10-22 08:56:38
【问题描述】:

我正在关注这里的教程: 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

我与它并排运行资源监视器,并意识到我的已用内存从未超过 30%。告诉我如何在不改变结果的情况下解决这个问题!

X.shape = (73257, 3072)

X_train.shape = (51279, 3072)

我在这台机器上有 16GB RAM。

【问题讨论】:

标签: python machine-learning scikit-learn scipy random-forest


【解决方案1】:

鉴于您的数据集有 3072 列(对于图像来说是合理的),我只是认为它对于随机森林来说太重了,尤其是当您没有对分类器应用正则化时。机器根本没有足够的内存来分配这么大的模型。

在这种情况下我会做的事情:

  1. 在训练前减少特征数量,这很难做到,因为你的数据是图像,每列只是一个像素值,也许你可以将图像调整为更小。

  2. 为你的随机森林分类器添加正则化,例如,将max_depth 设置为更小或设置max_features,这样每次拆分时,不会考虑所有 3072 个特征。以下是您可以调整的完整参数列表:https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.RandomForestClassifier.html

  3. 根据Scikit Learn RandomForest Memory Error,设置n_jobs=1 可能也会有所帮助。

  4. 最后,我个人不会使用随机森林进行图像分类。我会选择像 SVM 这样的分类器,或者深入学习深度学习模型。

【讨论】:

  • 我可能需要更多地了解不同类型的分类器。调整图像大小最终会降低模型的准确性,因为它们已经是相当低质量的图像。即使使用n_jobs=1max_depth=1max_features=10,我也会收到错误消息。不同的分类器可能会更好地处理内存问题吗?
  • @JackWalsh 如果您正在做任何与图像相关的事情,这实际上与不同的分类器无关,而是与图像特征本身有关,因为每个像素都很重要,并且图像有很多像素。最受欢迎的数据集 MNIST 甚至有 784 个特征 (28*28),而且它是一个非常小的图像。在我看来,用神经网络以外的任何东西进行图像分类没有多大意义,除非你以传统的方式从图像中提取重要特征,例如 HOG 或其他。
猜你喜欢
  • 2016-01-26
  • 2023-03-22
  • 2014-04-20
  • 1970-01-01
  • 2018-12-30
  • 2012-09-03
  • 2015-06-23
  • 2017-04-12
  • 2015-08-17
相关资源
最近更新 更多