具有 3000 个标签和 1000000 行的分类器,内存错误
Posted
技术标签:
【中文标题】具有 3000 个标签和 1000000 行的分类器,内存错误【英文标题】:Classifier with 3000 labels and 1000000 rows, memory error 【发布时间】:2018-08-31 21:40:45 【问题描述】:我正在基于一个数据集构建一个分类器,该数据集有 10^6 行,每行大约 15 个单词,总共大约 3000 个标签。我已经做了预处理(包括词干、分割等),我的 windows 是 64 位的,python 64 位版本也安装了。我有 16 GB 的 RAM 和一个 i7 处理器。在底部,您会找到整个脚本。
问题是内存错误,我不知道如何修复它。我的词袋不应该随着更大的数据集(只有有限数量的词)变得更大,但是 10^6 x 15000 的矩阵(我用 15000 个最大词构建了我的词袋)仍然非常真实大的。谁能帮助我解决这个问题的最佳方法,有没有办法将单词袋分开并以批量方式使用?
import numpy as np
import pandas as pd
import re
from nltk.stem.snowball import SnowballStemmer
from sklearn.preprocessing import LabelEncoder
#from sklearn.feature_extraction import DictVectorizer
from stop_words import get_stop_words
stop_words = get_stop_words('german')
# Importing the dataset
df = pd.read_excel('filename', delimiter = '\t', quoting = 3)
df = df.sample(frac=1).reset_index(drop=True)
#Aanpassen van de kolomnamen voor overzicht
namenKolommen = list(df.columns.values)
newcols =
namenKolommen[2] : 'Short Description 1',
namenKolommen[3] : 'Short Description 2',
namenKolommen[4] : 'Type Description',
namenKolommen[5] : 'Long Description',
namenKolommen[11] : 'Manufacturer',
namenKolommen[7] : 'L1',
df.rename(columns = newcols, inplace=True)
print('Start corpus')
AllLabels = df['L1']
le1_y = LabelEncoder()
y = le1_y.fit_transform(AllLabels)
Text_input = df['Short Description 1'].fillna('') + ' ' + df['Short Description 2'].fillna('')+ ' ' + df['Type Description'].fillna('') + ' ' + df['Long Description'].fillna('') + ' ' + df['Manufacturer'].fillna('')
Text_input.to_csv('Opgeschoonde lijst.csv')
corpus = []
for i in range(0,len(Text_input)):
review = re.sub('[^a-zA-Züä0-9()ß-]',' ', str( Text_input[i]))
#str is tip van internet, blijkbaar klopte datatype niet in die cell
review = review.lower()
review = review.split()
stemmer = SnowballStemmer("german")
review= [stemmer.stem(word) for word in review if not word in set(stop_words)]
review = ' '.join(review )
corpus.append(review)
import pickle
with open('Opgeschoonde_Lijst_Met_Stemming', 'wb') as fp:
pickle.dump(corpus, fp)
print('Start predicting model')
from sklearn.feature_extraction.text import CountVectorizer
cv = CountVectorizer(max_features = 15000)
X = cv.fit_transform(corpus).toarray()
#splitten in test en train sets
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state = 18)
from sklearn.linear_model import LogisticRegression
classifier = LogisticRegression(random_state = 0)
classifier.fit(X_train, y_train)
#Predicting the test results
y_pred = classifier.predict(X_test)
y_pred_strings = le1_y.inverse_transform(y_pred)
#Making the Confusion matrix
from sklearn.metrics import confusion_matrix
cm = confusion_matrix(y_test, y_pred)
accuracy1=np.trace(cm)/len(X_test)
【问题讨论】:
你可以尝试将一些值设置为None
,这样垃圾收集可以释放一些内存。在这些情况下,内存分析器很方便。
【参考方案1】:
您应该查看 scikit learn 文档中的 out-of-core classification 用户指南。
简单地说一些算法(即不是所有算法)通过partial_fit
方法支持在线分类(和回归)。
【讨论】:
以上是关于具有 3000 个标签和 1000000 行的分类器,内存错误的主要内容,如果未能解决你的问题,请参考以下文章