Построение таблицы результатов поиска по сетке на одном графике - PullRequest
0 голосов
/ 18 июня 2019

В sklearn 0.17.1 был - >> grid_scores_: список именованных кортежей (https://scikit -learn.org / 0.17 / modules / generate / sklearn.grid_search.GridSearchCV.html # sklearn.grid_search.GridSearchCV )

Теперь в sklearn 0.21.2 он заменен на - >> cv_results_: dict of numpy (masked) ndarrays (https://scikit -learn.org / stable / modules /Генерируемый / sklearn.model_selection.GridSearchCV.html )

Ранее с помощью sklearn 0.17.1 мне удалось построить все параметры сетки на одном графике с помощью grid_scores_, но теперь я не могу агрегировать полученные значенияиз cv_results_, поскольку в более новой версии отсутствует "mean_validation_score".

У меня есть существующий код, который отображает все оценки параметров в sklearn 0.17.1 (https://scikit -learn.org / 0.17 / modules / generate / sklearn.grid_search.GridSearchCV.html # sklearn.grid_search.GridSearchCV ), где использовалась grid_scores_, и она отлично отображала все значения на одном графике.

В более новой версии slearn cv_results_ был заменен grid_scores_.Я попытался добавить все значения, чтобы построить все параметры на одном графике, в настоящее время я не могу добавить правильные значения для построения графика.

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline
from sklearn.metrics import confusion_matrix
from sklearn.preprocessing import StandardScaler
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import GridSearchCV
from sklearn.model_selection import train_test_split
from sklearn import metrics
from sklearn.metrics import roc_curve, auc, roc_auc_score
from sklearn.metrics.ranking import precision_recall_curve
from sklearn.metrics import confusion_matrix
from sklearn.datasets import make_classification
from sklearn.tree import DecisionTreeClassifier, export_graphviz
from sklearn import tree
from sklearn.metrics import accuracy_score
import sklearn
import itertools
from pandas.tools.plotting import scatter_matrix
import os
import datetime as dt
from operator import itemgetter
from itertools import chain
import graphviz 

from sklearn.metrics import precision_recall_fscore_support
import scikitplot as skplt

X_train = np.random.randint(0,1, size=[500,5000])
y_train = np.random.randint(0,1, size=500)

print(X_train.shape, y_train.shape)
# (500, 5000) (500,)

#grid_search = GridSearchCV(clf, param_grid, cv=3) # 10 fold cross validation

### hyperparameter estimator
param_grid = {"criterion": ["gini", "entropy"], 
              "splitter": ["best", "random"],
              "max_depth": np.arange(1,9,7), 
              "min_samples_split": np.arange(2,150,90),
              "min_samples_leaf": np.arange(1,60,45), 
              "min_weight_fraction_leaf": np.arange(0.1,0.4, 0.3), 
              "max_features": [1000, 500, 5000],  
              "max_leaf_nodes": np.arange(2,60,45),
              "min_impurity_decrease": [0.0, 0.5], 
              }  


def evaluate_param(parameter, param_range, index):
    grid_search = GridSearchCV(clf, param_grid = {parameter: param_range}, cv=3) # 3 fold cross validation
    grid_search.fit(X_train, y_train) ### grid_search.fit(X_train[features], y_train)

    df = {}
    #for i, score in enumerate(grid_search.grid_scores_): # previously used methods
    for i, score in enumerate(grid_search.cv_results_["params"]):
        ## How do we save the correct values here for plotting
        df[parameter] = grid_search.cv_results_["params"][i][parameter]
        #df[parameter].update(grid_search.cv_results_["params"][i][parameter])
        #print("df : ", df)
        #df[parameter].append(grid_search.cv_results_["params"][i][parameter])

    #print("df : ", df) # the values are not appended to the keys
    df = pd.DataFrame.from_dict(df, orient='index')
    df.reset_index(level=0, inplace=True)
    df = df.sort_values(by='index')

    plt.subplot(5,2,index) # Change here according to the number of parameters
    plt.xlabel(parameter, color = "red")
    plt.ylabel("GridSearchCV Score", color= "blue")
    plot = plt.plot(df['index'], df[0])
    plt.title(parameter.capitalize(), color = "red")
    plt.savefig('DT_GridSearchCV_Score_Hyperparameter.png')
    return plot, df

clf = tree.DecisionTreeClassifier(random_state=99) # verbose=True, n_jobs=-1 :: Dt does not support it

### hyperparameter estimator
index = 1
plt.figure(figsize=(30,30))
for parameter, param_range in dict.items(param_grid):   
    evaluate_param(parameter, param_range, index)  ## 120 features
    index += 1

Это изображение не заполненоэто не «mean_validation_score», который можно заполнить для каждого подзаговора сейчас: https://ibb.co/Z6jwnMr

## Keys() gives the list of keys that gridsearchcv has:
grid_search.cv_results_.keys()
# output
# dict_keys(['mean_fit_time', 'std_fit_time', 'mean_score_time', 'std_score_time', 'param_criterion', 'param_max_depth', 'param_max_features', 'param_max_leaf_nodes', 'param_min_impurity_decrease', 'param_min_samples_leaf', 'param_min_samples_split', 'param_min_weight_fraction_leaf', 'param_splitter', 'params', 'split0_test_score', 'split1_test_score', 'split2_test_score', 'mean_test_score', 'std_test_score', 'rank_test_score', 'split0_train_score', 'split1_train_score', 'split2_train_score', 'mean_train_score', 'std_train_score'])

grid_search.best_estimator_
# output
# DecisionTreeClassifier(class_weight=None, criterion='gini', max_depth=1,
        #max_features=1000, max_leaf_nodes=2, min_impurity_decrease=0.0,
        #min_impurity_split=None, min_samples_leaf=1,
        #min_samples_split=2, min_weight_fraction_leaf=0.1,
        #presort=False, random_state=99, splitter='best')

Ожидаемый результат (должен быть заполнен): https://ibb.co/Z6jwnMr

Однакокаждый участок на графике должен иметь кривую, отображающую наилучшее значение параметра.Клавиши не имеют «mean_validation_score» для отображения фактического результата теста, который был в sklearn 0.17.1, но не в sklearn 0.20.2

Пожалуйста, дайте мне знать, если есть способ построить весь тестбаллы на сюжетах одного сюжета.Заранее спасибо !!

...