Я пытаюсь реализовать свое понимание перекрестной проверки и 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)