GridSearchCV的结果作为表格呈现

10

我使用带有RBF内核的SVM进行了网格搜索+交叉验证,以找到最佳参数C和gamma值,使用GridShearchCV类。现在我想以表格格式获取结果,如下所示:

C/gamma 1e-3 1e-2 1e3
0.1      0.2  ..  0.3
1        0.9
10       ..   
100      ..

其中的单元格包含了该参数值对应的准确度分数。

如果第一种解决方案不可行,那么至少可以采用更简单的方法,比如:

C    gamma  accuracy
0.1  1e-4      0.2 
...

我在Python方面不是很熟练,不知道该从哪里开始。你能给我一些做这种表格表示的方法吗?最好的解决方案是将表格作为绘图,但只在控制台中简单打印也可以。谢谢!


import pandas as pd;df = pd.Dataframe(grid.cv_results_) 这段代码是否能正常运行,你测试过了吗? - Shihab Shahriar Khan
嗨@Gianluca Amprimo,这个答案对你有用吗? - Parthasarathy Subburaj
嗨,@Gianluca Amprimo,如果以下解决方案对您有用,请您将其接受为验证答案,因为这将有助于那些可能稍后访问此问题的其他人。 - Parthasarathy Subburaj
2个回答

11
您可以使用以下方法利用gridsearchCV对象的cv_results_属性:

您可以利用gridsearchCV对象的cv_results_属性,具体如下:

from sklearn import svm, datasets
from sklearn.model_selection import GridSearchCV
iris = datasets.load_iris()
parameters = {'kernel':('linear', 'rbf'), 'C':[1, 10]}
svc = svm.SVC(gamma="scale")
clf = GridSearchCV(svc, parameters, cv=5)
clf.fit(iris.data, iris.target)

现在你可以使用 clf.cv_results_
{'mean_fit_time': array([0.00049248, 0.00051575, 0.00051174, 0.00044131]),
 'mean_score_time': array([0.0002739 , 0.00027657, 0.00023718, 0.00023627]),
 'mean_test_score': array([0.98      , 0.96666667, 0.97333333, 0.98      ]),
 'param_C': masked_array(data=[1, 1, 10, 10],
              mask=[False, False, False, False],
        fill_value='?',
             dtype=object),
 'param_kernel': masked_array(data=['linear', 'rbf', 'linear', 'rbf'],
              mask=[False, False, False, False],
        fill_value='?',
             dtype=object),
 'params': [{'C': 1, 'kernel': 'linear'},
  {'C': 1, 'kernel': 'rbf'},
  {'C': 10, 'kernel': 'linear'},
  {'C': 10, 'kernel': 'rbf'}],
 'rank_test_score': array([1, 4, 3, 1], dtype=int32),
 'split0_test_score': array([0.96666667, 0.96666667, 1.        , 0.96666667]),
 'split1_test_score': array([1.        , 0.96666667, 1.        , 1.        ]),
 'split2_test_score': array([0.96666667, 0.96666667, 0.9       , 0.96666667]),
 'split3_test_score': array([0.96666667, 0.93333333, 0.96666667, 0.96666667]),
 'split4_test_score': array([1., 1., 1., 1.]),
 'std_fit_time': array([1.84329827e-04, 1.34653950e-05, 1.26220210e-04, 1.76294378e-05]),
 'std_score_time': array([6.23956317e-05, 1.34498512e-05, 3.57596078e-06, 4.68175419e-06]),
 'std_test_score': array([0.01632993, 0.02108185, 0.03887301, 0.01632993])}

您可以使用以下命令构建您正在查找的数据帧,利用paramsmean_test_score

pd.concat([pd.DataFrame(clf.cv_results_["params"]),pd.DataFrame(clf.cv_results_["mean_test_score"], columns=["Accuracy"])],axis=1)

你的最终数据框如下所示:
    C   kernel  Accuracy
0   1   linear  0.980000
1   1   rbf     0.966667
2   10  linear  0.973333
3   10  rbf     0.980000

8
也许更简单:
pd.DataFrame({'param': clf.cv_results_["params"], 'acc': clf.cv_results_["mean_test_score"]})

或者:
df = pd.DataFrame(clf.cv_results_)

@GianlucaAmprimo 这应该是被选中的答案。虽然两个都能正常工作,但这个答案需要更少的代码。 - Manuel Fuchs
@Manuel Fuchs,感谢您的关注。 - keramat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接