【发布时间】:2012-06-27 01:35:22
【问题描述】:
我正在尝试使用 sklearn 0.11 的 LogisticRegression 对象来拟合具有大约 80,000 个特征的 200,000 个观察值的模型。目标是将短文本描述分类为 800 个类别中的 1 个。
当我尝试拟合分类器时,pythonw.exe 给了我:
应用程序错误“...处的指令引用了 0x00000000 处的内存”。内存无法写入”。
这些特征非常稀疏,每次观察大约 10 个,并且是二进制的(1 或 0),所以根据我的信封计算,我的 4 GB RAM 应该能够处理内存需求,但这并没有t 似乎是这样。只有当我使用更少的观察和/或更少的特征时,模型才适合。
如果有的话,我想使用更多的观察和特征。我天真的理解是,在幕后运行的 liblinear 库能够支持这一点。有什么想法可以让我加入更多观察吗?
我的代码如下所示:
y_vectorizer = LabelVectorizer(y) # my custom vectorizer for labels
y = y_vectorizer.fit_transform(y)
x_vectorizer = CountVectorizer(binary = True, analyzer = features)
x = x_vectorizer.fit_transform(x)
clf = LogisticRegression()
clf.fit(x, y)
我传递给分析器的 features() 函数只返回一个字符串列表,指示在每个观察中检测到的特征。
我使用的是 Python 2.7、sklearn 0.11、具有 4 GB RAM 的 Windows XP。
【问题讨论】:
-
Python 解释器崩溃了吗?写信给
0x0是一个非常严重的错误,我们(scikit-learn 开发人员)应该调查一下。 -
Python 解释器确实崩溃了。
-
你使用的数据集是公开的吗?你能用更小的数据集重现这个崩溃吗(例如
x_first_half = x[:x.shape[0] / 2]或x_second_half = x[x.shape[0] / 2:]? -
不幸的是,数据集不是公开的,但我会尝试在公开的数据集上重现问题。如果我使用任何一半的观察值,或者如果我在 CountVectorizer 中将 max_features 截止值设置为大约 50,000,分类器就很合适。
标签: scikit-learn