这是我使用非线性SVM进行数字分类的代码。我应用了一个交叉验证方案来选择超参数c
和gamma
。但是,GridSearch返回的模型没有n_support_
属性来获取支持向量的数量。
from sklearn import datasetsfrom sklearn.cross_validation import train_test_splitfrom sklearn.grid_search import GridSearchCVfrom sklearn.metrics import classification_reportfrom sklearn.svm import SVCfrom sklearn.cross_validation import ShuffleSplit# 加载Digits数据集digits = datasets.load_digits()# 为了在这个数据上应用分类器,我们需要将图像展平,# 把数据转换成(样本,特征)矩阵:n_samples = len(digits.images)X = digits.images.reshape((n_samples, -1))y = digits.target# 将数据集分成两等份X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=0.5, random_state=0)# 初始化一个SVM估计器estimator=SVC(kernel='rbf',C=1,gamma=1)# 选择交叉验证迭代器。cv = ShuffleSplit(X_train.shape[0], n_iter=5, test_size=0.2, random_state=0)# 通过交叉验证设置参数tuned_parameters = [{'kernel': ['rbf'], 'gamma': [1e-3, 1e-4,1,2,10], 'C': [1, 10, 50, 100, 1000]}, {'kernel': ['linear'], 'C': [1, 10, 100, 1000]}]clf=GridSearchCV(estimator=estimator, cv=cv, param_grid=tuned_parameters)# 开始交叉验证任务以获取具有最佳参数的最佳模型。# 完成此任务后,我们得到一个clf作为具有最佳参数C和gamma的最佳模型。clf.fit(X_train,y_train)print()print ("最佳参数: ")print(clf.get_params)print("clf1在测试集上的错误率",clf.score(X_test,y_test))print("clf1在训练集上的错误率",clf.score(X_train,y_train))# 这不起作用。那么,我如何恢复支持向量的数量呢?print ("按类别划分的支持向量数量", clf.n_support_);**## 这是我的方法。我用最佳参数训练一个新的SVM对象,并注意到它与clf在测试和训练集上的错误率相同**clf2=SVC(C=10,gamma= 0.001);clf2.fit(X_train,y_train)print("clf2在测试集上的错误率 ",clf2.score(X_test,y_test))print("clf1在训练集上的错误率",clf.score(X_train,y_train))print clf2.n_support_
如果我的提议方法正确,请评论一下?
回答:
GridSearchCV
会拟合多个模型。你可以通过clf.best_estimator_
获得最佳模型,因此要找到训练集中支持向量的索引,你可以使用clf.best_estimator_.n_support_
,当然,len(clf.best_estimator_.n_support_)
会给你支持向量的数量。
你还可以通过clf.best_params_
和clf.best_score_
分别获取最佳模型的参数和分数。