【发布时间】:2018-05-17 02:52:51
【问题描述】:
我有 220 万个数据样本可以分为 7500 多个类别。我正在使用 pandas 和 sckit-learn of python 来做到这一点。
以下是我的数据集示例
itemid description category
11802974 SPRO VUH3C1 DIFFUSER VUH1 TRIPLE Space heaters Architectural Diffusers
10688548 ANTIQUE BRONZE FINISH PUSHBUTTON switch Door Bell Pushbuttons
9836436 Descente pour Cable tray fitting and accessories Tray Cable Drop Outs
以下是我遵循的步骤:
- 预处理
- 矢量表示
-
培训
dataset=pd.read_csv("trainset.csv",encoding = "ISO-8859-1",low_memory=False) dataset['description']=dataset['description'].str.replace('[^a-zA-Z]', ' ') dataset['description']=dataset['description'].str.replace('[\d]', ' ') dataset['description']=dataset['description'].str.lower() stop = stopwords.words('english') lemmatizer = WordNetLemmatizer() dataset['description']=dataset['description'].str.replace(r'\b(' + r'|'.join(stop) + r')\b\s*', ' ') dataset['description']=dataset['description'].str.replace('\s\s+',' ') dataset['description'] =dataset['description'].apply(word_tokenize) ADJ, ADJ_SAT, ADV, NOUN, VERB = 'a', 's', 'r', 'n', 'v' POS_LIST = [NOUN, VERB, ADJ, ADV] for tag in POS_LIST: dataset['description'] = dataset['description'].apply(lambda x: list(set([lemmatizer.lemmatize(item,tag) for item in x]))) dataset['description']=dataset['description'].apply(lambda x : " ".join(x)) countvec = CountVectorizer(min_df=0.0005) documenttermmatrix=countvec.fit_transform(dataset['description']) column=countvec.get_feature_names() y_train=dataset['category'] y_train=dataset['category'].tolist() del dataset del stop del tag
生成的文档术语矩阵将是 scipy csr 矩阵类型,具有 12k 个特征和 220 万个样本。
我尝试使用 xgboost 的 sckit learn 进行培训
model = XGBClassifier(silent=False,n_estimators=500,objective='multi:softmax',subsample=0.8)
model.fit(documenttermmatrix,y_train,verbose=True)
执行上述代码 2-3 分钟后出现错误
OSError: [WinError 541541187] Windows Error 0x20474343
我还尝试了 sckit learn 的朴素贝叶斯,但我得到了内存错误
问题
我使用了 Scipy 矩阵,它消耗的内存非常少,而且我在执行 xgboost 或 Naive bayes 之前删除了所有未使用的对象,我正在使用具有 128GB RAM 的系统,但在训练时仍然遇到内存问题.
我是 python 新手。我的代码有什么问题吗? 谁能告诉我如何有效地使用内存并继续前进?
【问题讨论】:
-
(1)朴素贝叶斯:检查
documenttermmatrix=countvec.fit_transform(dataset['description'])后面的类型。文档表明它很密集,而手动调用 transform 会很稀疏。这听起来很疯狂,就像一个糟糕的设计决策。检查! (2) XGBoost:我认为内部使用了密集向量(用于特征?)! -
documenttermmatrix.shape Out[26]: (2346724, 12520)type(documenttermmatrix) Out[28]: scipy.sparse.csr.csr_matrix
标签: python pandas scikit-learn large-data text-classification