自定义SVM多项式核与sklearn内置poly核准确率不匹配问题
自定义SVM多项式核与sklearn内置核结果差异问题解决
你的实现没有逻辑错误,二者结果差异是因为sklearn内置多项式核的默认参数和你的自定义核参数不匹配导致的,对齐参数后即可得到基本一致的结果。
参数不匹配的具体说明
sklearn内置多项式核的计算公式为:K(x, y) = (gamma * <x, y> + coef0) ** degree
你的自定义核固定了gamma=1、coef0=1、degree=4,但sklearn的SVC(kernel='poly')默认参数和你的实现不一致:
- 默认
gamma取值为scale,计算逻辑为1 / (特征维度 * 训练集特征方差),不是固定值1 - 默认
coef0取值为0,不是1 - 你调整阶数测试时没有同步修改自定义核里的幂次,也会导致结果偏差
对齐参数的修改方案
固定阶数测试(以4阶为例)
实例化内置核SVM时显式指定和自定义核一致的参数即可:
# 内置4阶多项式核,参数和自定义核对齐 clfpoly = svm.SVC(kernel='poly', degree=4, gamma=1, coef0=1) clfpoly.fit(X_train, y_train) zpoly = clfpoly.predict(X_test) print("内置4阶多项式核准确率:", accuracy_score(y_test, zpoly)*100,"%") # 自定义4阶多项式核 def poly_kernel_fn(X, Y): return (X.dot(Y.T) + 1)**4 clf = svm.SVC(kernel=poly_kernel_fn) clf.fit(X_train, y_train) z = clf.predict(X_test) print("自定义4阶多项式核准确率:", accuracy_score(y_test, z)*100,"%")
支持多阶数动态切换
如果需要测试3、4、5阶核,可通过闭包封装自定义核的参数:
def get_custom_poly_kernel(degree, gamma=1, coef0=1): def poly_kernel(X, Y): return (gamma * X.dot(Y.T) + coef0) ** degree return poly_kernel # 测试3阶核 clf_3 = svm.SVC(kernel=get_custom_poly_kernel(degree=3)) # 内置3阶核参数对齐 clf_3_builtin = svm.SVC(kernel='poly', degree=3, gamma=1, coef0=1)
其他注意事项
- 原代码中的打印信息存在笔误:内置4阶核的打印标注为"3D polynomial kernel",自定义多项式核的打印标注为"custom rbf kernel",修改后可避免结果误判
- 受浮点数计算精度的微小误差影响,对齐参数后二者准确率可能存在±0.1%左右的偏差,属于正常范围
内容的提问来源于stack exchange,提问作者Sebastian Soler
相关产品推荐
相关产品推荐

