Как решить sklearn Ошибка памяти при подгонке больших данных? - PullRequest
1 голос
/ 10 июля 2019

Таким образом, у меня есть огромный набор данных для работы, он почти состоит из 1 200 000 строк, а количество целевых классов составляет около 20 000 меток.

Я выполняю классификацию текста по моим данным, поэтому я сначалаочистил его, а затем выполнил на нем векторизацию tfidf.

Проблема заключается в том, что всякий раз, когда я пытаюсь выбрать модель и подгонять данные, она выдает ошибку памяти

Мой текущий компьютер - Core i7с 16 ГБ ОЗУ

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 - Iбыли через каждый подобный вопрос на 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 голосов
/ 25 июля 2019

Согласно: https://scikit -learn.org / стабильный / модули / полученные / sklearn.feature_extraction.text.TfidfVectorizer.html

TfidfVectorizer содержит параметр с именем: max_features, который принимает целое число. Этот параметр поможет нам выбрать, сколько функций мы хотим получить из нашей матрицы, что даст нам немного контроля над проблемой памяти

Стоит также отметить, что оба параметра max_df и min_df также помогают уменьшить размер матрицы

0 голосов
/ 10 июля 2019

Я не знаю, какие типы алгоритмов вы используете (или, что более важно, как они реализованы), но вы пытались сделать свои генераторы входов x & y? Тип данных может сэкономить массу пространства по сравнению со списками. Некоторые ссылки:

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

Есть ли способ избежать этой ошибки памяти?

Кроме того, я знаю, что есть несколько моделей, которые можно обучать по частям (например, вы вводите некоторые данные, сохраняете модель, загружаете модель и продолжаете обучать ту же самую модель - я знаю, что Генсим может, например, это сделать) , что также может помочь.

...