在Python中,我应用SelectPercentile(来自sklearn)以便只使用最相关的特征,并训练了一个SVM分类器。
我想说的是我只有一个语料库,所以我必须对这个语料库执行cross_validation
。
用SelectPercentile
选择功能后,当我使用cross_validation
时,我得到的分数太高,我认为我做错了什么,但我不知道是什么。我以为X峎all matrix有重复的行或重复的列,但它没有。
我不明白为什么我得到这个结果。有谁能让我明白在幕后发生了什么,我做错了什么?在
实施
#仅从数据集中提取单词
#使用Pandas创建数据帧
数据帧具有以下结构:
-数据:只包含没有停止词的单词
-性别:1或0
vectorizer = TfidfVectorizer(lowercase=False, min_df=1)
X_all = vectorizer.fit_transform(dataframe.data)
y_all = dataframe.gender
selector = SelectPercentile(f_classif, percentile=10)
selector.fit(X_all, y_all)
X_all = selector.transform(X_all)
classifier = svm.SVC()
param_grid = [
{'C': [1, 10, 100, 1000], 'kernel': ['linear']},
{'C': [1, 10, 100, 1000], 'gamma': [0.001, 0.0001], 'kernel': ['rbf']},
]
gs = GridSearchCV(classifier, param_grid, cv=5, n_jobs=4)
gs.fit(X_all.toarray(), y_all)
sorted(gs.grid_scores_, key=lambda x: x.mean_validation_score, reverse=True)
print gs.best_score_
print gs.best_params_
使用所有150个样本获得的分数:
无选择百分位:0.756(9704个功能)
百分位数=90:0.822(8733个特征)
百分位数=70:0.947(6792个特征)
百分位数=50:0.973(4852个特征)
百分位数=30:0.967(2911个特征)
百分位数=10:0.970(971个特征)
百分位数=3:0.910(292个特征)
百分位数=1:0.820(98个特征)
另一方面,我尝试了另一种方法,我将150个样本分成训练和测试,如下所示:
^{pr2}$使用这种方法,我得到一个警告:
“/usr/local/lib/python2.7/dist-packages/sklearn/feature_selection/univariate”_选择。py:113:UserWarning:功能[0 0 0…,0 0 0]是常量。用户警告)”
所有结果都是常数,不管百分位片是(10,30,50。。。99):44.3%
我认为您不应该使用所有数据(
X_all
)来执行特性选择(SelectPercentile
)。通过这样做,您在交叉验证中为测试而保留的数据“泄漏”到您的模型中。因此,您的特征选择可以看到测试集中的数据,并告诉分类器与训练集和测试集中的标签相关的特征子集。在您应该使用
Pipeline
将FS与分类器链接起来,并为模型评估执行交叉验证。在但我认为,在文本分类问题上,使用单变量特征选择然后使用支持向量机的方法可能会比SVD-SVM管道更有效。查看this answer示例脚本。在
相关问题 更多 >
编程相关推荐