调整MNIST数据集上SVM分类器超参数为何准确率无变化?
问题:MNIST数据集上SVM超参数调整无效,准确率固定
我是机器学习新手,正尝试调整SVM的超参数,以在MNIST手写数字数据集上达到95%及以上的准确率。所用CSV文件第一列为分类标签,包含784个属性,数据集未按标签排序。
以下是我编写的代码:
import numpy as np import os from sklearn.svm import SVC path = os.getcwd() traindata, testdata = np.loadtxt(path + "\username\data\mnist_train.csv", delimiter=",",max_rows=4000), np.loadtxt(path + "\username\data\mnist_test.csv", delimiter=",",max_rows=1000) np.random.seed(123) shuffletrain = np.random.permutation(4000) np.random.seed(123) shuffletest = np.random.permutation(1000) traindata, testdata = traindata[shuffletrain,:], testdata[shuffletest,:] y_train, y_test = traindata[:2000,0], testdata[:500,0] X_train, X_test = traindata[:2000,1:], testdata[:500,1:] Ctemp = 10000 gammatemp = 'auto' machine = SVC(C=Ctemp, kernel='rbf', gamma=gammatemp) machine.fit(X_train,y_train) testscore = machine.score(X_test,y_test) print(testscore)
但无论调整C(如1或10000)、gamma(如0.1或1000)等超参数,测试准确率始终固定为0.194;更换其他数据集时代码可正常生效,调整超参数会改变准确率。我已尝试打乱数据集,且更换数据子集时准确率会变化,因此排除数据集本身排序问题。请问我遗漏了什么?为何超参数不影响测试准确率?
解决方案
- 未做特征缩放:MNIST像素值范围是0-255,SVM(尤其是RBF核)对特征尺度极度敏感。未缩放时,大数值特征会主导核函数计算,模型无法有效学习,超参数调整完全失效。解决方法:将特征缩放到0-1区间或标准化:
或使用sklearn标准化工具:# 简单缩放至0-1 X_train = X_train / 255.0 X_test = X_test / 255.0from sklearn.preprocessing import StandardScaler scaler = StandardScaler() X_train = scaler.fit_transform(X_train) X_test = scaler.transform(X_test) - 训练样本量不足:仅用2000条训练数据,SVM无法学到足够的特征模式,超参数调整的效果被样本量限制掩盖。可以尝试使用全部4000条训练数据:
y_train, y_test = traindata[:,0], testdata[:500,0] X_train, X_test = traindata[:,1:], testdata[:500,1:] - gamma参数设置极端:尝试的0.1或1000远超出MNIST特征的合理范围。默认的
gamma='auto'对应1/n_features(约0.00127),这个区间更合适。过大的gamma会让模型过拟合到单个样本,过小的gamma会让模型过于平滑,两种情况都会导致超参数调整无法体现效果。
内容的提问来源于stack exchange,提问作者Elias Kowalski
相关产品推荐
相关产品推荐

