K-кратные перекрестные проверки - PullRequest
0 голосов
/ 14 сентября 2018

Я пытаюсь выполнить K-Fold Cross Validation и GridSearchCV, чтобы оптимизировать мою модель Gradient Boost - по ссылке - https://www.analyticsvidhya.com/blog/2016/02/complete-guide-parameter-tuning-gradient-boosting-gbm-python/

У меня есть несколько вопросов относительно скриншота модельного отчетаниже:

1) Как рассчитывается точность 0.814365?Где в сценарии выполняется разделение теста поезда?Если вы измените cv_folds = 5 на cv_folds = любое целое число, то точность все равно будет 0,814365.Infact, удаление cv_folds и ввод executeCV = False также дает ту же точность.

(Обратите внимание, что мой опыт обучения No CV 80/20 дает тест точности примерно 0,79-0,80)

2) Опять же, как рассчитывается оценка AUC (поезд)?И должен ли это быть РПЦ-АУК, а не АУК?Моя модель обучения SK дает AUC около 0,87.Как и точность, эта оценка кажется фиксированной.

3) Почему средняя оценка CV намного ниже, чем оценка AUC (Train)?Похоже, они оба используют roc_auc (моя модель sklearn дает 0,77 для ROC AUC)

df = pd.read_csv("123.csv")

target = 'APPROVED'  #item to predict
IDcol = 'ID'


def modelfit(alg, ddf, predictors, performCV=True, printFeatureImportance=True, cv_folds=5):
    #Fit the algorithm on the data
    alg.fit(ddf[predictors], ddf['APPROVED'])

    #Predict training set:
    ddf_predictions = alg.predict(ddf[predictors])
    ddf_predprob = alg.predict_proba(ddf[predictors])[:,1]

    #Perform cross-validation:
    if performCV:
        cv_score = cross_validation.cross_val_score(alg, ddf[predictors], ddf['APPROVED'], cv=cv_folds, scoring='roc_auc')

    #Print model report:
    print ("\nModel Report")
    print ("Accuracy : %f" % metrics.accuracy_score(ddf['APPROVED'].values, ddf_predictions))
    print ("AUC Score (Train): %f" % metrics.roc_auc_score(ddf['APPROVED'], ddf_predprob))

    if performCV:
        print ("CV Score : Mean - %.5g | Std - %.5g | Min - %.5g | Max - %.5g" % (npy.mean(cv_score),npy.std(cv_score),npy.min(cv_score),npy.max(cv_score)))

    #Print Feature Importance:
    if printFeatureImportance:
        feat_imp = pd.Series(alg.feature_importances_, predictors).sort_values(ascending=False)
        feat_imp.plot(kind='bar', title='Feature Importances')
        plt.ylabel('Feature Importance Score')


#Choose all predictors except target & IDcols
predictors = [x for x in df.columns if x not in [target, IDcol]]
gbm0 = GradientBoostingClassifier(random_state=10)
modelfit(gbm0, df, predictors)

1 Ответ

0 голосов
/ 14 сентября 2018

Основная причина, по которой ваш cv_score выглядит низким, состоит в том, что сравнение его с точностью обучения не является справедливым сравнением.Точность вашей тренировки рассчитывается с использованием тех же данных, которые использовались для подбора модели, тогда как cv_score - это средний балл из сгибов тестирования в рамках вашей перекрестной проверки.Как вы можете себе представить, модель будет лучше делать прогнозы, используя данные, на которых она уже была обучена, в отличие от необходимости делать прогнозы на основе новых данных, которых модель никогда раньше не видела.

Ваши accuracy_score и aucрасчеты кажутся фиксированными, потому что вы всегда используете одни и те же входные данные (ddf["APPROVED"], ddf_predictions и ddf_predprob) в расчетах.Секция performCV фактически не преобразует ни один из этих наборов данных, поэтому, если вы используете ту же модель, параметры модели и входные данные, вы получите те же прогнозы, что и в расчетах.

На основании ваших комментариев существует ряд причин, по которым точность cv_score может быть ниже, чем точность вашего полного комплекта для тестирования.Одной из основных причин является то, что вы позволяете своей модели получать доступ к большему количеству данных для обучения, когда вы используете полный набор тренировок, а не поднабор данных тренировки с каждым сгибом cv.Это особенно верно, если ваш размер данных не так уж велик.Если ваш набор данных невелик, тогда эти данные важнее при обучении и могут обеспечить лучшую производительность.

...