GridSearchCV 结果热图

Posted

技术标签:

【中文标题】GridSearchCV 结果热图【英文标题】:GridSearchCV results heatmap 【发布时间】:2021-09-09 07:14:31 【问题描述】:

我正在尝试为来自 sklearn 的 GridSearchCV 结果生成热图。我喜欢sklearn-evaluation 的一点是它非常容易生成热图。但是,我遇到了一个问题。当我将参数设为 None 时,例如

max_depth = [3, 4, 5, 6, None]

在生成热图时,它显示错误提示:

TypeError: '<' not supported between instances of 'NoneType' and 'int'

有什么解决方法吗? 我找到了其他生成热图的方法,例如使用 matplotlib 和 seaborn,但没有什么能像 sklearn-evalutaion 那样提供漂亮的热图。

【问题讨论】:

【参考方案1】:

我摆弄了grid_search.py 文件/lib/python3.8/site-packages/sklearn_evaluation/plot/grid_search.py。在第 192/193 行更改行

来自

row_names = sorted(set([t[0] for t in matrix_elements.keys()]),
                   key=itemgetter(1))
col_names = sorted(set([t[1] for t in matrix_elements.keys()]),
                   key=itemgetter(1))

收件人:

row_names = sorted(set([t[0] for t in matrix_elements.keys()]),
                   key=lambda x: (x[1] is None, x[1]))
col_names = sorted(set([t[1] for t in matrix_elements.keys()]),
                   key=lambda x: (x[1] is None, x[1]))

在排序时将所有None 移动到列表的末尾是基于先前的answer 来自安德鲁·克拉克。

使用这个调整,我的演示脚本如下所示:

import numpy as np
import sklearn.datasets as datasets
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import GridSearchCV
from sklearn_evaluation import plot

data = datasets.make_classification(n_samples=200, n_features=10, n_informative=4, class_sep=0.5)


X = data[0]
y = data[1]

hyperparameters = 
    "max_depth": [1, 2, 3, None],
    "criterion": ["gini", "entropy"],
    "max_features": ["sqrt", "log2"],


est = RandomForestClassifier(n_estimators=5)
clf = GridSearchCV(est, hyperparameters, cv=3)
clf.fit(X, y)
plot.grid_search(clf.cv_results_, change=("max_depth", "criterion"), subset="max_features": "sqrt")


import matplotlib.pyplot as plt

plt.show()

输出如下图:

【讨论】:

这是一个不错的解决方案。目前,我正在使用需要一些手动数据操作的 seaborn 热图。很高兴看到这个解决方案合并到 sklearn-evaluation 中。

以上是关于GridSearchCV 结果热图的主要内容,如果未能解决你的问题,请参考以下文章

GridSearchCV - 每次迭代保存结果

如何根据 GradientBoost 结果绘制热图?

如何公平地比较基线和 GridSearchCV 结果?

为啥在 GridSearchCV 中使用 StandardScaler 时会得到不同的结果?

使用 gridsearchCV() 后没有得到更好的结果,而是手动变得更好

RandomizedSearchCV 和 GridsearchCV 结果不可重现