交叉验证和文本分类
cross validation and text categorization
我在 here 中也有同样的问题:
我有一个关于在 sklearn
的文本分类中使用交叉验证的问题。在交叉验证之前对所有数据进行矢量化是有问题的,因为分类器会在测试数据中出现 "seen" 个词汇。 Weka
已经过滤分类器来解决这个问题。此函数的 sklearn
等价物是什么?我的意思是对于每一折,特征集都会不同,因为训练数据不同。
但是,因为我在分类步骤和分类步骤之间对数据进行了大量处理,所以我不能使用管道......并且我试图通过我自己的交叉验证作为整个过程......关于这方面的任何指导,因为我对 python 和 sickitlearn
都很陌生
我可能不明白你问题的意思,而且我不熟悉 Weka,但你可以将词汇表作为字典传递到你在 sklearn 中使用的向量化器中。下面是一个示例,它将跳过测试集中的单词 'second',仅使用训练集中的特征。
from sklearn.feature_extraction.text import CountVectorizer
train_vectorizer = CountVectorizer()
train = [
'this is the first',
'set of documents'
]
train_matrix = train_vectorizer.fit_transform(train)
train_vocab = train_vectorizer.vocabulary_
test = [
'this is the second',
'set of documents'
]
test_vectorizer = CountVectorizer(vocabulary=train_vocab)
test_matrix = test_vectorizer.fit_transform(test)
print(train_vocab)
print(train_matrix.toarray())
print('\n')
print(test_vectorizer.vocabulary_)
print(test_matrix.toarray())
另请注意,您可以在矢量化器中使用自己的处理 and/or 标记化过程,例如:
def preprocessor(string):
#do logic here
def tokenizer(string):
# do logic here
from sklearn.cross_validation import cross_val_score
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.pipeline import Pipeline
from sklearn.svm import LinearSVC
clf = Pipeline([('vect', TfidfVectorizer(processor=preprocessor, tokenizer=tokenizer)), ('svm', LinearSVC())])
我认为使用交叉验证迭代器作为外循环是一个好主意,也是一个起点,可以使您的步骤清晰易读:
from sklearn.cross_validation import KFold
X = np.array(["Science today", "Data science", "Titanic", "Batman"]) #raw text
y = np.array([1, 1, 2, 2]) #categories e.g., Science, Movies
kf = KFold(y.shape[0], n_folds=2)
for train_index, test_index in kf:
x_train, y_train = X[train_index], y[train_index]
x_test, y_test = X[test_index], y[test_index]
#Now continue with your pre-processing steps..
我在 here 中也有同样的问题:
我有一个关于在 sklearn
的文本分类中使用交叉验证的问题。在交叉验证之前对所有数据进行矢量化是有问题的,因为分类器会在测试数据中出现 "seen" 个词汇。 Weka
已经过滤分类器来解决这个问题。此函数的 sklearn
等价物是什么?我的意思是对于每一折,特征集都会不同,因为训练数据不同。
但是,因为我在分类步骤和分类步骤之间对数据进行了大量处理,所以我不能使用管道......并且我试图通过我自己的交叉验证作为整个过程......关于这方面的任何指导,因为我对 python 和 sickitlearn
都很陌生我可能不明白你问题的意思,而且我不熟悉 Weka,但你可以将词汇表作为字典传递到你在 sklearn 中使用的向量化器中。下面是一个示例,它将跳过测试集中的单词 'second',仅使用训练集中的特征。
from sklearn.feature_extraction.text import CountVectorizer
train_vectorizer = CountVectorizer()
train = [
'this is the first',
'set of documents'
]
train_matrix = train_vectorizer.fit_transform(train)
train_vocab = train_vectorizer.vocabulary_
test = [
'this is the second',
'set of documents'
]
test_vectorizer = CountVectorizer(vocabulary=train_vocab)
test_matrix = test_vectorizer.fit_transform(test)
print(train_vocab)
print(train_matrix.toarray())
print('\n')
print(test_vectorizer.vocabulary_)
print(test_matrix.toarray())
另请注意,您可以在矢量化器中使用自己的处理 and/or 标记化过程,例如:
def preprocessor(string):
#do logic here
def tokenizer(string):
# do logic here
from sklearn.cross_validation import cross_val_score
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.pipeline import Pipeline
from sklearn.svm import LinearSVC
clf = Pipeline([('vect', TfidfVectorizer(processor=preprocessor, tokenizer=tokenizer)), ('svm', LinearSVC())])
我认为使用交叉验证迭代器作为外循环是一个好主意,也是一个起点,可以使您的步骤清晰易读:
from sklearn.cross_validation import KFold
X = np.array(["Science today", "Data science", "Titanic", "Batman"]) #raw text
y = np.array([1, 1, 2, 2]) #categories e.g., Science, Movies
kf = KFold(y.shape[0], n_folds=2)
for train_index, test_index in kf:
x_train, y_train = X[train_index], y[train_index]
x_test, y_test = X[test_index], y[test_index]
#Now continue with your pre-processing steps..