无法为具有大小的阵列分配内存



我是一个从事项目的NLP菜鸟,我需要计算几种不同方法的准确性;但是,我在运行代码时不断收到内存错误。例如,我不断收到"无法为形状为 (38045、50000) 和数据类型为 float64 的数组分配 14.2 GiB",即使我转换为 uint8 数据类型并弄乱了 Windows 高级设置以更改内存分配。我的代码如下。


import sklearn
import numpy as np
import sklearn.feature_extraction.text
import pandas as pd 
df = pd.read_csv ('amprocessed.csv')
labels = df.iloc[:, 0]
import sklearn.model_selection
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction.text import CountVectorizer
vectorizer = CountVectorizer(max_features=50000, dtype="uint8")
#vectorizer = TfidfVectorizer()
X = (vectorizer.fit_transform(df["Source"]).toarray()).astype(dtype="uint8")
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler() 
xscale = scaler.fit_transform(X).astype(dtype=np.uint8)
from sklearn import svm
x_train, x_test, y_train, y_test = sklearn.model_selection.train_test_split(xscale, labels, test_size=0.2, random_state=42)
clf = svm.SVC(kernel='linear') # Linear Kernel
clf.fit(x_train, y_train).astype(dtype=np.uint8)
y_pred = clf.predict(x_test)
from sklearn import metrics
print("Accuracy:",metrics.accuracy_score(y_test, y_pred)

这里的问题是您将CountVectorizer的输出转换为np.arrayCountVectorizer输出稀疏矩阵scipy.sparse.csr.csr_matrix这是存储此类数据的有效方法。

稀疏矩阵不会为每个文档提供形状(50000,0)np.array,几乎所有值都等于 0,很少等于 1,而是只引用不等于0的值。这将大大减少内存占用,如以下示例所示:

from scipy.sparse import csr_matrix
import numpy as np
import sys
X = np.zeros((100_000))
X[0] = 1
print(f'size (bytes) of np.array {sys.getsizeof(X)}')
X_sparse = csr_matrix(X)
print(f'size (bytes) of Sparse Matrix {sys.getsizeof(X_sparse)}')

输出:

size (bytes) of np.array 800104
size (bytes) of Sparse Matrix 48

因此,您应该使用以下方法修改预处理代码:

X = (vectorizer.fit_transform(df["Source"]).toarray())

除此之外,fit 函数应该简单地编写如下:

clf.fit(x_train, y_train)

相关内容

  • 没有找到相关文章

最新更新