Список параметров gridsearch в кадре данных и показывать счет jaccard - PullRequest
0 голосов
/ 20 февраля 2020

Я использовал этот фрагмент кода для построения кадра данных результатов gridsearch и сортировки по mean_score,

class EstimatorSelectionHelper:

    def __init__(self, models, params):
        if not set(models.keys()).issubset(set(params.keys())):
            missing_params = list(set(models.keys()) - set(params.keys()))
            raise ValueError("Some estimators are missing parameters: %s" % missing_params)
        self.models = models
        self.params = params
        self.keys = models.keys()
        self.grid_searches = {}

    def fit(self, X, y, cv=3, n_jobs=3, verbose=1, scoring=None, refit=False):
        for key in self.keys:
            print("Running GridSearchCV for %s." % key)
            model = self.models[key]
            params = self.params[key]
            gs = GridSearchCV(model, params, cv=cv, n_jobs=n_jobs,
                              verbose=verbose, scoring=scoring, refit=refit,
                              return_train_score=True)
            gs.fit(X,y)
            self.grid_searches[key] = gs    

    def score_summary(self, sort_by='mean_score'):
        def row(key, scores, params):
            d = {
                 'estimator': key,
                 'min_score': min(scores),
                 'max_score': max(scores),
                 'mean_score': np.mean(scores),
                 'std_score': np.std(scores),
            }
            return pd.Series({**params,**d})

        rows = []
        for k in self.grid_searches:
            print(k)
            params = self.grid_searches[k].cv_results_['params']
            scores = []
            for i in range(self.grid_searches[k].cv):
                key = "split{}_test_score".format(i)
                r = self.grid_searches[k].cv_results_[key]        
                scores.append(r.reshape(len(params),1))

            all_scores = np.hstack(scores)
            for p, s in zip(params,all_scores):
                rows.append((row(k, s, p)))

        df = pd.concat(rows, axis=1).T.sort_values([sort_by], ascending=False)

        columns = ['estimator', 'min_score', 'mean_score', 'max_score', 'std_score']
        columns = columns + [c for c in df.columns if c not in columns]

        return df[columns]

И этот код для запуска EstimaHelper:

from sklearn.ensemble import ExtraTreesClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.ensemble import AdaBoostClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.svm import SVC
from sklearn.multiclass import OneVsRestClassifier

models1 = { 
    'ExtraTreesClassifier': OneVsRestClassifier(ExtraTreesClassifier()),
    'RandomForestClassifier': RandomForestClassifier(),
    'AdaBoostClassifier': OneVsRestClassifier(AdaBoostClassifier(base_estimator=DecisionTreeClassifier())),
    'GradientBoostingClassifier': OneVsRestClassifier(GradientBoostingClassifier())
}

params1 = { 
    'ExtraTreesClassifier': { 'estimator__n_estimators': [100, 150],'estimator__min_samples_leaf': [2,20],
              'estimator__min_samples_split': [2,20]},
    'RandomForestClassifier': [
        { 'n_estimators': [16, 32],'min_samples_leaf': [2,20],
              'min_samples_split': [2,20] },
        {'criterion': ['gini', 'entropy'], 'n_estimators': [8, 16]}],
    'AdaBoostClassifier':  { 'estimator__n_estimators': [16, 32] },
    'GradientBoostingClassifier': { 'estimator__n_estimators': [16, 32], 'estimator__learning_rate': [0.8, 1.0] }
}

helper1 = EstimatorSelectionHelper(models1, params1)
helper1.fit(X_tfidf_train_bodytitle, y_train_bodytitle, n_jobs=2,scoring='jaccard_micro')
helper1.score_summary()

И это дает мне такой вывод:

estimator   min_score   mean_score  max_score   std_score   estimator__min_samples_leaf estimator__min_samples_split    estimator__n_estimators min_samples_leaf    min_samples_split   n_estimators    criterion   estimator__learning_rate
20  AdaBoostClassifier  0.266944    0.280491    0.294801    0.0113853   NaN NaN 16  NaN NaN NaN NaN NaN
21  AdaBoostClassifier  0.265694    0.275227    0.285913    0.00829449  NaN NaN 32  NaN NaN NaN NaN NaN
17  RandomForestClassifier  0.257085    0.260455    0.266152    0.0040511   NaN NaN NaN NaN NaN 16  gini    NaN
9   RandomForestClassifier  0.247485    0.248347    0.249011    0.000638656 NaN NaN NaN 2   2   32  NaN NaN
16  RandomForestClassifier  0.241353    0.245627    0.252302    0.00478184  NaN NaN NaN NaN NaN 8   gini    NaN
11  RandomForestClassifier  0.241539    0.245032    0.246792    0.00246979  NaN NaN NaN 2   20  32  NaN NaN
10  RandomForestClassifier  0.239164    0.243673    0.2509  0.00516238  NaN NaN NaN 2   20  16  NaN NaN
8   RandomForestClassifier  0.237519    0.242771    0.246049    0.00375148  NaN NaN NaN 2   2   16  NaN NaN
22  GradientBoostingClassifier  0.131276    0.204014    0.244185    0.0515271   NaN NaN 16  NaN NaN NaN NaN 0.8
23  GradientBoostingClassifier  0.113489    0.179114    0.230813    0.0488991   NaN NaN 32  NaN NaN NaN NaN 0.8
24  GradientBoostingClassifier  0.161265    0.176843    0.199469    0.0163736   NaN NaN 16  NaN NaN NaN NaN 1
0   ExtraTreesClassifier    0.164618    0.170482    0.174839    0.00430664  2   2   100 NaN NaN NaN NaN NaN
1   ExtraTreesClassifier    0.162098    0.168189    0.173138    0.00457891  2   2   150 NaN NaN NaN NaN NaN
2   ExtraTreesClassifier    0.161424    0.167704    0.172259    0.00458871  2   20  100 NaN NaN NaN NaN NaN
12  RandomForestClassifier  0.164153    0.167627    0.170183    0.00254601  NaN NaN NaN 20  2   16  NaN NaN
3   ExtraTreesClassifier    0.162165    0.166824    0.171451    0.00379137  2   20  150 NaN NaN NaN NaN NaN
13  RandomForestClassifier  0.162793    0.166191    0.168821    0.00252027  NaN NaN NaN 20  2   32  NaN NaN
15  RandomForestClassifier  0.161067    0.163374    0.165   0.00167649  NaN NaN NaN 20  20  32  NaN NaN
14  RandomForestClassifier  0.153799    0.156815    0.159975    0.00252362  NaN NaN NaN 20  20  16  NaN NaN
25  GradientBoostingClassifier  0.137566    0.153022    0.16079 0.0109293   NaN NaN 32  NaN NaN NaN NaN 1
19  RandomForestClassifier  0.118717    0.124735    0.134835    0.00718577  NaN NaN NaN NaN NaN 16  entropy NaN
18  RandomForestClassifier  0.113069    0.116479    0.122598    0.00433587  NaN NaN NaN NaN NaN 8   entropy NaN
4   ExtraTreesClassifier    0.055789    0.061911    0.0659497   0.0044019   20  2   100 NaN NaN NaN NaN NaN
6   ExtraTreesClassifier    0.0541574   0.0593924   0.0629669   0.0037833   20  20  100 NaN NaN NaN NaN NaN
5   ExtraTreesClassifier    0.0566628   0.0592174   0.0622444   0.00230301  20  2   150 NaN NaN NaN NaN NaN
7   ExtraTreesClassifier    0.0563154   0.0586747   0.0614659   0.00212476  20  20  150 NaN NaN NaN NaN NaN

Но у меня есть две проблемы:

1) Появился NaN, как я могу показать только данные, которые не показывают NaN?

2) Как я могу показать счет Жакара вместо среднего значения?

Я не очень знаком с Python, так как я хотел бы иметь возможность изменить код соответствующим образом для моих целей выше .

спасибо за помощь!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...