1

我试图更好地理解我的特征向量的值如何影响结果。例如,假设我有以下向量,其最终值为结果(例如,这是使用 SVC 的分类问题):

0.713, -0.076, -0.921, 0.498, 2.526, 0.573, -1.117, 1.682, -1.918, 0.251, 0.376, 0.025291666666667, -200, 9, 1

您会注意到大多数值都以 0 为中心,但是,有一个值小几个数量级,即 -200。

我担心这个值会扭曲预测并且被不公平地加权比其他值更重,仅仅是因为这个值有很大的不同。

这是创建特征向量时需要关注的问题吗?或者我使用的统计测试是否会根据我提供的训练集来评估这个大(或小)值的矢量控制?sci-kit learn 中是否有可用的方法专门用于规范化向量?

谢谢您的帮助!

4

2 回答 2

1

我试图更好地理解我的特征向量的值如何影响结果。

那么这是给你的数学。让我们以线性内核为例。它需要一个样本x和一个支持向量sv,并计算它们之间的点积。点积的朴素 Python 实现将是

def dot(x, sv):
    return sum(x_i * sv_i for x_i, sv_i in zip(x, sv))

现在,如果其中一个特征的范围比所有其他特征的范围更极端(在x或 中sv,或者更糟的是,两者都有),那么与该特征对应的项将支配总和。

多项式和 RBF 内核也会出现类似的情况。多核只是线性核的(移位的)幂:

def poly_kernel(x, sv, d, gamma):
    return (dot(x, sv) + gamma) ** d

xRBF 核是和之间距离的平方sv,乘以一个常数:

def rbf_kernel(x, sv, gamma):
    diff = [x_i - sv_i for x_i, sv_i in zip(x, sv)]
    return gamma * dot(diff, diff)

在每种情况下,如果一个特征具有极端范围,它将主导结果,而其他特征将被有效地忽略,除非打破平局。

scikit-learn 工具在sklearn.preprocessing模块中处理这个问题:MinMaxScaler, StandardScaler, Normalizer.

于 2013-10-05T10:19:42.840 回答
1

是的,这是你应该关心的事情。SVM 受到任何特征尺度变化的严重影响,因此您需要一种预处理技术,以使其不太可能,从最流行的技术中:

  1. 将每个特征维度线性重新缩放到 [0,1] 或 [-1,1] 区间
  2. 对每个特征维度进行归一化,使其均值 = 0,方差 = 1
  3. 通过变换来对值进行sigma^(-1/2)*X去相关sigma = cov(X)(数据协方差矩阵)

每个都可以使用 scikit-learn 轻松执行(尽管为了实现第三个,您需要一个用于矩阵平方根和求逆的 scipy)

于 2013-10-04T19:49:21.643 回答