python - 为什么 scikit-learn neighbors 在 n_jobs > 1 和 forkserver 时变慢

标签 python scikit-learn python-multiprocessing

我正在使用 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/

相关文章:

Python:如何检查 CSV 文件中的单元格是否为空?

python - python中3D曲线的保形分段三次插值

python - 如何在python中的sklearn中获取GridSearchCV中的选定特征

python-3.x - 如何将标量数组转换为二维数组?

python - 类型错误 : 'MapResult' object is not iterable using pathos. 多处理

python - 将工作日添加到日期时间列

Python 在函数内修改列表

python - 更改由 sklearn.model_selection.train_test_split 产生的数组中值的类型

python - python manager.dict() 锁定是如何工作的 :

python - 如何重复调用一个函数?