使用scikit-learn决策树和随机森林分类器拟合时出现内存错误

6
我有一个包含86k行、5个特征和1个目标列的pandas DataFrame。我想使用DataFrame的70%作为训练数据来训练DecisionTreeClassifier,但是在调用fit方法时出现MemoryError错误。我尝试了更改一些参数,但由于不知道错误原因,所以无法解决它。 我的操作系统是Windows 10,内存大小为8GB。
代码:
train, test = train_test_split(data, test_size = 0.3)
X_train = train.iloc[:, 1:-1] # first column is not a feature
y_train = train.iloc[:, -1]
X_test = test.iloc[:, 1:-1]
y_test = test.iloc[:, -1]

DT = DecisionTreeClassifier()
DT.fit(X_train, y_train)
dt_predictions = DT.predict(X_test)

错误

File (...), line 97, in <module>
DT.fit(X_train, y_train)
File "(...)\AppData\Local\Programs\Python\Python36-32\lib\site-packages\sklearn\tree\tree.py", line 790, in fit
X_idx_sorted=X_idx_sorted)
File "(...)\AppData\Local\Programs\Python\Python36-32\lib\site-packages\sklearn\tree\tree.py", line 362, in fit
builder.build(self.tree_, X, y, sample_weight, X_idx_sorted)
File "sklearn\trewe\_tree.pyx", line 145, in sklearn.tree._tree.DepthFirstTreeBuilder.build
File "sklearn\tree\_tree.pyx", line 244, in sklearn.tree._tree.DepthFirstTreeBuilder.build
File "sklearn\tree\_tree.pyx", line 735, in sklearn.tree._tree.Tree._add_node
File "sklearn\tree\_tree.pyx", line 707, in sklearn.tree._tree.Tree._resize_c
File "sklearn\tree\_utils.pyx", line 39, in sklearn.tree._utils.safe_realloc
MemoryError: could not allocate 671612928 bytes

当我尝试使用RandomForestClassifier时,总是在进行拟合的那一行出现相同的错误。我该如何解决这个问题?


只是为了满足我的好奇心,你能试试 y_train = train.iloc[:, -1:](在末尾添加冒号),这样你的 Y 值的形状将会是 (n, 1) 而不仅仅是 (n,)。我不认为这会导致问题,但我知道之前看到过 sklearn 的警告。 - scnerd
我对y_train和y_test都做了这个操作,但实际上并没有改变什么,我还是得到了同样的错误 :/ - julia
我在运行之前有大约2.7GB的可用内存,在执行期间它会降至最低2.3GB,直到我收到MemoryError错误。 - julia
1
2.7G 可能不够用。这个错误表明正在分配的一个内存块大约是 670M,而且是一个 realloc 调用,这意味着它可能正在尝试调整一个已经分配的类似大小的块的大小... 所以仅仅为了分配那个东西,可能需要 1-1.5G 的内存。你的数据看起来很合理,但是决策树可能需要更多的内存。尝试杀掉一些占用内存的进程和/或重新启动,然后再试一次。例如,如果你打开了很多标签页,Chrome 可能会占用大量内存。8G 应该足够解决这个问题。 - scnerd
你能在执行 .fit() 之前展示 X_train.dtypeX_train.shapeY_train.shapenumpy.unique(Y_train) 的输出吗?86k 行和 5 个特征不算多,所以这应该不会占用太多内存。 - Jon Nordby
显示剩余3条评论
1个回答

2

我遇到了同样的问题。请确保你正在处理分类问题而不是回归问题。如果你的目标列是连续的,你可能想使用随机森林回归而不是随机森林分类器。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接