Проблемы при реализации перекрестной проверки и RO C -кривой - PullRequest
0 голосов
/ 07 апреля 2020

Я пытаюсь реализовать свое понимание перекрестной проверки и RO C -кривой. Однако после выполнения вычислений я вижу, что точность равна 1 для каждого параметра и каждого набора проверки моих данных. Это pr c = [1] * 10. В то же время, отзыв меняется. Я изо всех сил пытаюсь понять причины такого поведения. Я думаю, что допустил ошибку в коде или мое понимание перекрестной проверки и RO C недостаточно хороши. (

Можете ли вы помочь мне понять причины проблемы в данном конкретном случае?
(Я не уверен, что это правильное место, чтобы задать вопрос, однако я задал его в https://stats.stackexchange.com/ и не получил ответа, так как уровень активности там, в целом, ниже, чем здесь. Я действительно хочу понять, правильно ли я это делаю или нет, поэтому я решил обратиться за помощью и здесь.)

Код указан ниже:

"""

@author: user13
"""

import numpy as np
import random
from sklearn.neighbors import KNeighborsClassifier
from sklearn import metrics
from sklearn import datasets

iris = datasets.load_iris()
X = iris.data[:, :2]
y = iris.target

# remove one class
X = X[y!=2]
y = y[y!=2]

N = len(X)
test_size = round(0.3*N) # let test size be 0.3 part of the whole data
train_size = N - test_size
print("Test size:", test_size, 
      "\nTraining size:", train_size)

random.seed(13)
idx = np.arange(N)
np.random.shuffle(idx)
X = X[idx]
y = y[idx]

x_test = X[:test_size]
x_train = X[train_size-1: N]
#print("X_train:", x_train,
#      "X_test:", x_test)

y_test = y[:test_size]
y_train = y[train_size-1: N]
#print("y_train:", y_train,
#      "y_test:", y_test)

def predict(clf, x_train, x_valid,
            y_train):
    clf.fit(x_train, y_train)
    return clf.predict(x_valid)

predicted_y = []
expected_y = []
M = len(x_train)
validate_size = round(M * 0.2) # validation set size is 
                                # 0.2 of training set size
prc = [] # precision
rcall = [] # recall

idx = np.arange(M)
K = 10 # 10-fold cross-validation
for i in range(K):
    np.random.shuffle(idx)
    x_train = x_train[idx]
    y_train = y_train[idx]
    x_training = x_train[: M-validate_size]
    x_validating = x_train[validate_size + 1: M]
    y_training = y_train[: M-validate_size]
    y_validating = y_train[validate_size + 1: M]

    clf = KNeighborsClassifier(n_neighbors=i+1)
    prd = predict(clf, x_training, x_validating,
            y_training)
    predicted_y.append(prd)
    expected_y.append(y_validating)
    cnf_mat = metrics.confusion_matrix(prd, y_validating)
    precision = cnf_mat[0][0]/(cnf_mat[0][0]+cnf_mat[0][1])
    prc.append(precision)
    recall = cnf_mat[0][0]/(cnf_mat[0][0]+cnf_mat[1][1])
    rcall.append(recall)

1 Ответ

0 голосов
/ 10 апреля 2020

Это может быть потому, что набор данных радужной оболочки очень прост. Вы пытались использовать другой набор данных?

...