【发布时间】:2018-12-01 04:39:48
【问题描述】:
我有一个带有 86k 行、5 个特征和 1 个目标列的 pandas DataFrame。我正在尝试使用 70% 的 DataFrame 作为训练数据来训练 DecisionTreeClassifier,但我从 fit 方法中得到了 MemoryError 。我已经尝试更改一些参数,但我真的不知道是什么导致了错误,所以我不知道如何处理它。 我使用的是具有 8GB RAM 的 Windows 10。
代码
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 警告 -
如果您在运行此代码之前/期间打开任务管理器,您是否有几 GB 的内存可用,或者其他进程可能会占用所有内存?
-
我对 y_train 和 y_test 都这样做了,但它并没有真正改变任何东西,我得到了同样的错误:/
-
在运行之前我有大约 2.7GB 的可用内存,在执行过程中它会降至最低 2.3GB 直到我得到 MemoryError。
-
2.7G 可能还不够。仅该错误就表明正在分配的一块内存约为 670M,并且是
realloc调用,这意味着它可能正在尝试调整现有分配的类似大小的块......所以可能只有 1-1.5G它正在分配的那一件事。您的数据似乎非常合理,但该决策树可能只需要更多内存。尝试杀死一些占用内存的进程和/或重新启动,然后再试一次。例如,如果您打开了很多选项卡,Chrome 可能会占用大量内存。不过,8G 应该足以解决这个问题。
标签: python machine-learning scikit-learn decision-tree