当代码运行时,scikit-learn 机器学习库即将进行的更改会通过 **FutureWarning** 消息进行报告。
对于初学者来说,警告消息可能会令人困惑,因为它看起来代码存在问题或者他们做错了什么。警告消息对操作代码也不利,因为它们可能会掩盖错误和程序输出。
处理警告消息的方法有很多,包括忽略消息、抑制警告和修复代码。
在本教程中,您将了解 scikit-learn API 中的 FutureWarning 消息以及如何在您自己的机器学习项目中处理它们。
完成本教程后,您将了解:
- FutureWarning 消息旨在通知您 scikit-learn API 中参数默认值的即将更改。
- FutureWarning 消息可以被忽略或抑制,因为它们不会阻止程序的执行。
- FutureWarning 消息的示例以及如何解释消息并更改代码以应对即将到来的更改。
使用我的新书 **《Python 机器学习精通》** 启动您的项目,其中包含**分步教程**和所有示例的 **Python 源代码**文件。
让我们开始吧。

如何修复 scikit-learn 中的 FutureWarning 消息
图片由 a.dombrowski 拍摄,保留部分权利。
教程概述
本教程分为四个部分;它们是
- FutureWarning 的问题
- 如何抑制 FutureWarning
- 如何修复 FutureWarning
- FutureWarning 建议
FutureWarning 的问题
scikit-learn 库是一个开源库,提供数据准备和机器学习算法工具。
它是一个广泛使用且不断更新的库。
像许多积极维护的软件库一样,API 经常随着时间而改变。这可能是因为发现了更好的实践或首选的使用模式发生了变化。
scikit-learn API 中可用的大多数函数都有一个或多个参数,允许您自定义函数的行为。许多参数都有合理的默认值,这样您就不必为参数指定值。当您刚开始学习机器学习或 scikit-learn 并且不知道每个参数的影响时,这尤其有用。
scikit-learn API 随着时间的推移而改变通常以函数参数的合理默认值的改变形式出现。这类改变通常不会立即执行;相反,它们是经过计划的。
例如,如果您的代码是为 scikit-learn 库的先前版本编写的,并且依赖于函数参数的默认值,而 API 的后续版本计划更改此默认值,则 API 将提醒您即将进行的更改。
此警报以警告消息的形式出现,每次运行代码时都会显示。具体来说,**“FutureWarning”** 会在标准错误(例如在命令行上)报告。
这是 API 和项目的一项有用功能,旨在为您提供便利。它允许您更改代码,为库的下一个主要版本做好准备,以保留旧行为(为参数指定值)或采用新行为(无需更改代码)。
一个在运行时报告警告的 Python 脚本可能会令人沮丧。
- **对于初学者**,它可能会感觉代码运行不正确,或者你可能做错了什么。
- **对于专业人士**,这是程序需要更新的标志。
在任何一种情况下,警告消息都可能掩盖真实的错误消息或程序的输出。
如何抑制 FutureWarning
警告消息不是错误消息。
因此,您的程序报告的警告消息(例如 **FutureWarning**)不会停止程序的执行。警告消息将报告,程序将继续执行。
因此,如果您愿意,可以在每次执行代码时忽略警告。
也可以通过编程方式忽略警告消息。这可以通过在程序运行时抑制警告消息来完成。
这可以通过明确配置 Python 警告系统来忽略特定类型的警告消息,例如忽略所有 FutureWarnings,或者更一般地,忽略所有警告来完成。
这可以通过在您知道会产生警告的代码块周围添加以下块来实现
1 2 3 4 5 6 |
# 运行代码块并捕获警告 with warnings.catch_warnings(): # 忽略所有捕获的警告 warnings.filterwarnings("ignore") # 执行将产生警告的代码 ... |
或者,如果您有一个非常简单的平面脚本(没有函数或块),您可以通过在文件顶部添加两行来抑制所有 FutureWarnings
1 2 3 4 |
# 导入警告过滤器 from warnings import simplefilter # 忽略所有未来的警告 simplefilter(action='ignore', category=FutureWarning) |
要了解有关在 Python 中抑制的更多信息,请参阅
如何修复 FutureWarning
或者,您可以更改代码以解决 scikit-learn API 中报告的更改。
通常,警告消息本身会指示更改的性质以及如何更改代码以解决警告。
不过,让我们看一些您可能会遇到并正在努力解决的最近的 FutureWarning 示例。
本节中的示例是使用 scikit-learn 版本 0.20.2 开发的。您可以通过运行以下代码来检查您的 scikit-learn 版本
1 2 3 |
# 检查 scikit-learn 版本 import sklearn print('sklearn: %s' % sklearn.__version__) |
您将看到如下输出
1 |
sklearn: 0.20.2 |
随着 scikit-learn 新版本的发布,警告消息的性质将发生变化,并会采用新的默认值。
因此,尽管以下示例特定于 scikit-learn 的某个版本,但诊断和解决每个 API 更改性质的方法为处理未来的更改提供了很好的示例。
LogisticRegression 的 FutureWarning
LogisticRegression 算法最近对默认参数值进行了两次更改,导致出现 FutureWarning 消息。
第一个与查找系数的求解器有关,第二个与模型如何用于进行多类别分类有关。让我们用代码示例来看看每一个。
求解器的更改
以下示例将生成关于 LogisticRegression 使用的求解器参数的 FutureWarning。
1 2 3 4 5 6 7 8 9 |
# 生成 FutureWarning 的 LogisticRegression 示例 from sklearn.datasets import make_blobs 从 sklearn.线性模型 导入 LogisticRegression # 准备数据集 X, y = make_blobs(n_samples=100, centers=2, n_features=2) # 创建和配置模型 model = LogisticRegression() # 拟合模型 model.fit(X, y) |
运行该示例会产生以下警告消息
1 |
FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning. |
此问题涉及“**求解器**”参数的更改,该参数以前默认为“**liblinear**”,并将在未来版本中更改为默认为“**lbfgs**”。您现在必须指定“**求解器**”参数。
要保留旧行为,您可以如下指定参数
1 2 |
# 创建和配置模型 model = LogisticRegression(solver='liblinear') |
要支持新行为(推荐),您可以如下指定参数
1 2 |
# 创建和配置模型 model = LogisticRegression(solver='lbfgs') |
多类别更改
以下示例将生成关于 LogisticRegression 使用的“**multi_class**”参数的 FutureWarning。
1 2 3 4 5 6 7 8 9 |
# 生成 FutureWarning 的 LogisticRegression 示例 from sklearn.datasets import make_blobs 从 sklearn.线性模型 导入 LogisticRegression # 准备数据集 X, y = make_blobs(n_samples=100, centers=3, n_features=2) # 创建和配置模型 model = LogisticRegression(solver='lbfgs') # 拟合模型 model.fit(X, y) |
运行该示例会产生以下警告消息
1 |
FutureWarning: Default multi_class will be changed to 'auto' in 0.22. Specify the multi_class option to silence this warning. |
此警告消息仅影响将逻辑回归用于多类别分类问题,而不是用于该方法设计的二元分类问题。
“**multi_class**”参数的默认值正在从“**ovr**”更改为“**auto**”。
要保留旧行为,您可以如下指定参数
1 2 |
# 创建和配置模型 model = LogisticRegression(solver='lbfgs', multi_class='ovr') |
要支持新行为(推荐),您可以如下指定参数
1 2 |
# 创建和配置模型 model = LogisticRegression(solver='lbfgs', multi_class='auto') |
SVM 的 FutureWarning
支持向量机实现最近对“**gamma**”参数进行了更改,导致出现警告消息,特别是 SVC 和 SVR 类。
以下示例将生成关于 SVC 使用的“**gamma**”参数的 FutureWarning,但也同样适用于 SVR。
1 2 3 4 5 6 7 8 9 |
# 生成 FutureWarning 的 SVC 示例 from sklearn.datasets import make_blobs from sklearn.svm import SVC # 准备数据集 X, y = make_blobs(n_samples=100, centers=2, n_features=2) # 创建和配置模型 model = SVC() # 拟合模型 model.fit(X, y) |
运行此示例将生成以下警告消息
1 |
FutureWarning: The default value of gamma will change from 'auto' to 'scale' in version 0.22 to account better for unscaled features. Set gamma explicitly to 'auto' or 'scale' to avoid this warning. |
此警告消息报告“**gamma**”参数的默认值将从当前的“**auto**”更改为新的默认值“**scale**”。
gamma 参数仅影响使用 RBF、多项式或 Sigmoid 核的 SVM 模型。
该参数控制算法中使用的“**gamma**”系数的值,如果您不指定值,则使用启发式方法指定值。此警告是关于默认值计算方式的更改。
要保留旧行为,您可以如下指定参数
1 2 |
# 创建和配置模型 model = SVC(gamma='auto') |
要支持新行为(推荐),您可以如下指定参数
1 2 |
# 创建和配置模型 model = SVC(gamma='scale') |
决策树集成算法的 FutureWarning
基于决策树的集成算法将更改集成中使用的子模型或树的数量,这由“**n_estimators**”参数控制。
这会影响用于分类和回归的随机森林和额外树模型,特别是以下类:*RandomForestClassifier*、*RandomForestRegressor*、*ExtraTreesClassifier*、*ExtraTreesRegressor* 和 *RandomTreesEmbedding*。
以下示例将生成关于 RandomForestClassifier 使用的“**n_estimators**”参数的 FutureWarning,但也同样适用于 RandomForestRegressor 和额外树类。
1 2 3 4 5 6 7 8 9 |
# 生成 FutureWarning 的 RandomForestClassifier 示例 from sklearn.datasets import make_blobs from sklearn.ensemble import RandomForestClassifier # 准备数据集 X, y = make_blobs(n_samples=100, centers=2, n_features=2) # 创建和配置模型 model = RandomForestClassifier() # 拟合模型 model.fit(X, y) |
运行此示例将生成以下警告消息
1 |
FutureWarning: The default value of n_estimators will change from 10 in version 0.20 to 100 in 0.22. |
此警告消息报告子模型的数量将从 10 增加到 100,这可能是因为计算机速度越来越快,而 10 个子模型太少,即使 100 个也算少。
要保留旧行为,您可以如下指定参数
1 2 |
# 创建和配置模型 model = RandomForestClassifier(n_estimators=10) |
要支持新行为(推荐),您可以如下指定参数
1 2 |
# 创建和配置模型 model = RandomForestClassifier(n_estimators=100) |
更多未来警告?
您是否正在处理未涵盖的 FutureWarning?
请在下面的评论中告诉我,我将尽力提供帮助。
FutureWarning 建议
通常,我不建议忽略或抑制警告消息。
忽略警告消息意味着该消息可能会掩盖实际错误或程序输出,并且 API 未来更改可能会对您的程序产生负面影响,除非您已经考虑了它们。
抑制警告可能是在研发工作中的快速修复方法,但不应在生产系统中使用。比简单地忽略消息更糟糕的是,抑制警告还可能抑制来自其他 API 的消息。
相反,我建议您修复软件中的警告消息。
您应该如何更改代码?
一般来说,我几乎总是建议采用 API 的新行为,例如新默认值,除非您明确依赖于函数的先前行为。
对于长期运行的操作或生产代码,明确指定所有函数参数而不使用默认值可能是一个好主意,因为它们将来可能会发生变化。
我还建议您及时更新 scikit-learn 库,并跟踪每个新版本中 API 的更改。
最简单的方法是查看每个版本的发布说明,可在此处获取
进一步阅读
如果您想深入了解,本节提供了更多关于该主题的资源。
- Python 警告控制 API
- sklearn.linear_model.LogisticRegression API
- sklearn.svm.SVC API
- sklearn.svm.SVR API
- scikit-learn 发布历史
总结
在本教程中,您了解了 scikit-learn API 中的 FutureWarning 消息以及如何在您自己的机器学习项目中处理它们。
具体来说,你学到了:
- FutureWarning 消息旨在通知您 scikit-learn API 中参数默认值的即将更改。
- FutureWarning 消息可以被忽略或抑制,因为它们不会阻止程序的执行。
- FutureWarning 消息的示例以及如何解释消息并更改代码以应对即将到来的更改。
你有什么问题吗?
在下面的评论中提出你的问题,我会尽力回答。
感谢分享您处理警告的方法。
不客气,希望有所帮助。
太棒了!这对我有效,谢谢!
我很高兴听到这个消息!
我的 model.fit() 中这个怎么样?
/usr/local/lib/python3.6/dist-packages/sklearn/utils/validation.py:724: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().
y = column_or_1d(y, warn=True)
此致,
Mathias
试试这个
/home/keerat/anaconda3/lib/python3.7/site-packages/sklearn/svm/base.py:931: ConvergenceWarning: Liblinear failed to converge, increase the number of iterations.
“迭代次数。”,ConvergenceWarning)
这个呢?
这表明数据不适合模型。您可能需要缩放数据或选择不同的数据。
我开始学习 Python,发现了您关于警告的文章。感谢您的文章。
谢谢,很高兴对您有帮助。
谢谢你,Jason,喜欢你的帖子!
不客气,Dennis。
嗨,Jason,
感谢您的一切……
对于以下警告,您有什么建议:(用于多类分类的 MLP)
Python37\lib\site-packages\sklearn\neural_network\multilayer_perceptron.py:566: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (200) reached and the optimization hasn’t converged yet. % self.max_iter, ConvergenceWarning)
也许尝试增加求解器的迭代次数?
也许尝试不同的求解器?
也许尝试在拟合模型之前缩放数据?
警告:y 中最少样本的类只有 1 个成员,这太少了。任何类中的最少成员数不能小于 n_splits=5。
这表明您的数据存在问题。
具体来说,您只有一个类的一个示例。
也许您可以收集更多/不同的数据?
也许您可以删除只有一个示例的类?
/anaconda3/lib/python3.7/site-packages/sklearn/model_selection/_split.py:2053: FutureWarning: You should specify a value for ‘cv’ instead of relying on the default value. The default value will change from 3 to 5 in version 0.22.
warnings.warn(CV_WARNING, FutureWarning)
太棒了!
对于旧行为设置为 3,对于新行为设置为 5。可能设置为 5。
/anaconda3/lib/python3.7/site-packages/sklearn/externals/joblib/__init__.py:15: FutureWarning: sklearn.externals.joblib is deprecated in 0.21 and will be removed in 0.23. Please import this functionality directly from joblib, which can be installed with: pip install joblib. If this warning is raised when loading pickled models, you may need to re-serialize those models with scikit-learn 0.21+.
warnings.warn(msg, category=FutureWarning)
FutureWarning: The sklearn.metrics.scorer module is deprecated in version 0.22 and will be removed in version 0.24. The corresponding classes / functions should instead be imported from sklearn.metrics. Anything that cannot be imported from sklearn.metrics is now part of the private API.
warnings.warn(message, FutureWarning)
是的,第一个警告建议直接使用 joblib API。
第二个警告建议从 sklearn.metrics 导入您的评分函数。
如何解决此错误?为了打印模糊C均值聚类技术的SSE值
FutureWarning: sklearn.datasets.samples_generator 模块在0.22版本中已弃用,并将在0.24版本中移除。相应的类/函数应改为从 sklearn.datasets 导入。任何不能从 sklearn.datasets 导入的内容现在都属于私有API。
warnings.warn(message, FutureWarning)
我正在使用适用于 Python 3.7 版本的 scikit learn 0.22.1 版本。
将您的导入从 sklearn.datasets.samples_generator 更改为 sklearn.datasets
非常感谢您,先生……问题解决了..!!
很高兴听到这个消息。
file:///C:/Users/91735/Anaconda3/lib/site-packages/sklearn/externals/joblib/__init__.py:15: DeprecationWarning: sklearn.externals.joblib 在 0.21 版本中已弃用,并将在 0.23 版本中移除。请直接从 joblib 导入此功能,可以通过以下方式安装:pip install joblib。如果此警告在加载 pickled 模型时出现,您可能需要使用 scikit-learn 0.21+ 重新序列化这些模型。warnings.warn(msg, category=DeprecationWarning)
将您的导入从“sklearn.externals.joblib”更改为“joblib”
非常感谢 Jason 博士
不客气。
E:\Anaconda3\New folder\envs\ML scikit learn\lib\site-packages\sklearn\tree\_classes.py:1233: FutureWarning: classes_ 属性将在0.22版本中弃用,并将在0.24版本中移除。
warnings.warn(msg, FutureWarning)
有趣,我以前从未见过这个。
您使用的是什么模型?某种决策树?
您好,我在使用 LogisticRegression 算法时遇到以下错误。
F:\Python_Anaconda_Software\lib\site-packages\sklearn\linear_model\logistic.py:432: FutureWarning: 默认求解器将在 0.22 版本中更改为 'lbfgs'。请指定一个求解器以消除此警告。
FutureWarning)
—————————————————————————
ValueError 回溯 (最近一次调用)
in
----> 1 log.fit(X_train,y_train)
F:\Python_Anaconda_Software\lib\site-packages\sklearn\linear_model\logistic.py in fit(self, X, y, sample_weight)
1530
1531 X, y = check_X_y(X, y, accept_sparse='csr', dtype=_dtype, order="C",
-> 1532 accept_large_sparse=solver != 'liblinear')
1533 check_classification_targets(y)
1534 self.classes_ = np.unique(y)
F:\Python_Anaconda_Software\lib\site-packages\sklearn\utils\validation.py in check_X_y(X, y, accept_sparse, accept_large_sparse, dtype, order, copy, force_all_finite, ensure_2d, allow_nd, multi_output, ensure_min_samples, ensure_min_features, y_numeric, warn_on_dtype, estimator)
717 ensure_min_features=ensure_min_features,
718 warn_on_dtype=warn_on_dtype,
--> 719 estimator=estimator)
720 if multi_output
721 y = check_array(y, 'csr', force_all_finite=True, ensure_2d=False,
F:\Python_Anaconda_Software\lib\site-packages\sklearn\utils\validation.py in check_array(array, accept_sparse, accept_large_sparse, dtype, order, copy, force_all_finite, ensure_2d, allow_nd, ensure_min_samples, ensure_min_features, warn_on_dtype, estimator)
494 try
495 warnings.simplefilter('error', ComplexWarning)
--> 496 array = np.asarray(array, dtype=dtype, order=order)
497 except ComplexWarning
498 raise ValueError("Complex data not supported\n"
F:\Python_Anaconda_Software\lib\site-packages\numpy\core\numeric.py in asarray(a, dtype, order)
536
537 """
--> 538 return array(a, dtype, copy=False, order=order)
539
540
ValueError: could not convert string to float: 'E12'
也许首先尝试将求解器更改为 'lbfgs'。
然后查看您的数据,并使用整数编码或独热编码将至少其中一列转换为数字。
我很感谢您还在发布这样的帖子!
三年前我开始做机器学习项目时第一次发现了你的网站,很高兴看到你的网站今天仍然像当年一样相关和有用。
坚持下去!😀
谢谢!
FutureWarning: gamma 的默认值将从 0.22 版本中的 'auto' 更改为 'scale',以更好地适应未缩放的特征。请明确设置 gamma 为 'auto' 或 'scale' 以避免此警告。
"避免此警告。", FutureWarning)
尝试将 gamma 设置为 'scale'。
嗨,Jason,
您将如何修复这个未来的警告?
FutureWarning: sklearn.ensemble.bagging 模块在 0.22 版本中已弃用,并将在 0.24 版本中移除。相应的类/函数应改为从 sklearn.ensemble 导入。任何不能从 sklearn.ensemble 导入的内容现在都属于私有 API。
谢谢
尝试按照建议将导入语句更改为 sklearn.ensemble?
我收到了这个警告,如何解决?
FutureWarning: safe_indexing 函数已弃用;safe_indexing 在 0.22 版本中已弃用,并将在 0.24 版本中移除。warnings.warn(msg, category=FutureWarning)
提前感谢您!
有趣,我以前从未见过,您使用的是什么函数或类?
我收到了这个警告,使用了 SMOTE
sm = SMOTE(random_state=SEED)
X_train, y_train = sm.fit_sample(X_train, y_train)
什么警告?
AttributeError: 无法获取 'DeprecationDict' 属性
出现此错误以及“FutureWarning: sklearn.metrics.regression 模块在 0.22 版本中已弃用,并将在 0.24 版本中移除。相应的类/函数应改为从 sklearn.metrics 导入。任何不能从 sklearn.metrics 导入的内容现在都属于私有 API。”这类警告。请帮我。
有趣,我以前从未见过这个。
也许检查您正在导入哪些指标,看看是否可以直接导入它们?
嗨,感谢您的有用提示!
我正在关注这个网站 (https://www.scikit-yb.org/en/latest/api/model_selection/rfecv.html#:~:text=Recursive%20feature%20elimination%20(RFE)%20is,number%20of%20features%20is%20reached.&text=RFE%20requires%20a%20specified%20number,how%20many%20features%20are%20valid.) 来做递归特征消除。
当我运行以下代码时
from sklearn.ensemble import RandomForestClassifier
从 sklearn.model_selection 导入 StratifiedKFold
from yellowbrick.model_selection import rfecv
from yellowbrick.datasets import load_credit
我收到了这个未来的警告信息
FutureWarning: sklearn.metrics.classification 模块在 0.22 版本中已弃用,并将在 0.24 版本中移除。相应的类/函数应改为从 sklearn.metrics 导入。任何不能从 sklearn.metrics 导入的内容现在都属于私有 API。
warnings.warn(message, FutureWarning)
我是 Python 新手。希望收到您的建议!谢谢!
您可以安全地忽略此警告。
也许 yellowbrick API 需要更新,例如超出您的控制。
嘿,谢谢你的提示!我收到一个不同的警告,希望你能帮忙,如下:
FutureWarning: Pass param_name=polynomialfeatures__degree, param_range=[ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20] as keyword args. From version 0.25 passing these as positional arguments will result in an error
FutureWarning)
提前感谢您!
也许可以尝试按照警告中的建议,将参数作为命名参数提供?
嗨,Jason,
您将如何修复这个未来的警告?
FutureWarning: sklearn.metrics.regression 模块在 0.22 版本中已弃用,并将在 0.24 版本中移除。相应的类/函数应改为从 sklearn.metrics 导入。任何不能从 sklearn.metrics 导入的内容现在都属于私有 API。
warnings.warn(message, FutureWarning)
此致,
尝试直接从 sklearn.metrics 导入您的指标
删除导入语句中的 .regression 部分。
嗨,Jason,
非常感谢这些有用的帖子和电子书!
这个怎么样?
lib/python3.7/site-packages/sklearn/utils/validation.py:70: FutureWarning: Pass classes=[0 1 2], y=136 2
29 0
226 2
254 2
66 0
..
165 2
241 2
484 0
448 2
360 2
Name: label, Length: 690, dtype: int64 as keyword args. From version 0.25 passing these as positional arguments will result in an error
FutureWarning)
抱歉,我不确定这个问题。也许可以尝试 stackoverflow.com
感谢这篇好文章。帮助很大。
我不确定如何解决这两个未来的警告
UserWarning: 尝试在使用 0.24.1 版本时解封 0.23.1 版本的 RandomForestClassifier 估计器。这可能导致代码中断或结果无效。风险自负。
/Users/joe/.virtualenvs/venv/scripts2/lib/python3.6/site-packages/sklearn/utils/validation.py:72: FutureWarning: Pass input=['refactor: update requirements file \n\n- I added the django-test library to generate testing data\n\n- the docker library will be used in the perf testing script', 'refactor: update perf testing script to use the new fixtures'] as keyword args. From version 1.0 (renaming of 0.25) passing these as positional arguments will result in an error
"将导致错误", FutureWarning)
也许您可以加载模型,然后用您当前的系统重新保存它来修复第一个问题?试一试看看。
抱歉,第二个问题不确定。
嗨,Jason,
我正在尝试理解 k-折交叉验证,我不知怎么地复制粘贴了您的代码
# scikit-learn k-折交叉验证
from numpy import array
from sklearn.model_selection import KFold
# 数据样本
data = array([0.1, 0.2, 0.3, 0.4, 0.5, 0.6])
# 准备交叉验证
kfold = KFold(3, True, 1)
# 枚举划分
for train, test in kfold.split(data)
print(‘train: %s, test: %s’ % (data[train], data[test]))
我收到以下警告
警告(来自警告模块)
File “C:\Users\Dhruvanshu\AppData\Local\Programs\Python\Python38\lib\site-packages\sklearn\utils\validation.py”, line 70
warnings.warn(f”Pass {args_msg} as keyword args. From version ”
FutureWarning: Pass shuffle=True as keyword args. From version 1.0 (renaming of 0.25) passing these as positional arguments will result in an error
我的设备使用 sklearn 0.24.1 版本
也许为构造函数指定变量名,例如 n_splits=3, shuffle=True, random_state=1
嗨,Jason,
谢谢,这解决了问题。
另外,只想说您的博客在我遇到一些概念上的困难时帮了我很多忙。
干得好!
谢谢您的美言。
嗨,Jason,
非常感谢这篇有用的文章。
我正在使用 Google Colaboratory,不知道如何解决这些未来的警告
从导入这些
from imblearn.over_sampling import SMOTE
from imblearn.under_sampling import RandomUnderSampler
我得到这些
/usr/local/lib/python3.7/dist-packages/sklearn/externals/six.py:31: FutureWarning: 该模块在 0.21 版本中已弃用,并将在 0.23 版本中移除,因为我们已放弃对 Python 2.7 的支持。请依赖官方版本 six (https://pypi.ac.cn/project/six/)。
"(https://pypi.ac.cn/project/six/).", FutureWarning)
/usr/local/lib/python3.7/dist-packages/sklearn/utils/deprecation.py:144: FutureWarning: sklearn.neighbors.base 模块在 0.22 版本中已弃用,并将在 0.24 版本中移除。相应的类/函数应改为从 sklearn.neighbors 导入。任何不能从 sklearn.neighbors 导入的内容现在都属于私有 API。
warnings.warn(message, FutureWarning)
也许尝试在一个您可以控制库版本的系统上运行代码。
非常感谢。代码运行良好。
不客气!
嗨,杰森,我喜欢你的网站,它在我遇到问题时给了我无尽的帮助。我想知道你是否可以帮我解决这个未来警告,因为我正在努力解决它……
我正在将我的数据框数据拆分为 X_data 和 Y_data,并转换为 np.array,为 KMeans 聚类做准备。X_data 是删除了两个目标变量列的数据框,Y_data 是数据框中的两个目标变量列。拆分后,我使用 SMOTE 进行过采样。
这是代码和未来的警告
oversample = SMOTE()
X_data = np.array(complete_dataset.drop([‘target1’, ‘target2’],1))
subset = complete_dataset[[‘target1’, ‘target2’]]
y_data = np.array(subset)
X_data, y_data = oversample.fit_resample(X_data, y_data)
/Users/maria/opt/anaconda3/lib/python3.8/site-packages/sklearn/utils/validation.py:70: FutureWarning: Pass classes=[0 1] as keyword args. From version 1.0 (renaming of 0.25) passing these as positional arguments will result in an error
warnings.warn(f”Pass {args_msg} as keyword args. From version “
抱歉,我没有见过这个错误。您可能需要查看 API 文档。
我运行代码时遇到了这个 FutureWarning,我从 wb.save(filename= out_file) 中找到了原因,因为当我删除它时,警告就消失了。
我没有看到 wb.save 和下面的 WARNING 之间有任何关联。您能给我一个建议吗?我们需要解决它还是忽略它?
警告
/common/appl/python/anaconda3-5.2.0/lib/python3.6/site-packages/openpyxl/comments/shape_writer.py:75: FutureWarning: 此方法的行为将在未来版本中更改。请改用特定的 'len(elem)' 或 'elem is not None' 测试。
if not shape_types
这是来自 Openpyxl 的,您可能需要忽略此错误或等待版本升级来修复它。
非常感谢。
我暂时忽略了它。
FutureWarning: 'normalize' 在 1.0 版本中已弃用,并将在 1.2 版本中移除。请将 normalize 参数保留其默认值以消除此警告。此估计器的默认行为是不进行任何归一化。如果需要归一化,请改用 sklearn.preprocessing.StandardScaler。
如何消除此警告。我正在使用 sklearn.linear_model.ElasticNet 类。
谢谢!
正如消息所建议的,不要使用 normalize,而是单独使用 StandardScaler。这是消除它的可靠方法。
我不想归一化,并且我将 normalize 设置为默认值 'False'。它仍然显示警告。
我想默认值意味着您甚至没有在参数中提及它。您可以尝试一下吗?
这对我有效。非常感谢!
我尝试自己修复这个错误,但没有成功。
我正在阅读一本写得很好的关于 NLP 的书。里面的例子都包含一个 todense() 方法调用。
todense() 的问题在于它返回一个 np.matrix,所以我得到:
FutureWarning: np.matrix 的使用在 1.0 版本中已弃用,并将在 1.2 版本中引发 TypeError。请使用 np.asarray 转换为 numpy 数组。(我正在使用 1.0.1 版本)。
我尝试转换为 asarray 和其他转换,但我尝试的任何方法都会导致后续代码失败,可能是因为 cosine_similarity 函数需要特定类型的数据。
嗨 Perchio… 我最能帮助解决有关教程和/或我们其他内容中代码清单的具体问题。
FutureWarning: 特征名称只支持全是字符串的名称。获得了包含 dtypes: ['int', 'str'] 的特征名称。在 1.2.FutureWarning 中将引发错误。
我相信这是由于使用 sklearn.preprocessing.OneHotEncoder 对特征进行编码,它将特征独热编码为 0.1.2.3.4.5.....N。
Pd.dummies 没有这个问题(它会生成特征名 + 数字),但不如 OneHotEncoder 灵活。不确定如何找到变通方法。
嗨 Daniel…您可能会发现以下内容很有趣
https://python.tutorialink.com/pytest-how-to-locate-a-futurewarning-and-fix-it/
嗨 Daniel,你找到解决方案了吗?
我通过给类名添加前缀解决了这个问题,这是一个泰坦尼克号数据集的例子
pclass=pd.get_dummies(mydata[‘Pclass’], drop_first=True, prefix=’pc’)
收到此未来警告。
https://github.com/paulgureghian/Python_Notebooks/blob/main/Create_Cust_Segments/Identify_Cust_Segments/identify_cust_segments.ipynb
我发现许多笔记本都有相同的错误,但没有人给我解决这个问题的方案。
X_train = data_train.date[:, np.newaxis]
“对多维索引(例如 obj[:, None])的支持已被弃用,并将在未来版本中移除。”
所以,在寻找了一些答案之后,我找到了这个方案:
不要使用ndarray,只需使用一个数组,然后将其从1D数组重塑为2D数组,即使用 array.reshape(-1, 1),问题就解决了。
from sklearn.tree import DecisionTreeRegressor
data_train = ram_prices[ram_prices.date = 2000]
X_train = np.array(data_train.date)
X_train = X_train.reshape(-1, 1)
y_train = np.log(data_train.price)
tree = DecisionTreeRegressor().fit(X_train, y_train)
linear_reg = LinearRegression().fit(X_train, y_train)
X_all = np.array(ram_prices.date)
X_all = X_all.reshape(-1, 1)
pred_tree = tree.predict(X_all)
pred_lr = linear_reg.predict(X_all)
price_tree = np.exp(pred_tree)
price_lr = np.exp(pred_lr)
谢谢你,Rodrigo!继续努力!
解决了[66] ndarray DecisionTreeRegressor 第81页的问题。
感谢你的反馈,Rodrigo!
嗨,James – 非常感谢你这篇精彩的文章,并积极参与评论。我属于初学者,所以如果这是一个基本问题,请原谅,但我想知道你是否可以帮助解决下面的错误。
FutureWarning: 特征名称只支持全是字符串的名称。得到的特征名称的dtype为:['tuple']。在1.2版本中将引发错误。
我的“两分钱”是,我认为这与我的列标题有两级有关,所以当我在“预测器”中引用它们时,我需要使用[(“A,B”),(“C,D”)],但我不知道还有其他方法可以做到……请帮忙 🙂
嗨,Adam……不客气!以下内容你可能会感兴趣:
https://machinelearning.org.cn/how-to-fix-futurewarning-messages-in-scikit-learn/
嗨,
当我尝试对KNN模型使用knn.predict或knn.score时,我收到以下未来警告。我暂时用警告过滤器屏蔽了警告,但如何解决它呢?谢谢。
FutureWarning: 与其他归约函数(例如 `skew`、`kurtosis`)不同,`mode` 的默认行为通常会保留其作用轴。在 SciPy 1.11.0 中,此行为将改变:`keepdims` 的默认值将变为 False,统计量所取的 `axis` 将被消除,并且不再接受 None 值。将 `keepdims` 设置为 True 或 False 以避免此警告。
mode, _ = stats.mode(_y[neigh_ind, k], axis=1)
嗨,Dione……以下讨论可能会有所帮助:
https://stackoverflow.com/questions/74406936/knn-python-implementation
我正在运行
model=Summarizer()
model(docToRead, num_sentences=2)
它给我显示消息
/usr/local/lib/python3.9/dist-packages/sklearn/cluster/_kmeans.py:870: FutureWarning
在 1.4 版本中,`n_init` 的默认值将从 10 更改为 'auto'。明确设置 `n_init` 的值以抑制警告
这很奇怪,因为我只是调用了摘要器,所以我甚至不知道如何为 Kmeans 更改 n_init。实际上,Kmeans 很可能是直接从 Summarizer() 函数中调用的。
嗨,Rodrigo……以下资源你可能会感兴趣:
https://github.com/scikit-learn/scikit-learn/discussions/25016
https://scikit-learn.cn/stable/modules/generated/sklearn.cluster.k_means.html
当我使用xgboost进行grid_search时遇到了这个错误。
...FutureWarning: 传递 sample_weight=...
似乎我传入的评分器有问题。这解决了问题。
from sklearn.metrics import r2_score, mean_squared_error
from sklearn.metrics import make_scorer
my_scorer = make_scorer(mean_squared_error, greater_is_better=False)
谢谢Mehdi分享你的建议!
NameError: name 'make_scorer' is not defined
我收到这个错误消息,因为 from sklearn.metrics.scorer import make_scorer 已被弃用为 _SCORER。
我有一个问题,_SCORER 中有什么新方法可以实现 'make_scorer' 的目的
嗨,Anureet……你遇到的错误信息表明 scikit-learn 库中关于 `make_scorer` 函数存在弃用。然而,截至我上次更新,`make_scorer` 函数在 scikit-learn 中仍然可用,它没有被弃用或被 `_SCORER` 替换。
如果你遇到 `make_scorer` 的问题,这可能是由于版本不匹配或导入错误造成的。导入和使用 `make_scorer` 的正确方法如下:
python
from sklearn.metrics import make_scorer
这是一个如何使用 `make_scorer` 的快速示例:
python
from sklearn.metrics import make_scorer, accuracy_score
from sklearn.model_selection import cross_val_score
from sklearn.ensemble import RandomForestClassifier
# 使用 accuracy_score 的自定义评分器
scorer = make_scorer(accuracy_score)
# 交叉验证中的示例用法
model = RandomForestClassifier()
scores = cross_val_score(model, X, y, cv=5, scoring=scorer)
print(scores)
如果你在代码中遇到 `_SCORER` 或与之相关的错误,这可能是由于 scikit-learn 的内部更改,或者问题可能与不同版本或自定义实现有关。
### 解决步骤
1. **确保你正在使用正确版本的 scikit-learn:**
确保你的 scikit-learn 库是最新的。你可以使用以下命令升级:
bash
pip install --upgrade scikit-learn
2. **检查导入语句:**
确保你正在使用正确的 `make_scorer` 导入语句。
3. **备用方案:**
如果由于某种原因 `make_scorer` 不可用,你可以考虑直接编写一个自定义评分函数,而不是使用 `make_scorer`。
如果你能提供更多关于你在何处遇到 `_SCORER` 以及你正在使用的 scikit-learn 的具体版本的信息,我可以提供更有针对性的建议。