当使用SelectPercentile(来自sklearn)和SVM作为ClassFi时,得分太高

2024-04-24 06:41:59 发布

您现在位置:Python中文网/ 问答频道 /正文

在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%


Tags: 数据功能gs特征sklearnall单词selector
1条回答
网友
1楼 · 发布于 2024-04-24 06:41:59

我认为您不应该使用所有数据(X_all)来执行特性选择(SelectPercentile)。通过这样做,您在交叉验证中为测试而保留的数据“泄漏”到您的模型中。因此,您的特征选择可以看到测试集中的数据,并告诉分类器与训练集和测试集中的标签相关的特征子集。在

您应该使用Pipeline将FS与分类器链接起来,并为模型评估执行交叉验证。在

但我认为,在文本分类问题上,使用单变量特征选择然后使用支持向量机的方法可能会比SVD-SVM管道更有效。查看this answer示例脚本。在

相关问题 更多 >