Here's the code for the custom metric.
def min_recall_precision(y_true, y_pred):
recall = recall_score(y_true, y_pred)
precision = precision_score(y_true, y_pred)
return min(recall, precision)
Here's the code for the train set performance chart.
from sklearn.model_selection import GridSearchCV
grid = GridSearchCV(
estimator=LogisticRegression(max_iter=1000),
scoring={'precision': make_scorer(precision_score),
'recall': make_scorer(recall_score),
'min_both': make_scorer(min_recall_precision)},
param_grid={'class_weight': [{0: 1, 1: v} for v in range(1, 4)]},
refit='precision',
return_train_score=True,
cv=10,
n_jobs=-1
)
grid.fit(X, y);
To plot it all you need this code.
plt.figure(figsize=(12, 4))
df_results = pd.DataFrame(grid.cv_results_)
for score in ['mean_train_recall', 'mean_train_precision', 'mean_test_min_both']:
plt.scatter(x=[_[1] for _ in df_results['param_class_weight']],
y=df_results[score.replace('test', 'train')],
label=score)
plt.legend();