拟合大数据时如何解决sklearn内存错误?

时间:2019-07-10 11:17:55

标签: python pandas machine-learning scikit-learn nlp

所以我基本上有一个庞大的数据集可以使用,它几乎由1,200,000行组成,并且我的目标类数量约为20,000个标签。

我正在对数据进行文本分类,因此我先对其进行清理,然后对其进行tfidf矢量化。

问题出在我每次尝试选择模型并拟合数据时,都会出现内存错误

我当前的PC是具有16GB RAM的Core i7

vectorizer = feature_extraction.text.TfidfVectorizer(ngram_range=(1, 1),
                         analyzer='word',
                         stop_words= fr_stopwords)

datavec = vectorizer.fit_transform(data.values.astype('U'))

X_train, X_test, y_train, y_test = train_test_split(datavec,target,test_size=0.2,random_state=0)


print(type(X_train))
print(X_train.shape)

输出: 类'scipy.sparse.csr.csr_matrix' (963993,125441)

clf.fit(X_train, y_train)

这是发生内存错误的地方

我尝试过: 1-采样数据,但错误仍然存​​在。

2-适用于许多不同的模型,但只有KNN模型有效(但准确率较低)

3-将datavec转换为数组,但是此过程还会导致内存错误

4-在不同模型上使用多重处理

5-我曾经在SO上遇到过类似的每个问题,但是答案不清楚,或者与我的问题不完全一样

这是我的代码的一部分:

vectorizer = feature_extraction.text.TfidfVectorizer(ngram_range=(1, 1),
                         analyzer='word',
                         stop_words= fr_stopwords)



  df = pd.read_csv("C:\\Users\\user\\Desktop\\CLEAN_ALL_DATA.csv", encoding='latin-1')
classes = np.unique(df['BENEFITITEMCODEID'].str[1:])

vec = vectorizer.fit(df['NEWSERVICEITEMNAME'].values.astype('U'))

del df


clf = [KNeighborsClassifier(n_neighbors=5),
   MultinomialNB(),
   LogisticRegression(solver='lbfgs', multi_class='multinomial'),
   SGDClassifier(loss="log", n_jobs=-1),
   DecisionTreeClassifier(max_depth=5),
   RandomForestClassifier(n_jobs=-1),
   LinearDiscriminantAnalysis(),
   LinearSVC(multi_class='crammer_singer'),
   NearestCentroid(),
  ]

data = pd.Series([])

for chunk in pd.read_csv(datafile, chunksize=100000):

   data =  chunk['NEWSERVICEITEMNAME']
   target = chunk['BENEFITITEMCODEID'].str[1:]

   datavec = vectorizer.transform(data.values.astype('U'))

   clf[3].partial_fit(datavec, target,classes = classes)
   print("**CHUNK DONE**")

s = "this is a testing sentence"
svec = vectorizer.transform([s])

clf[3].predict(svec)  --> memory error
clf[3].predict(svec).todense()  --> taking a lot of time to finish
clf[3].predict(svec).toarrray()  --> taking a lot of time to finish as well

我还能尝试其他什么吗?

2 个答案:

答案 0 :(得分:0)

我不知道您使用的是哪种类型的算法(或更重要的是它们是如何实现的),但是您是否尝试过制作x&y输入生成器?与说列表相比,数据类型可以节省大量空间。一些链接:

https://wiki.python.org/moin/Generators

Is there a way to avoid this memory error?

此外,我知道可以对多个模型进行部分训练(就像您输入一些数据,保存模型,加载模型并继续训练同一模型一样-我知道Gensim可以做到这一点) ,这可能也会有所帮助。

答案 1 :(得分:0)

根据: https://simple-videochat-test.herokuapp.com

TfidfVectorizer包含一个名为max_features的参数,该参数带有一个int,该参数将帮助我们从矩阵中选择所需的功能,从而使我们对内存问题有一定的控制权

还值得一提的是,参数max_dfmin_df都有助于减小矩阵大小