我得到了一个很大的输入向量。目前,它已经卡在运行calibrated_clf.fit(x_train, y_train)
几个小时了。我不知道该程序是死了还是什么。如何在calibrated_clf.fit(x_train, y_train)
函数调用中运行时打印出某种进度?
clf = ensemble.RandomForestClassifier(criterion = 'entropy', n_estimators = 350, max_features = 200,n_jobs=-1)
calibrated_clf = CalibratedClassifierCV(clf, method='isotonic')
print "Here 1"
calibrated_clf.fit(x_train, y_train)
print "Here 2"
x_train是大小为 (51733, 250( 的向量。我在打印输出上停留了几个小时的"Here 1"。
您可以简单地将详细设置为高于 0 的值。
从
from sklearn.externals import joblib
help(joblib.parallel)
详细:整数,可选 详细级别:如果非零,则进度消息为 印刷。高于 50,输出将发送到标准输出。 消息的频率随着详细级别而增加。 如果超过 10 次,则报告所有迭代。
RandomForestClassifier
使用joblib
库中的parallel
函数。
import numpy
from sklearn.datasets import make_blobs
from sklearn.ensemble import RandomForestClassifier
n = 1000
X, y = make_blobs(n_samples=n)
X_train, y_train = X[0:n // 2], y[0:n // 2]
X_valid, y_valid = X[n // 2:], y[n // 2:]
clf = RandomForestClassifier(n_estimators=350, verbose=100)
clf.fit(X_train, y_train)
输出
building tree 1 of 350 [Parallel(n_jobs=1)]: Done 1 out of 1 | elapsed: 0.0s remaining: 0.0s building tree 2 of 350 [Parallel(n_jobs=1)]: Done 2 out of 2 | elapsed: 0.0s remaining: 0.0s building tree 3 of 350 [Parallel(n_jobs=1)]: Done 3 out of 3 | elapsed: 0.0s remaining: 0.0s building tree 4 of 350 [Parallel(n_jobs=1)]: Done 4 out of 4 | elapsed: 0.0s remaining: 0.0s building tree 5 of 350 [...] building tree 100 of 350 building tree 101 of 350 building tree 102 of 350 building tree 103 of 350 building tree 104 of 350 [...] building tree 350 of 350 [Parallel(n_jobs=1)]: Done 350 out of 350 | elapsed: 1.6s finished
如果问题来自您使用的树的数量,这里有一个小技巧可以克服它:
您可以将参数warm_start
更改为 True
。执行以下操作:
# Start with 10 estimators
growing_rf = RandomForestClassifier(n_estimators=10, n_jobs=-1,
warm_start=True, random_state=42)
for i in range(35): # Let's suppose you want to add 340 more trees, to add up to 350
growing_rf.fit(X_train, y_train)
growing_rf.n_estimators += 10
最后,您可以使用包含350
棵树的随机森林来预测测试数据。
growing_rf.predict_proba(X_test)))
显然,这可以通过在 CallibratedClassifierCV 源代码中插入打印来完成,该源代码作为 sklearn 的一部分提供,但它需要非常熟悉算法和实现。
由于您不需要知道拟合的确切进度,因此解决方法是子类化 ndarray 并重载索引运算符 - 我假设您传入的x_train和y_train是 ndarray。因此,每次 CalibratedClassifierCV fit 方法循环访问并尝试访问数据时,它都会调用您的自定义代码。例如:
import numpy as np
class array_plus(np.ndarray):
def __getitem__(self, idx):
print("array_plus indexing operator called")
return np.ndarray.__getitem__(self, idx)
在将这些数据传递给 fit 方法之前,您可以将它们"转换"(正式地,Python 不支持"强制转换"(到您的新类中:
new_x_train = array_plus(x_train)
new_y_train = array_plus(y_train)
calibrated_clf.fit(new_x_train, new_y_train)
您甚至可以在子类中放置一个计数器,以大致了解您的位置。