所以我基本上有一个庞大的数据集可以使用,它几乎由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
我还能尝试其他什么吗?
答案 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_df
和min_df
都有助于减小矩阵大小