我正在尝试为CIFAR-10数据创建一个简单的分类器, 但是当我试图执行这个python代码时:
import cPickle
from sklearn.multiclass import OneVsRestClassifier
from sklearn.svm import LinearSVC
def unpickle(file):
with open(file, 'rb') as fo:
dict = cPickle.load(fo)
return dict
def main():
s="data_batch_"
dicts=[None]*5
for i in xrange(1,6):
dicts[i-1]=unpickle(s+str(i))
X, y = dicts[0]['data'], dicts[0]['labels']
for i in xrange(1,5):
X = np.concatenate((X, dicts[i]['data']))
y = np.concatenate((y, dicts[i]['labels']))
classifier=OneVsRestClassifier(LinearSVC(random_state=0)).fit(X, y)
只要X和y的大小不是太大 - 10000,或多或少,它就可以正常工作。但是当我尝试2批次的20000个样品(或来自所有5个批次的50000个样品)时,我得到了“Python.exe停止工作”的弹出窗口。代码本身或内存耗尽有问题吗?
如果内存耗尽,我该怎么办?是否可以执行5次拟合(X,y),每个循环的每个循环?
答案 0 :(得分:0)
您的分类器LinearSVC不支持(小型)批次。
您需要选择this list中提供的其中一个。
通过这些,SGDClassifier可以参数化为线性SVM(默认!)。
因此,您可以尝试直接在所有数据上使用它,或者抽象输入数据生成并手动使用partial_fit。但是使用预处理/规范化并检查超参数(学习率和学习率计划)。
答案 1 :(得分:-1)
对于某些应用程序,传统方法的示例,特征(或两者)的数量和/或它们需要处理的速度是具有挑战性的。在这些情况下,scikit-learn有许多选项可供您考虑使系统扩展。
核外(或“外部存储器”)学习是一种用于从无法放入计算机主存储器(RAM)的数据中学习的技术。 以下是旨在实现此目标的系统草图: 1.一种流实例的方法 2.一种从实例中提取特征的方法 3.增量算法
直播实例 基本上,1.可能是一个读取器,它从硬盘驱动器,数据库,网络流等文件中生成实例。但是,有关如何实现这一点的详细信息超出了本文档的范围。
提取功能 2.可以是在scikit-learn支持的不同特征提取方法中提取特征的任何相关方式。但是,在处理需要向量化的数据时,如果事先不知道某些特征或值,则应谨慎处理。一个很好的例子是文本分类,其中可能在训练期间发现未知术语。如果从应用程序的角度对数据进行多次传递是合理的,则可以使用有状态向量化程序。否则,可以通过使用无状态特征提取器来调高难度。目前,执行此操作的首选方法是使用sklearn.feature_extraction.FeatureHasher为数据集实现的所谓散列技巧,其中分类变量表示为Python dicts列表或sklearn.feature_extraction.text.HashingVectorizer用于文本文档。
增量学习 最后,对于3.我们在scikit-learn中有很多选项。尽管所有算法都不能逐步学习(即,没有一次看到所有实例),但实现partial_fit API的所有估计器都是候选者。实际上,从一小批实例中逐步学习的能力(有时称为“在线学习”)是核心学习的关键,因为它保证在任何给定时间内只有少量实例。主记忆。为平衡相关性和内存占用的小批量选择一个好的大小可能涉及一些调整[1]。
对于分类,需要注意的一点是,虽然无状态特征提取例程可能能够处理新的/看不见的属性,但增量学习者本身可能无法应对新的/看不见的目标类。在这种情况下,您必须使用classes =参数将所有可能的类传递给第一个partial_fit调用。
在选择合适的算法时要考虑的另一个方面是,所有这些都不会对每个示例的重要性随着时间的推移而变得相同。也就是说,即使在许多例子之后,Perceptron仍然对标记错误的例子很敏感,而SGD *和PassiveAggressive *族对这种伪像更加健壮。相反,当他们的学习率随着时间的推移而降低时,后者也会倾向于对流程中迟到的非常不同但又经过适当标记的例子给予较少的重视。
祝你好运!