简体   繁体   中英

Getting a 100% Training Accuracy, but 60% Testing accuracy

I am trying different classifiers with different parameters and stuff on a dataset provided to us as part of a course project. We have to try and get the best performance on the dataset. The dataset is actually a reduced version of the online news popularity

I have tried the SVM, Random Forest, SVM with cross-validation with k = 5 and they all seem to give approximately 100% training accuracy, while the testing accuracy is between 60-70. I think the testing accuracy is fine, but the training accuracy bothers me. I would say maybe it was a case of overfitting data but none of my classmates seem to be getting similar results so maybe the problem is with my code.

Here is the code for my cross-validation and random forest classifier. I would be very grateful if you help me find out why I am getting such a high Training accuracy

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))

There are two issues about the problem, training accuracy and testing accuracy are significantly different.

  1. Different distribution of training data and testing data.(because of selecting a part of the dataset)
  2. Overfitting of the model to the training data.

Since you apply cross-validation, it seems that you should think about another solution. I recommend that you apply some feature selection or feature reduction (like PCA) approaches to tackle the overfitting problem.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM