我想更好地了解我的特征向量的值如何影响结果。例如,假设我有以下向量,最终值为结果(例如,这是使用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中是否有可用的方法专门学习您建议将载体标准化?
感谢您的帮助!
答案 0 :(得分:1)
是的,这是应该关注的事情。 SVM受到任何特征尺度差异的严重影响,因此您需要一种预处理技术,以便从最受欢迎的方法中减少它的可能性:
sigma^(-1/2)*X
解除相关值,其中sigma = cov(X)
(数据协方差矩阵)每个都可以使用scikit-learn轻松执行(虽然为了实现第三个,你需要一个scipy用于矩阵平方根和反演)
答案 1 :(得分: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
并且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
。