我有两组模式,其中有一块区域的均值在两组模式之间差异显著(通过t检验给出,数值为t值)。这里,第一组的均值为1±0.1,第二组的均值为2±0.1,因此均值差异约为1。
我试图在网格上运行“探照灯”分类器,以通过模式分类而不是对每个像素进行t检验来识别这块区域。探照灯在网格上移动,对每个3×3像素的方块中的值训练和测试一个独特的分类器(LinearSVC)。因此,会有一些“溢出”,这是正常且可以预期的。
然而,当我将均值增加到5±0.1和6±0.1时,即使均值差异仍然约为1,探照灯分类器的表现非常差。
1) 为什么这个分类器有时无法利用均值差异进行区分?
2) 为什么当均值较小时,均值差异为1时这个方法有效,但当均值稍高时却失效?
回答:
这个问题似乎是由于LibLinear
的实现细节引起的:sklearn的估计器LogisticRegression
、LinearSVC
和LinearSVR
都基于这个库,并且似乎都具有相同的“特征”:
惩罚1 / C
不仅应用于估计的权重向量,还应用于截距。这意味着远离原点的数据可能难以分类,即使点云是完全可分的:截距没有设置在正确的位置,并且倾向于被拉向零。在你的特定情况下,如果截距被拉到低于较低激活值的位置,那么分类将停止工作。
有几种解决方法,各有优缺点:
1) 为LinearSVC
选择一个非常低的惩罚,例如LinearSVC(C=1000)
(或更高的C
)
2) 使用SVC(kernel="linear")
,并陷入典型的核方法问题,即高样本复杂度(即这至少是样本数量的二次方,可能是三次方)
3) 在使用估计器之前对数据进行中心化处理,例如使用sklearn.preprocessing.StandardScaler