2016-12-12 3 views
1

Я реализовал модель с использованием дерева принятия решений с градиентом в качестве классификатора, и я построил кривые обучения для тренировочных и тестовых наборов, чтобы решить, что делать дальше, чтобы улучшить мою модель. В результате, как изображение: (. Ось Y является точностью (процент от правильного предсказания), а ось й числа выборок я использовать для обучения модели)Кривая обучения (высокая погрешность/высокая дисперсия), почему тестовая кривая обучения становится плоской.

enter image description here

Я понимаю, что разрыв между обучением и тестированием, вероятно, связано с высокой дисперсией (переобучением). Но изображение также показывает, что оценка теста (зеленая линия) очень мало увеличивается, в то время как количество образцов растет с 2000 до 3000. Кривая оценки тестирования становится плоской. Модель не становится лучше даже с большим количеством образцов.

Мое понимание заключается в том, что плоская кривая обучения обычно указывает на высокий уровень предвзятости (underfitting). Возможно ли, что в этой модели происходят как недоподготовка, так и переоснащение? Или есть другое объяснение плоской кривой?

Любая помощь будет оценена по достоинству. Заранее спасибо.

=====================================

код я использую следующим образом. Basic я использовать один и тот же код, как, например, в sklearn document

def plot_learning_curve(estimator, title, X, y, ylim=None, cv=None, 
        n_jobs=1, train_sizes=np.linspace(.1, 1.0, 5)): 
    plt.figure() 
    plt.title(title) 
    if ylim is not None: 
     plt.ylim(*ylim) 
    plt.xlabel("Training examples") 
    plt.ylabel("Score") 
    train_sizes, train_scores, test_scores = learning_curve(
     estimator, X, y, cv=cv, n_jobs=n_jobs, train_sizes=train_sizes) 
    train_scores_mean = np.mean(train_scores, axis=1) 
    train_scores_std = np.std(train_scores, axis=1) 
    test_scores_mean = np.mean(test_scores, axis=1) 
    test_scores_std = np.std(test_scores, axis=1) 
    plt.grid() 

    plt.fill_between(train_sizes, train_scores_mean - train_scores_std, 
        train_scores_mean + train_scores_std, alpha=0.1, 
        color="r") 
    plt.fill_between(train_sizes, test_scores_mean - test_scores_std, 
        test_scores_mean + test_scores_std, alpha=0.1, color="g") 
    plt.plot(train_sizes, train_scores_mean, 'o-', color="r", 
      label="Training score") 
    plt.plot(train_sizes, test_scores_mean, 'o-', color="g", 
      label="Cross-validation score") 

    plt.legend(loc="best") 
    return plt 

title = "Learning Curves (GBDT)" 
# Cross validation with 100 iterations to get smoother mean test and train 
# score curves, each time with 20% data randomly selected as a validation set. 
cv = ShuffleSplit(n_splits=100, test_size=0.2, random_state=0) 

estimator = GradientBoostingClassifier(n_estimators=450) 
X,y= features, target #features and target are already loaded 
plot_learning_curve(estimator, title, X, y, ylim=(0.6, 1.01), cv=cv, n_jobs=4) 

plt.show() 

ответ

-1

Вы должны уделять больше внимания вашей точности обучения. Если во время тренировки он снизился, вы сделали что-то ужасное. Проверьте правильность ваших данных (правильны ли ваши метки?) И ваша модель.

Как правило, точность поезда и испытания должна увеличиваться, но точность теста отстает.

+0

В кривой обучения (ось x - это количество предоставленных тренировок образцов) ожидается, что точность уменьшится с большим количеством выборок. –

+0

Этот парень имеет около 100% точности с самого начала, и он идет вниз с расширением # образцов от 500 до 1k. Если это ожидается - я не знаю, что сказать больше ... –

+0

Точно. Для кривых обучения все, что не начинается с 100% точности и идет вниз, указывает на наличие проблемы. –

0

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

Причиной разрыва между точностью обучения и точностью тестирования может быть различное распределение учебных образцов и образцов испытаний. Однако при перекрестной проверке это не должно происходить (вы делаете перекрестный валидацию k-fold, где вы переводите для каждой из k сгибов?)

+0

Я использовал перекрестную проверку shufflesplit (testsize = 0.2) в качестве кода, который я только что добавил. Я был бы очень признателен, если бы вы могли указать, есть ли ошибка в методе –

Смежные вопросы