3

我正在使用 scikit-learn 对文本进行情感分析。我现在的功能只是词频计数。

当我执行以下操作时,平均 F 值约为 59%:

from sklearn import svm
clf = svm.LinearSVC(class_weight='auto');
clf.fit(Xfeatures, YLabels);
......
predictedLabels = clf.predict(XTestFeatures);

但是当我使用 StandardScalar() 来缩放我的特征向量时,平均 F-measure 下降到 49%:

from sklearn import svm
clf = svm.LinearSVC(class_weight='auto');
Xfeatures = scaler.fit_transform(Xfeatures);
clf.fit(Xfeatures, YLabels);
......
XTestFeatures = scaler.transform(XTestFeatures);
predictedLabels = clf.predict(XTestFeatures);

缩放应该可以提高我的 SVM 的性能,但在这里,它似乎会降低性能。为什么会这样?我怎样才能使它正确?

4

2 回答 2

4

通过均值和方差进行缩放不是术语频率的好策略。假设您有两个包含三个术语的术语直方图(我们就称它们为0, 1, 2):

>>> X = array([[100, 10, 50], [1, 0, 2]], dtype=np.float64)

你缩放它们;然后你得到

>>> from sklearn.preprocessing import scale
>>> scale(X)
array([[ 1.,  1.,  1.],
       [-1., -1., -1.]])

缩放比例使得无法判断第 2X[1]项比第 0 项更频繁地出现。事实上,术语 1 没有出现的事实不再X[1]可区分的。

当然,这是一个非常极端的例子,但在更大的集合中也会出现类似的效果。你应该做的是标准化直方图:

>>> from sklearn.preprocessing import normalize
>>> normalize(X)
array([[ 0.89087081,  0.08908708,  0.4454354 ],
       [ 0.4472136 ,  0.        ,  0.89442719]])

这保留了您感兴趣的术语的相对频率;线性情感分类器关心的是比否定词更多的积极词,而不是实际频率或它的缩放变体。

(对于单个特征的比例实际上并不重要的领域,建议使用比例缩放通常是因为特征是以不同的单位测量的。)

于 2014-10-04T09:40:54.720 回答
2

至少有几件事情需要考虑:

  • 缩放数据降低准确性。不应该,但可以
  • 准确性是不平衡问题的错误度量,您使用“class_weight ='auto'”,所以这是您的情况。使用一些平衡的度量,例如平均准确度或 MCC。
  • 您似乎使用了线性 SVM 的默认超参数C=1,含义和;它可能会带来任何几乎随机的结果,您必须通过某种优化技术(至少是网格搜索)来拟合最佳超参数,以便比较两种不同的数据处理(例如您的缩放)
于 2014-10-02T23:49:05.327 回答