我正在使用 scikit-learn 进行元启发式练习,我有一个疑问:我需要使用 knn,所以我有一个 n_jobs=-1 的 KNearestNeighbors 对象。正如文档所说,我必须将多处理模式设置为 forkserver。但是 knn 在 n_jobs=-1 时比在 n_jobs=1 时慢得多。
这是一段代码
### Some initialization here ###
skf = StratifiedKFold(target, n_folds=2, shuffle=True)
for train_index, test_index in skf:
data_train, data_test = data[train_index], data[test_index]
target_train, target_test = target[train_index], target[test_index]
start = time()
selected_features, score = SFS(data_train, data_test, target_train, target_test, knn)
end = time()
logger.info("SFS - Time elapsed: " + str(end-start) + ". Score: " + str(score) + ". Selected features: " + str(sum(selected_features)))
if __name__ == "__main__":
import multiprocessing as mp; mp.set_start_method('forkserver', force = True)
main()
这是SFS函数
def SFS(data_train, data_test, target_train, target_test, classifier):
rowsize = len(data_train[0])
selected_features = np.zeros(rowsize, dtype=np.bool)
best_score = 0
best_feature = 0
while best_feature is not None:
end = True
best_feature = None
for idx in range(rowsize):
if selected_features[idx]:
continue
selected_features[idx] = True
classifier.fit(data_train[:,selected_features], target_train)
score = classifier.score(data_test[:,selected_features], target_test)
selected_features[idx] = False
if score > best_score:
best_score = score
best_feature = idx
if best_feature is not None:
selected_features[best_feature] = True
return selected_features, best_score
我不明白 n_jobs > 1 怎么会比 n_jobs = 1 慢。有人能给我解释一下吗?我试过 3 个数据集。
最佳答案
我发现很多像你一样的人都有同样的问题:n_jobs 在 sklearn 的 KNearestNeighbors 中不起作用。他们还提示只加载了 1 个 CPU 内核。
在我的实验中,无论 n_jobs>1 与否,拟合过程都只使用单核。所以不管你把n_jobs设置的很大,如果你的训练数据样本很大,训练的时间会很大,不会减少。
而 n_jobs>1 比 n_jobs=1 更慢的原因是因为为多处理分配资源的成本。
关于python - 为什么 scikit-learn neighbors 在 n_jobs > 1 和 forkserver 时变慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36250555/