如何修复scikit-learn中的Future Warning

本文介绍如何理解和处理scikit-learn库在代码中产生的FutureWarning信息,包括忽略警告、禁止显示警告以及修正代码以适应API变更,提供实例如逻辑回归、支持向量机等算法参数调整。
部署运行你感兴趣的模型镜像

作者:JasonBrownlee
发表于:2019年2月21日

原文链接: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中消除警告的更多信息,请参见:

如何修复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参数进行了修改,导致了一个警告消息,特别是SVCSVR 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的更改。

最简单的方法是查看每个版本的发行说明,可以在这里找到:

进一步阅读

如果您希望深入了解,本节将提供更多关于这个主题的资源。

您可能感兴趣的与本文相关的镜像

Stable-Diffusion-3.5

Stable-Diffusion-3.5

图片生成
Stable-Diffusion

Stable Diffusion 3.5 (SD 3.5) 是由 Stability AI 推出的新一代文本到图像生成模型,相比 3.0 版本,它提升了图像质量、运行速度和硬件效率

评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值