从命令行运行脚本时忽略 sklearn Gridsearch 中 n_jobs = -1 的警告不使用 warnings.simplefilter('ignore')

Posted

技术标签:

【中文标题】从命令行运行脚本时忽略 sklearn Gridsearch 中 n_jobs = -1 的警告不使用 warnings.simplefilter(\'ignore\')【英文标题】:Ignoring warnings in sklearn Gridsearch with n_jobs = -1 when running the script from command line not working with warnings.simplefilter('ignore')从命令行运行脚本时忽略 sklearn Gridsearch 中 n_jobs = -1 的警告不使用 warnings.simplefilter('ignore') 【发布时间】:2020-03-10 15:20:51 【问题描述】:

当参数 n_jobs 设置为 -1 时,如何从命令行使用 sklearn 的 GridsearchCV() 运行脚本而不打印所有警告?使用 warnings.simplefilter('ignore') 它不起作用。

当 n_jobs = 1 时,它工作正常并且不打印任何警告

当我从 spyder 运行脚本时,即使 n_jobs = -1 它也能正常工作

我尝试了这里描述的多种方法Eliminating warnings from scikit-learn,但是当从命令行和 Gridsearch 运行脚本时,它们都不起作用 n_jobs = -1

我还尝试将 with 语句放在 if __name__ == '__main__' 之后忽略警告

声明,但这也不起作用

我有 scikit-learn 0.21.3。

这是一个可重复的小示例,它多次打印来自 IsolationForest 的 FutureWarning 和 DepreciationWarning。

from sklearn import datasets
from sklearn.cluster import KMeans
from sklearn.pipeline import Pipeline
from sklearn.model_selection import GridSearchCV
from sklearn.preprocessing import StandardScaler, MinMaxScaler
from sklearn.ensemble import IsolationForest
import warnings
import numpy as np
from sklearn.base import BaseEstimator, TransformerMixin

class OutlierRemover(BaseEstimator, TransformerMixin):
    def __init__(self, contamination = 0.1):
        self.contamination = contamination
    def fit(self, x, y = None):          
        return self
    def transform(self, x, y = None):
        predicted_values = IsolationForest(n_jobs = -1, contamination = self.contamination).fit_predict(x)
        x = x[np.where(predicted_values == 1)] 
        return x
    
def pipe():
    iris = datasets.load_iris()
    x = iris.data

    pipe = Pipeline([('scalers', MinMaxScaler()),
                     ('outlierRemovers', OutlierRemover()),
                     ('cluster', KMeans(n_jobs = -1))])
    
    params = ['scalers':[MinMaxScaler(), StandardScaler()]]
    gridsearch = GridSearchCV(pipe, params, verbose = 100, cv = 2, n_jobs = -1)

    with warnings.catch_warnings():
        warnings.simplefilter('ignore')
        gridsearch.fit(x)
        
if __name__ == '__main__':
    pipe()

【问题讨论】:

您要抑制哪种类型的警告? 【参考方案1】:

对于您需要的并行后端警告(来自终端):

export PYTHONWARNINGS="ignore"

接下来,使用 python 运行您的脚本。

对于DeprecationWarning,你不能,这实际上是一个错误。随时在 github 上提出请求。

【讨论】:

以上是关于从命令行运行脚本时忽略 sklearn Gridsearch 中 n_jobs = -1 的警告不使用 warnings.simplefilter('ignore')的主要内容,如果未能解决你的问题,请参考以下文章

当它从命令行 bash 工作时,无法从 crontab 运行 bash 脚本

从 bash 脚本对文件中的 wget 命令运行 exec 会忽略 wget 选项

该脚本从命令行运行,但 crontab 失败

作为命令行工具运行时,如何让 NSURLSession 处理 completionHandler

命令行运行PHP文件时如何传递参数?

从命令行运行 `node index.js` 可以,但是当我在 package.json 中使用启动脚本时,我得到一个 EADDRINUSE /usr/bin/local/node 错误