정확도, 정밀도, 회수율 및 다른 메트릭을 계산하기 위해 교차 검증 단계마다 견적기를 한 번만 피팅하면 다음 코드를 사용할 수 있습니다.
def get_true_and_pred_CV(estimator, X, y, n_folds, cv, params):
ys = []
for train_idx, valid_idx in cv:
clf = estimator(**params)
if isinstance(X, np.ndarray):
clf.fit(X[train_idx], y[train_idx])
cur_pred = clf.predict(X[valid_idx])
elif isinstance(X, pd.DataFrame):
clf.fit(X.iloc[train_idx, :], y[train_idx])
cur_pred = clf.predict(X.iloc[valid_idx, :])
else:
raise Exception('Only numpy array and pandas DataFrame ' \
'as types of X are supported')
ys.append((y[valid_idx], cur_pred))
return ys
def fit_and_score_CV(estimator, X, y, n_folds=10, stratify=True, **params):
if not stratify:
cv_arg = sklearn.cross_validation.KFold(y.size, n_folds)
else:
cv_arg = sklearn.cross_validation.StratifiedKFold(y, n_folds)
ys = get_true_and_pred_CV(estimator, X, y, n_folds, cv_arg, params)
cv_acc = map(lambda tp: sklearn.metrics.accuracy_score(tp[0], tp[1]), ys)
cv_pr_weighted = map(lambda tp: sklearn.metrics.precision_score(tp[0], tp[1], average='weighted'), ys)
cv_rec_weighted = map(lambda tp: sklearn.metrics.recall_score(tp[0], tp[1], average='weighted'), ys)
cv_f1_weighted = map(lambda tp: sklearn.metrics.f1_score(tp[0], tp[1], average='weighted'), ys)
# the approach below makes estimator fit multiple times
#cv_acc = sklearn.cross_validation.cross_val_score(algo, X, y, cv=cv_arg, scoring='accuracy')
#cv_pr_weighted = sklearn.cross_validation.cross_val_score(algo, X, y, cv=cv_arg, scoring='precision_weighted')
#cv_rec_weighted = sklearn.cross_validation.cross_val_score(algo, X, y, cv=cv_arg, scoring='recall_weighted')
#cv_f1_weighted = sklearn.cross_validation.cross_val_score(algo, X, y, cv=cv_arg, scoring='f1_weighted')
return {'CV accuracy': np.mean(cv_acc), 'CV precision_weighted': np.mean(cv_pr_weighted),
'CV recall_weighted': np.mean(cv_rec_weighted), 'CV F1_weighted': np.mean(cv_f1_weighted)}
종종 cross_val_score 대신이 함수를 사용하여 여러 통계를 모두 계산합니다. 원하는대로 품질 메트릭을 변경할 수 있습니다.
'classification_report'를 사용하는 것이 잘못된 이유는 무엇입니까? http://scikit-learn.org/stable/modules/generated/sklearn.metrics.classification_report.html#sklearn.metrics.classification_report – EdChum
기본적으로 'cross_val_score'의 본질을 취하여이를 귀하의 경우에 적용했습니다. 이것은 완벽하게 실행 가능한 옵션처럼 보입니다. 더 나은 방법을 찾지 못합니다. sklearn 코드를 수정하려는 경우를 대비하여 문제에 대한 설명과 해결 방법에 대한 내 대답을 참조하십시오. – eickenberg
@EdChum 이것은 교차 유효성 검사를 수행하지 않습니다. 단일 사전 훈련 단계를 기반으로 모델의 성능을 측정합니다. – Dror