我正在尝试构建一个模型,结合来自数据框的数值特征和文本特征。然而,我在成功地组合这些特征、使用这些特征进行训练,然后测试这些特征时遇到了很多麻烦。
目前,我正在尝试使用DataFrameMapper如下所示:
from sklearn.feature_extraction.text import TfidfTransformerfrom sklearn_pandas import DataFrameMappermapper = DataFrameMapper([ ('body', TfidfVectorizer()), ('numeric_feature', None), ]) for train_index, test_index in kFold.split(DF['body']): # 使用Kfold分割数据集 X_train = even_rand[['body','numeric_feature']].iloc[train_index] y_train = even_rand['sub_class'].iloc[train_index] X_test = even_rand[['body','numeric_feature']].iloc[test_index] y_test = even_rand['sub_class'].iloc[test_index] # 向量化/转换文档 X_train = mapper.fit_transform(X_train) X_test = mapper.fit_transform(X_test) # 获取SVM svm = SGDClassifier(loss='hinge', penalty='l2', alpha=1e-3, n_iter=5, random_state=10) svm.fit(X_train, y_train) svm_score = svm.score(X_test, y_test)
这种方法成功地结合了数据并对数据进行了训练,但是当我尝试测试数据时,特征似乎无法正确匹配,我得到了以下错误:
ValueError: X has 49974 features per sample; expecting 87786
有谁知道如何解决这个问题,或者知道更好的方法来结合/训练/测试数值和文本特征?我也希望尽可能保持特征为稀疏矩阵。
回答:
而不是:
X_train = mapper.fit_transform(X_train)X_test = mapper.fit_transform(X_test)
尝试:
X_train = mapper.fit_transform(X_train)X_test = mapper.transform(X_test) # 将fit_transform改为transform