这很奇怪。我可以成功运行示例grid_search_digits.py
。但是,我无法对自己的数据进行网格搜索。
我有以下设置:
import sklearn
from sklearn.svm import SVC
from sklearn.grid_search import GridSearchCV
from sklearn.cross_validation import LeaveOneOut
from sklearn.metrics import auc_score
# ... Build X and y ....
tuned_parameters = [{'kernel': ['rbf'], 'gamma': [1e-3, 1e-4],
'C': [1, 10, 100, 1000]},
{'kernel': ['linear'], 'C': [1, 10, 100, 1000]}]
loo = LeaveOneOut(len(y))
clf = GridSearchCV(SVC(C=1), tuned_parameters, score_func=auc_score)
clf.fit(X, y, cv=loo)
....
print clf.best_estimator_
....
但我永远不会过去clf.fit
(我让它跑了约1小时)。
我也试过
clf.fit(X, y, cv=10)
和
skf = StratifiedKFold(y,2)
clf.fit(X, y, cv=skf)
并遇到同样的问题(它永远不会完成clf.fit语句)。我的数据很简单:
> X.shape
(27,26)
> y.shape
27
> numpy.sum(y)
5
> y.dtype
dtype('int64')
>?y
Type: ndarray
String Form:[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1]
Length: 27
File: /home/jacob04/opt/python/numpy/numpy-1.7.1/lib/python2.7/site-
packages/numpy/__init__.py
Docstring: <no docstring>
Class Docstring:
ndarray(shape, dtype=float, buffer=None, offset=0,
strides=None, order=None)
> ?X
Type: ndarray
String Form:
[[ -3.61238468e+03 -3.61253920e+03 -3.61290196e+03 -3.61326679e+03
7.84590361e+02 0.0000 <...> 0000e+00 2.22389150e+00 2.53252959e+00
2.11606216e+00 -1.99613432e+05 -1.99564828e+05]]
Length: 27
File: /home/jacob04/opt/python/numpy/numpy-1.7.1/lib/python2.7/site-
packages/numpy/__init__.py
Docstring: <no docstring>
Class Docstring:
ndarray(shape, dtype=float, buffer=None, offset=0,
strides=None, order=None)
这是最新版本的scikit-learn(0.13.1)和:
$ pip freeze
Cython==0.19.1
PIL==1.1.7
PyXB==1.2.2
PyYAML==3.10
argparse==1.2.1
distribute==0.6.34
epc==0.0.5
ipython==0.13.2
jedi==0.6.0
matplotlib==1.3.x
nltk==2.0.4
nose==1.3.0
numexpr==2.1
numpy==1.7.1
pandas==0.11.0
pyparsing==1.5.7
python-dateutil==2.1
pytz==2013b
rpy2==2.3.1
scikit-learn==0.13.1
scipy==0.12.0
sexpdata==0.0.3
six==1.3.0
stemming==1.0.1
-e git+https://github.com/PyTables/PyTables.git@df7b20444b0737cf34686b5d88b4e674ec85575b#egg=tables-dev
tornado==3.0.1
wsgiref==0.1.2
奇怪的是,拟合单个SVM非常快:
> %timeit clf2 = svm.SVC(); clf2.fit(X,y)
1000 loops, best of 3: 328 us per loop
我注意到如果我使用以下方式预先缩放数据:
from sklearn import preprocessing
X = preprocessing.scale(X)
网格搜索非常快。
为什么呢?为什么GridSearchCV
对缩放非常敏感而常规svm.SVC().fit
不是?
答案 0 :(得分:7)
如前所述,
基于 SVM
的分类器(y == np.int*
)
预处理是必须的,否则ML-Estimator的预测能力会因偏斜特征对decission函数的影响而丢失。
反对处理时间:
[C,gamma]
风景
aGrid = aML_GS.GridSearchCV( aClassifierOBJECT, param_grid = aGrid_of_parameters, cv = cv, n_jobs = n_JobsOnMultiCpuCores, verbose = 5 )
有时候,即使在使用了上述所有提示之后,GridSearchCV()
确实可以占用大量的CPU时间/ CPU-poolOfRESOURCEs,。
所以,保持冷静,不要惊慌,如果你确定功能 - 工程,数据 - 理智&amp; FeatureDOMAIN预处理已正确完成。
[GridSearchCV] ................ C=16777216.0, gamma=0.5, score=0.761619 -62.7min
[GridSearchCV] C=16777216.0, gamma=0.5 .........................................
[GridSearchCV] ................ C=16777216.0, gamma=0.5, score=0.792793 -64.4min
[GridSearchCV] C=16777216.0, gamma=1.0 .........................................
[GridSearchCV] ............... C=16777216.0, gamma=1.0, score=0.793103 -116.4min
[GridSearchCV] C=16777216.0, gamma=1.0 .........................................
[GridSearchCV] ............... C=16777216.0, gamma=1.0, score=0.794603 -205.4min
[GridSearchCV] C=16777216.0, gamma=1.0 .........................................
[GridSearchCV] ............... C=16777216.0, gamma=1.0, score=0.771772 -200.9min
[GridSearchCV] C=16777216.0, gamma=2.0 .........................................
[GridSearchCV] ............... C=16777216.0, gamma=2.0, score=0.713643 -446.0min
[GridSearchCV] C=16777216.0, gamma=2.0 .........................................
[GridSearchCV] ............... C=16777216.0, gamma=2.0, score=0.743628 -184.6min
[GridSearchCV] C=16777216.0, gamma=2.0 .........................................
[GridSearchCV] ............... C=16777216.0, gamma=2.0, score=0.761261 -281.2min
[GridSearchCV] C=16777216.0, gamma=4.0 .........................................
[GridSearchCV] ............... C=16777216.0, gamma=4.0, score=0.670165 -138.7min
[GridSearchCV] C=16777216.0, gamma=4.0 .........................................
[GridSearchCV] ................ C=16777216.0, gamma=4.0, score=0.760120 -97.3min
[GridSearchCV] C=16777216.0, gamma=4.0 .........................................
[GridSearchCV] ................ C=16777216.0, gamma=4.0, score=0.732733 -66.3min
[GridSearchCV] C=16777216.0, gamma=8.0 .........................................
[GridSearchCV] ................ C=16777216.0, gamma=8.0, score=0.755622 -13.6min
[GridSearchCV] C=16777216.0, gamma=8.0 .........................................
[GridSearchCV] ................ C=16777216.0, gamma=8.0, score=0.772114 - 4.6min
[GridSearchCV] C=16777216.0, gamma=8.0 .........................................
[GridSearchCV] ................ C=16777216.0, gamma=8.0, score=0.717718 -14.7min
[GridSearchCV] C=16777216.0, gamma=16.0 ........................................
[GridSearchCV] ............... C=16777216.0, gamma=16.0, score=0.763118 - 1.3min
[GridSearchCV] C=16777216.0, gamma=16.0 ........................................
[GridSearchCV] ............... C=16777216.0, gamma=16.0, score=0.746627 - 25.4s
[GridSearchCV] C=16777216.0, gamma=16.0 ........................................
[GridSearchCV] ............... C=16777216.0, gamma=16.0, score=0.738739 - 44.9s
[Parallel(n_jobs=1)]: Done 2700 out of 2700 | elapsed: 5670.8min finished
如上所述,“...定期svm.SVC().fit
”
请注意,
它使用默认的[C,gamma]
值,因此与您的Model / ProblemDOMAIN的行为无关。
aScalerOBJECT
进行先验缩放(在aDataSET
进入.fit()
之前)&amp;一旦你需要重新扩展一个新的示例并将其发送到预测器以回答它的魔力,事后特别扩展
通过anSvmCLASSIFIER.predict( aScalerOBJECT.transform( aNewExampleX ) )
的请求
(是的,aNewExampleX
可能是一个矩阵,所以要求对几个答案进行“矢量化”处理)
与下面发布的猜测相反,问题 - “宽度”,测量为 N
==矩阵中的多个SVM特征X
是整个计算时间的责任,带有 rbf-kernel 的SVM分类器是一个 O(M^2.N^1)
问题。
因此,对观察总数(示例)存在二次依赖,进入训练(.fit()
)或CrossValidation阶段,人们很难说,监督学习分类器将获得更好的预测能力如果一个“减少”特征的(仅线性)“宽度”,本身承担输入到SVM分类器的构建预测能力中,不是吗?
答案 1 :(得分:3)
支持向量机sensitive to scaling。您的SVC很可能需要更长的时间来构建单个模型。 GridSearch基本上是一种强力方法,它使用不同的参数运行基本模型。因此,如果你的GridSearchCV需要时间来构建,那么很可能是由于
答案 2 :(得分:0)
如果您尚未使用GridSearchCV,我只想指出一件事:
在GridSearchCV中有一个名为n_jobs
的参数,该参数使用处理器的多个核,可以加快处理速度。例如:
GridSearchCV(clf, verbose=1, param_grid=tuned_parameters, n_jobs=-1)
指定-1将使用所有可用的CPU内核。如果您有四个具有超线程的核心,那么在不使用此参数的情况下,将增加8个并发工作器,而不是1个