我试图更好地了解我的特征向量的值如何影响结果。例如,假设我有以下向量,最终值是结果(例如,这是一个使用 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 受到任何特征尺度方差的严重影响,因此您需要一种预处理技术,以降低其可能性,而不是最流行的技术:
- 将每个特征维度线性重新缩放为 [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-learn工具在sklearn.preprocessing
模块中实时处理这个问题:MinMaxScaler
,StandardScaler
,Normalizer
。