Я использовал этот фрагмент кода для построения кадра данных результатов 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, так как я хотел бы иметь возможность изменить код соответствующим образом для моих целей выше .
спасибо за помощь!