我将在此跟随本教程: 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。
答案 0 :(得分:1)
鉴于您的数据集具有3072列(对于图像而言是合理的),我只是认为对于随机森林而言,它太重载了,尤其是当您没有对分类器应用正则化时。该机器根本没有足够的内存来分配这种巨大的模型。
在这种情况下我会做的事情:
减少训练前的功能数量,由于数据是图像并且每一列都只是一个像素值,因此很难做到,也许您可以将图像调整为较小的大小。
向您的随机森林分类器中添加正则化,例如,将max_depth
设置为较小或将max_features
设置为使得每次拆分时都不会考虑所有3072个特征。以下是您可以调整的参数的完整列表:https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.RandomForestClassifier.html
根据Scikit Learn RandomForest Memory Error,设置n_jobs=1
也可能会有所帮助。
最后,我个人不会使用随机森林进行图像分类。我会选择SVM之类的分类器,或者深入研究深度学习模型。