获得100%的训练准确度,但60%的测试准确度

时间:2018-04-28 03:16:25

标签: python machine-learning scikit-learn

我正在尝试使用不同参数的不同分类器和作为课程项目一部分提供给我们的数据集。我们必须尝试在数据集上获得最佳性能。数据集实际上是online news popularity

的简化版本

我已经尝试过SVM,随机森林,SVM,交叉验证k = 5,它们似乎都提供了大约100%的训练精度,而测试精度在60-70之间。我认为测试的准确性很好,但训练准确性困扰我。 我想也许这是一个过度拟合数据的案例,但我的同学似乎没有得到类似的结果,所以问题可能在于我的代码。

以下是我的交叉验证和随机森林分类器的代码。如果你能帮助我找出为什么我能获得如此高的训练准确度,我将非常感激

def crossValidation(X_train, X_test, y_train, y_test, numSplits):
    skf = StratifiedKFold(n_splits=5, shuffle=True)
    Cs = np.logspace(-3, 3, 10)
    gammas = np.logspace(-3, 3, 10)

    ACC = np.zeros((10, 10))
    DEV = np.zeros((10, 10))

    for i, gamma in enumerate(gammas):
        for j, C in enumerate(Cs):
            acc = []
            for train_index, dev_index in skf.split(X_train, y_train):
                X_cv_train, X_cv_dev = X_train[train_index], X_train[dev_index]
                y_cv_train, y_cv_dev = y_train[train_index], y_train[dev_index]
                clf = SVC(C=C, kernel='rbf', gamma=gamma, )
                clf.fit(X_cv_train, y_cv_train)
                acc.append(accuracy_score(y_cv_dev, clf.predict(X_cv_dev)))

            ACC[i, j] = np.mean(acc)
            DEV[i, j] = np.std(acc)

    i, j = np.argwhere(ACC == np.max(ACC))[0]
    clf1 = SVC(C=Cs[j], kernel='rbf', gamma=gammas[i], decision_function_shape='ovr')
    clf1.fit(X_train, y_train)
    y_predict_train = clf1.predict(X_train)
    y_pred_test = clf1.predict(X_test)
    print("Train Accuracy :: ", accuracy_score(y_train, y_predict_train))
    print("Test Accuracy  :: ", accuracy_score(y_test, y_pred_test))


def randomForestClassifier(X_train, X_test, y_train, y_test):
    """

    clf = RandomForestClassifier()
    clf.fit(X_train, y_train)
    y_predict_train = clf.predict(X_train)
    y_pred_test = clf.predict(X_test)
    print("Train Accuracy :: ", accuracy_score(y_train, y_predict_train))
    print("Test Accuracy  :: ", accuracy_score(y_test, y_pred_test))

1 个答案:

答案 0 :(得分:0)

关于这个问题有两个问题,培训准确性和测试准确性有很大差异。

  1. 训练数据和测试数据的不同分布(因为选择了数据集的一部分)
  2. 将模型过度拟合到训练数据。
  3. 由于您应用交叉验证,您似乎应该考虑另一种解决方案。 我建议您应用一些功能选择或功能缩减(如PCA)方法来解决过度拟合问题。