【问题标题】:scikit-learn cross_validation over-fitting or under-fittingscikit-learn cross_validation 过拟合或欠拟合
【发布时间】:2013-12-19 21:31:43
【问题描述】:

我正在使用 scikit-learn cross_validation(http://scikit-learn.org/stable/modules/cross_validation.html) 并获得例如 0.82 平均分数 (r2_scorer)。 使用 scikit-learn 函数我怎么知道我是过拟合还是欠拟合?

【问题讨论】:

    标签: scikit-learn


    【解决方案1】:

    很遗憾,我确认没有内置工具来比较 CV 设置中的训练和测试分数。 cross_val_score 工具只报告考试成绩。

    您可以使用 Ando 的回答中的train_test_split 函数设置自己的循环,但您也可以使用任何其他 CV 方案。

    import numpy as np
    from sklearn.cross_validation import KFold
    from sklearn.metrics import SCORERS
    
    scorer = SCORERS['r2']
    cv = KFold(5)
    train_scores, test_scores = [], []
    for train, test in cv:
        regressor.fit(X[train], y[train])
        train_scores.append(scorer(regressor, X[train], y[train]))
        test_scores.append(scorer(regressor, X[test], y[test]))
    
    mean_train_score = np.mean(train_scores)
    mean_test_score = np.mean(test_scores)
    

    如果您使用交叉验证计算平均训练和测试分数,您可以确定您是否是:

    • 欠拟合:训练分数远未达到完美分数(r2 为 1.0)
    • 过拟合:训练和测试分数相差不大(平均测试分数明显低于平均训练分数)。

    注意:如果您的模型不充分且数据过于嘈杂,您可能会同时出现严重欠拟合和过拟合。

    【讨论】:

    • 感谢您的澄清
    【解决方案2】:

    在对训练数据和测试数据进行测试时,您应该比较您的分数。如果分数接近相等,则您可能欠拟合。如果它们相距很远,您可能会过度拟合(除非使用随机森林等方法)。

    要计算训练数据和测试数据的分数,您可以使用以下方法(假设您的数据位于变量 X 和 Y 中):

    from sklearn import cross_validation
    
    #do five iterations
    for i in range(5):
    
        X_train, X_test, y_train, y_test = cross_validation.train_test_split(X, Y, test_size=0.4)
        #Your predictor, linear SVM in this example
        clf = svm.SVC(kernel='linear', C=1).fit(X_train, y_train)
    
        print "Test score", clf.score(X_test, y_test)   
        print "Train score", clf.score(X_train, y_train)   
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-03-25
      • 2019-02-10
      • 1970-01-01
      • 2019-07-03
      • 2021-05-09
      • 2016-04-22
      • 2018-05-26
      相关资源
      最近更新 更多