Python Jupyter内核使用coremltools处理大型决策树
我已经使用scikit learn的DecisionTreeClassifier在一个数据集上训练了一个模型,该数据集具有>3000000行和15个特征(类别的二进制编码)。它运行良好,并完成了我希望它完成的任务。当我尝试将其转换为CoreML模型时,它不起作用。我得到“内核似乎已经死了。它将自动重新启动。”我降低了数据的大小,对于非常小的批处理,它可以正常工作。它似乎打破了大约500行 我对使用CoreML还不熟悉,这可能是对它工作原理的误解,但我不确定。我觉得考虑到它的用途,CoreML应该能够处理具有大量类标签的大型模型(我估计大约有40000个) 你知道如何解决这个问题吗 我正在做的一个简单的想法:Python Jupyter内核使用coremltools处理大型决策树,python,scikit-learn,jupyter-notebook,coreml,coremltools,Python,Scikit Learn,Jupyter Notebook,Coreml,Coremltools,我已经使用scikit learn的DecisionTreeClassifier在一个数据集上训练了一个模型,该数据集具有>3000000行和15个特征(类别的二进制编码)。它运行良好,并完成了我希望它完成的任务。当我尝试将其转换为CoreML模型时,它不起作用。我得到“内核似乎已经死了。它将自动重新启动。”我降低了数据的大小,对于非常小的批处理,它可以正常工作。它似乎打破了大约500行 我对使用CoreML还不熟悉,这可能是对它工作原理的误解,但我不确定。我觉得考虑到它的用途,CoreML应该
import pandas as pd
import numpy as np
import sklearn
import coremltools
import random
import string
from sklearn.tree import DecisionTreeClassifier
X = np.random.choice([0, 1], size=(15*1000,), p=[1./3, 2./3])
X = np.split(X,1000)
y = []
for i in range(0,1000):
x = ''.join(random.choice(string.lowercase) for x in range(5))
y.append(x)
clf = DecisionTreeClassifier()
clf.fit(X,y)
d = {'arr': X, 'str': y}
df = pd.DataFrame(data=d)
coreml_model = coremltools.converters.sklearn.convert(clf, "arr",
"str") ## kernel dies here for larger data
coreml_model.save('mymodel.mlmodel')
更新:这可能是内存问题。一旦超过2MB,我就会
malloc:**对象0x7fb096a0f738的错误:已释放对象的校验和不正确-对象可能在被释放后被修改。***在malloc\u error\u break中设置断点以进行调试
调试只会带来
分段错误:11
“长度为~15的二进制数组表示类别”那么,您不是有15个特征吗?为什么要做数组列表?数组可以是二维的。当内核死机时,这是因为Python崩溃了,或者Python使用的库崩溃了。在本例中,它似乎是coremltools中的一个bug。