Vector 使用SVC偏差结果,特征向量中的值是否可以非常大(或非常小)?[scikit学习]

Vector 使用SVC偏差结果,特征向量中的值是否可以非常大(或非常小)?[scikit学习],vector,machine-learning,scikit-learn,svc,supervised-learning,Vector,Machine Learning,Scikit Learn,Svc,Supervised Learning,我试图更好地理解我的特征向量的值如何影响结果。例如,假设我有一个最终值为结果的向量(例如,这是一个使用SVC的分类问题): 您会注意到,大多数值都以0为中心,但是,有一个值的数量级更小,-200 我担心这个值会扭曲预测,并且会被不公平地加重权重,这仅仅是因为这个值差异太大 这是创建特征向量时需要考虑的问题吗?或者,我使用的统计测试会基于我提供的训练集来评估向量控制的这个大(或小)值吗?sci kit learn中是否有您特别推荐的标准化载体的方法 谢谢你的帮助 是的,这是你应该关心的事情。SVM

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

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

我担心这个值会扭曲预测,并且会被不公平地加重权重,这仅仅是因为这个值差异太大

这是创建特征向量时需要考虑的问题吗?或者,我使用的统计测试会基于我提供的训练集来评估向量控制的这个大(或小)值吗?sci kit learn中是否有您特别推荐的标准化载体的方法


谢谢你的帮助

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

  • 按[0,1]或[-1,1]间隔线性重缩放每个特征尺寸
  • 规范化每个特征尺寸,使其平均值为0,方差为1
  • 通过变换来解相关值
    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核是
    x
    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在模块中学习处理此问题的工具:
    MinMaxScaler
    StandardScaler
    Normalizer
    您好,感谢您的回复。我真的很感谢你的意见。我尝试了以下方法:我使用scikit上的方法学习“规范化”我的训练集和测试特征向量:。当我做一些测试时,我发现我的未规范化的特征向量比规范化的特征向量性能更好。你认为这反映了我发现的结果是什么?如果一切都做得正确(你应该仔细检查,因为最可能的原因是一个bug),这意味着,你的不均衡实际上帮助分类器做出正确的决策——因此,由于缺乏规范化而引入的这种偏差正在以“正确的方式”移动决策边界。简言之,标准化不会执行,因为它将保证更好的结果。之所以执行此操作,是因为我们假设我们事先不知道哪些特征更好,哪些更好worse@T.S.:这一特性可能是正确类别的有力预测器,而其余的只是噪声。特征选择可能有助于剔除无用的特征。
    
    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)