使用 SVC 偏差的特征向量中的非常大(或非常小)的值是否可以产生?[scikit-learn]



我试图更好地了解我的特征向量的值如何影响结果。例如,假设我有以下向量,最终值是结果(例如,这是一个使用 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中是否有专门推荐的方法来规范化向量?

感谢您的帮助!

是的,这是你应该关注的事情。SVM 受到任何特征尺度方差的严重影响,因此您需要一种预处理技术,以降低其可能性,而不是最流行的技术:

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

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

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

那么这是给你的数学。让我们以线性核为例。它取一个样本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

而RBF核是xsv之间的距离的平方,乘以一个常数:

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模块中实时处理这个问题:MinMaxScalerStandardScalerNormalizer

相关内容

最新更新