作者:JasonBrownlee
原文链接:https://machinelearningmastery.com/how-to-fix-futurewarning-messages-in-scikit-learn/
翻译:阳光和鱼
在运行代码时,通过使用Future Warning信息报告scikit-learn库即将进行的更改。
初学者可能会对警告信息感到困惑,因为看起来代码有问题或者他们做错了什么。警告消息也不便于编写代码,因为它们可能掩盖错误和程序输出。
处理警告消息的方法有很多,包括忽略消息、禁止警告和修复代码。
在本教程中,您将发现scikit-learnAPI中的Future Warning信息,以及如何在您自己的机器学习项目中处理它们。
完成本教程后,您将知道:
- Futurewarning消息旨在通知您scikit-learnAPI中的参数的缺省值即将发生的更改;
- 可以忽略或消除Futurewarning消息,因为它们不会终止程序的继续执行;
- 了解Futurewarning消息的示例,以及如何解释消息和更改代码,以处理即将到来的更改。
了解如何使用pandas准备数据、使用scikit-learn优化和评估模型,以及在我的新书中的更多内容,包括16个逐步教程、3个项目和完整的python代码。
教程概述
本教程分为四个部分:
- Future Warnings问题
- 如何消除Future Warnings
- 如何修复Future Warnings
- 关于Future Warnings的建议
Future Warnings问题
Scikit-learn库是一个开源库,它为数据准备和机器学习算法提供了工具。这是一个广泛使用和不断更新的库。像许多积极维护的软件库一样,Scikit-learnAPI经常会随着时间的推移而改变。这可能是因为发现了更好的实践或者首选的使用模式发生了变化。
Scikit-learnAPI中提供的大多数函数都有一个或多个参数,可以自定义函数的行为。许多参数具有合理的缺省值,因此你不必为参数指定值。当你刚开始学习机器学习或者scikit-learn的时候,你不知道每个参数有什么影响,这一点尤其有帮助。
随着时间的推移,对scikit-learnAPI的更改通常表现为对函数参数的合理默认值的更改。此类型的更改通常不会立即执行,而是有计划地执行。
例如,如果您的代码是为scikit-learn库的前一个版本编写的,并且依赖于函数参数的默认值,而API的后续版本计划更改这个默认值,那么API将提醒您即将发生的更改。
这个警告在每次运行代码时以警告消息的形式出现。具体来说,“Future Warning”是在标准错误上报告的(例如在命令行上)。
这是API和项目的一个有用特性,为您的利益而设计。它允许你为库的下一个主要版本更改代码,以保留旧的行为(为参数指定一个值)或采用新的行为(不更改代码)。
运行时报告警告的Python脚本可能会令人沮丧。
- 对于初学者来说,可能会觉得代码没有正确工作,或者自己做错了什么;
- 对于专业人士来说,这是一个需要更新的程序的标志;
在任何一种情况下,警告消息都可能掩盖真正的错误消息或程序的输出。
如何消除Future Warnings
警告消息不是错误消息。
因此,程序报告的警告消息(如Future Warning)不会停止程序的执行。警告消息将被报告,而程序将继续执行。
因此(如果您愿意)可以在每次执行代码时忽略该警告。
还可以通过编程方式忽略警告消息。这可以通过在程序运行时禁止警告消息来实现。
这可以通过将Python警告系统显式配置为忽略特定类型的警告消息(例如忽略所有Future Warnings)来实现,或者更广泛地说,忽略所有警告(不建议)。
可以通过在你的将产生警告的代码周围添加以下代码块来实现:
# run block of code and catch warnings
with warnings.catch_warnings():
# ignore all caught warnings
warnings.filterwarnings("ignore")
# execute code that will generate warnings
...
或者,如果您有一个非常简单的平面脚本(没有函数或块),您可以通过在文件顶部添加两行来禁用所有Future Warnings:
# import warnings filter
from warnings import simplefilter
# ignore all future warnings
simplefilter(action='ignore', category=Future Warning)
要了解Python中消除警告的更多信息,请参见:
- Python Warning control API
如何修复Future Warnings
您也可以更改代码来处理所报告的对scikit-learnAPI的更改。
通常,警告消息本身会告诉您更改的性质,以及如何更改代码以处理警告。
尽管如此,让我们来看看最近一些关于未来警告的例子。
本节中的示例是用scikit-learn版本0.20.2开发的。你可以通过运行以下代码来检查你的scikit-learn版本:
# check scikit-learn version
import sklearn
print('sklearn: %s' % sklearn.__version__)
你会看到如下输出:
sklearn: 0.20.2
随着时间的推移,scikit-learn的新版本发布,报告的警告消息的性质将发生改变,并采用新的默认设置。
因此,尽管下面的示例是针对scikit-learn版本的,但是诊断和处理每个API性质变化的方法提供了处理未来变化的好示例。
逻辑回归的未来警告
Logisticregression算法最近对默认参数值进行了两次更改,这些更改导致了Future Warning信息。
第一个与求解系数有关,第二个与如何使用模型进行多类分类有关。让我们用代码示例来看一下每个例子。
对规划求解器(Solver)参数的更改
下面的示例将生成一个关于LogisticRegression使用的solver参数的Future Warning。
# example of LogisticRegression that generates a Future Warning
from sklearn.datasets import make_blobs
from sklearn.linear_model import LogisticRegression
# prepare dataset
X, y = make_blobs(n_samples=100, centers=2, n_features=2)
# create and configure model
model = LogisticRegression()
# fit model
model.fit(X, y)
运行该示例会产生以下警告消息:
Future Warning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.
这个问题涉及到从过去默认的‘solver’参数改为‘libllinear’,并且在未来的版本中将改为默认的‘lbfgs’。现在必须指定“solver”参数。
为了保持原来的行为,可以将参数指定如下:
# create and configure model
model = LogisticRegression(solver='liblinear')
为了支持新的行为(推荐),您可以将参数指定如下:
# create and configure model
model = LogisticRegression(solver='lbfgs')
对多类别(multi_class)参数的更改
下面的例子将生成一个关于LogisticRegression使用的“multiclass”参数的未来警告。
# example of LogisticRegression that generates a Future Warning
from sklearn.datasets import make_blobs
from sklearn.linear_model import LogisticRegression
# prepare dataset
X, y = make_blobs(n_samples=100, centers=3, n_features=2)
# create and configure model
model = LogisticRegression(solver='lbfgs')
# fit model
model.fit(X, y)
运行该示例会产生以下警告消息:
Future Warning: Default multi_class will be changed to 'auto' in 0.22. Specify the multi_class option to silence this warning.
这个警告信息仅仅影响了对多类分类问题使用Logit模型分类,而不是该方法设计的二进制分类问题。
多类参数的默认值从‘ovr’改为‘auto’。
为了保持原来的行为,可以将参数指定如下:
# create and configure model
model = LogisticRegression(solver='lbfgs', multi_class='ovr')
为了支持新的行为(推荐) ,您可以按照以下方式指定参数:
# create and configure model
model = LogisticRegression(solver='lbfgs', multi_class='auto')
支持向量机(SVM)的Future Warning
支持向量机最近对gamma参数进行了修改,导致了一个警告消息,特别是SVC和SVR classes。
下面的例子将生成一个关于SVC使用的‘gamma’参数的Future Warning,但同样适用于SVR。
# example of SVC that generates a Future Warning
from sklearn.datasets import make_blobs
from sklearn.svm import SVC
# prepare dataset
X, y = make_blobs(n_samples=100, centers=2, n_features=2)
# create and configure model
model = SVC()
# fit model
model.fit(X, y)
运行这个示例将生成以下警告消息:
Future Warning:Thedefaultvalueofgammawillchangefrom'auto'to'scale'inversion0.22toaccountbetterforunscaledfeatures.Setgammaexplicitlyto'auto'or'scale'toavoidthiswarning.
此警告信息报告说,“gamma”参数的默认值正在从“auto”的当前值改为新的默认值“scale”。
gamma参数只影响使用RBF、多项式或Sigmoid核的SVM模型。
该参数控制算法中使用的“gamma”系数的值,如果您没有指定一个值,则使用启发式算法指定该值。该警告是关于计算默认值的方式的改变。
为了保持原来的行为,可以将参数指定如下:
# create and configure model
model = SVC(gamma='auto')
为了支持新的行为(推荐),您可以将参数指定如下:
# create and configure model
model = SVC(gamma='scale')
决策树集成算法的未来预警
基于决策树的集成算法将改变集成中子模型或树的数量,这些子模型或树是由n估计量的论点控制的。
这影响了随机森林和 extra trees模型进行分类和回归,特别是分类:RandomForestClassifier, RandomForestRegressor, ExtraTreesClassifier, ExtraTreesRegressor, and RandomTreesEmbedding
下面的例子将生成一个关于随机森林分类器使用的‘n_estimators'参数的FutureWarning,但同样适用于随机森林回归分类器和额外的树类。
# example of RandomForestClassifier that generates a FutureWarning
from sklearn.datasets import make_blobs
from sklearn.ensemble import RandomForestClassifier
# prepare dataset
X, y = make_blobs(n_samples=100, centers=2, n_features=2)
# create and configure model
model = RandomForestClassifier()
# fit model
model.fit(X, y)
运行这个示例将生成以下警告消息:
FutureWarning: The default value of n_estimators will change from 10 in version 0.20 to 100 in 0.22.
这个警告信息报告说子模型的数量正在从10个增加到100个,可能是因为计算机变得越来越快,10个非常小,甚至100个也很小。
为了保持原来的行为,可以将参数指定如下:
#createandconfiguremodel
model=RandomForestClassifier(n_estimators=10)
为了支持新的行为(推荐),您可以将参数指定如下:
#createandconfiguremodel
model=RandomForestClassifier(n_estimators=100)
更多的Future Warnings问题
你是否在为Future Warnings而挣扎?请在下面的评论中告诉我,我会尽我所能帮助你。
Future Warnings建议
一般来说,我不建议忽略或消除警告消息。
忽略警告消息意味着该消息可能掩盖了真正的错误或程序输出,而API未来的更改可能会对您的程序产生负面影响,除非您已经考虑过这些问题。
对于研发工作来说,消除警告可能是一个快速解决方案,但是不应该在生产系统中使用。比简单地忽略消息更糟糕的是,消除警告还可能消除来自其他api的消息。
相反,我建议您修复软件中的警告消息。
应该如何更改代码?
一般来说,我建议几乎总是采用API的新行为,例如新的默认行为,除非您明确依赖函数的先前行为。
对于长期运行的操作或生产代码,显式指定所有函数参数而不使用默认值可能是一个好主意,因为它们在将来可能会发生更改。
我还建议您更新scikit-learn库,并跟踪每个新版本中对API的更改。
最简单的方法是查看每个版本的发行说明,可以在这里找到:
- scikit-learnReleaseHistory
进一步阅读
如果您希望深入了解,本节将提供更多关于这个主题的资源。
- Python Warning control API
- sklearn.linear_model.LogisticRegression API
- sklearn.svm.SVC API - sklearn.svm.SVR API
- scikit-learn Release History