1

我正在使用支持向量机,特别是带有 rbf 内核的 scikit learn 的 svm.SVC 来对 28,000 个图像进行分类。

这些图像是从 0 到 9 的手写数字,我的任务是分类每个图像是什么数字。每个图像都表示为 28 X 28 像素矩阵,因此我的数据集实际上是 28,000 X 28 X 28 的 3-D 矩阵。所以我将 28 X 28 矩阵展平为 784 个元素的列表,这使我的数据矩阵现在 28,000 X 784。

我的策略是首先找到 C 和 gamma 的最佳参数。所以我使用网格搜索,C 在(10^0 到 10^4)范围内,gamma 在(10^-3 到 10^3)范围内。然后我使用 10 折的 k 折,并在所有 10 折上使用 C 和 gamma 的每种可能组合对 svc 进行拟合和评分。

这是我的代码:

 import numpy as np
 import pandas as pd
 from sklearn import svm, cross_validation, grid_search
 import time

 digits = pd.read_csv("/home/ubuntu/Kaggle/Data/train_digits.csv")
 number_labels = digits['label'].values
 digits_pixels = digits.ix[:,'pixel0':]
 data = digits_pixels.values

 Classifier = svm.SVC()
 c_range = np.logspace(0,4,10)
 gamma_range = np.logspace(-3,3,10)
 K_folds = cross_validation.KFold(len(data),n_folds = 10)
 start_time = time.time()
 if __name__ == '__main__':
     Classifier_2 = grid_search.GridSearchCV(estimator = Classifier, param_grid = dict(C = c_range, gamma = gamma_range), n_jobs = -1)
     scores =  [Classifier_2.fit(data[train],number_labels[train]).score(data[test],number_labels[test]) for train,test in K_folds]
 print "the program took",time.time() - start_time,"to run"
 print "mean score:" , np.mean(scores)
 print ("best C: %1.2f best gamma: %1.3f" %  (Classifier_2.best_estimator_.C,Classifier_2.best_estimator_.gamma))

问题是这段代码需要一个多小时来运行所有的拟合和评分,即使我正在使用带有 40 个核心的 gridsearch 的多处理。有什么方法可以优化评分和拟合?或者代码中是否有一个巨大的错误会减慢进程?我知道当我评分时,我使用的是 svm.svc 的默认评分方法,我认为这只是平均准确度。

4

0 回答 0