1.模型加速
这个痛点是我最近在做参数优化的时候,使用
GridSearchCV()
来优化SVM模型的时候,居然跑了n多久时间还是没跑完,更绝绝子的是,后面跑了太久jupyter超时,断开链接,程序挂了(跑了一天没了,你说气不气)
后面复盘的时候,有可能是两方面原因,一个是内存占用过多,导致python进程被干掉了,一个是jupyter超时主动断开了
jupyter的问题还是要解决,这里先插个眼
先说模型加速的问题,下面参考文献区是我找的一些解决方案,其中有一个比较简单的方案就是说,使用BaggingClassifier来进行加速,见参考文献第一个。
import time
import numpy as np
from sklearn.ensemble import BaggingClassifier, RandomForestClassifier
from sklearn import datasets
from sklearn.multiclass import OneVsRestClassifier
from sklearn.svm import SVC
iris = datasets.load_iris()
X, y = iris.data, iris.target
X = np.repeat(X, 100, axis=0)
y = np.repeat(y, 100, axis=0)
start = time.time()
clf = OneVsRestClassifier(SVC(kernel='linear', probability=True, class_weight='balanced'))
clf.fit(X, y)
end = time.time()
print("Single SVC", end - start, clf.score(X,y))
proba = clf.predict_proba(X)
n_estimators = 10
start = time.time()
clf = OneVsRestClassifier(BaggingClassifier(SVC(kernel='linear', probability=True, class_weight='balanced'), max_samples=1.0 / n_estimators, n_estimators=n_estimators))
clf.fit(X, y)
end = time.time()
print ("Bagging SVC", end - start, clf.score(X,y))
proba = clf.predict_proba(X)
start = time.time()
clf = RandomForestClassifier(min_samples_leaf=20)
clf.fit(X, y)
end = time.time()
print ("Random Forest", end - start, clf.score(X,y))
proba = clf.predict_proba(X)
我这里贴一下代码的结果
Single SVC 51.605311155319214 0.9666666666666667
Bagging SVC 4.764530658721924 0.9733333333333334
Random Forest 0.3716573715209961 1.0
效果还是很立竿见影的
BaggingClassifier的一个操作是,
tips:我介绍一下,上述代码中出现的OneVsRestClassifier是什么含义
一对一(OvR)的多类/多标签策略
也称为“一对多”,此策略包括为每个类配备一个分类器。对于每个分类器,该分类将与所有其他分类进行拟合。除了其计算效率(仅n_classes 需要分类器)之外,这种方法的一个优点是其可解释性。由于每个类别仅由一个和一个分类器表示,因此可以通过检查其对应的分类器来获取有关该类别的知识。这是用于多类分类的最常用策略,并且是合理的默认选择。
参考文献:
Making SVM run faster in python
一对一(OvR)的多类/多标签策略