具有 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 行的分类器,内存错误的主要内容,如果未能解决你的问题,请参考以下文章

TensorFlow中具有稀疏标签的多标签图像分类?

具有 2 个标签的单元格始终“无法同时满足约束”

具有分类输出的逻辑回归 sklearn

多类文本分类,每类一个训练样例

具有 30M 行的表中的 COUNT(*) 和 GROUP BY

Keras中具有二进制分类的多标签