Превосходная точность с использованием стандартизированных данных pima indians dataset

Joe Smith спросил: 28 марта 2018 в 02:18 в: python

Я имею дело с странной производительностью, используя SVC классификатор в sklearn. Я решил использовать kfold cross validation в наборе данных pima indians. Поскольку я хотел попробовать SVC-классификатор, я нормализовал данные с помощью MinMaxScaler(feature_range=(0, 1)), чтобы получить значения функций от 0 до 1. Но когда я запускаю модель, я получаю 100% -ную точность в каждой складке, что, очевидно, невозможно. Я искал любую ошибку в коде, но не сталкивался с чем-то странным. Вот мой код. Любое предложение такого поведения?

PD: Я, очевидно, загружаю все библиотеки нуждающихся. Я загружаю набор данных здесь https://gist.github.com/ktisha/c21e73a1bd1700294ef790c56c8aec1f и анализирую его, чтобы упростить работу позже. Я пропустил шаг?

col_names = ['pregnant', 'glucose', 'bp', 'skin', 'insulin', 'bmi', 'pedigree', 'age', 'label']
pima = pd.read_csv("pima dataset.txt",names = col_names)
X = pima[col_names].as_matrix()
y = pima.label.as_matrix()
scaler = MinMaxScaler(feature_range=(0, 1))
rescaledX = scaler.fit_transform(X)
# summarize transformed data
np.set_printoptions(precision=3)
#check transformations
print(rescaledX[0:5,:])
X_train, X_test, y_train, y_test = train_test_split(rescaledX,y, test_size = 0.2, random_state =42)
from sklearn.svm import SVC
import random
clf_1 = SVC(random_state = 42) #create a default model
clf_1.fit(X_train, y_train) #fitting the model
r_svc = [random.randrange(1,1000) for i in range(3)] #create a random seed for the 3 simulations.
scores_matrix_clf_1 = []
for i in r_svc:
    kf = KFold(n_splits=10, shuffle = True, random_state = i) 
    kf.get_n_splits(X)
    scores = cross_val_score(clf_1, X_train, y_train, cv=kf, n_jobs=-1, scoring = "accuracy")
    print('          SCORES FOR EACH RANDOM THREE SEEDS',i)
    print('-----------------------------SCORES----------------------------------------')
    print(scores, scores.mean())
    scores_matrix_clf_1.append(scores)

Результат, который я получаю, следующий:

          SCORES FOR EACH RANDOM THREE SEEDS 617
-----------------------------SCORES----------------------------------------
[ 1.  1.  1.  1.  1.  1.  1.  1.  1.  1.] 1.0
          SCORES FOR EACH RANDOM THREE SEEDS 764
-----------------------------SCORES----------------------------------------
[ 1.  1.  1.  1.  1.  1.  1.  1.  1.  1.] 1.0
          SCORES FOR EACH RANDOM THREE SEEDS 395
-----------------------------SCORES----------------------------------------
[ 1.  1.  1.  1.  1.  1.  1.  1.  1.  1.] 1.0

1 ответ

Есть решение
MaxU ответил: 28 марта 2018 в 03:52

Ваш X (набор входных данных) содержит столбец label, который вы пытаетесь предсказать. Это называется утечкой данных и почти всегда приводит к 100% точности, потому что вы даете оценщику в одном столбце (функцию) ответ, который вы хотите предсказать.

Пример:

представьте, что у вас есть набор данных, содержащий следующие функции:

  • рост человека
  • вес человека
  • размер ноги человека

и вы хотите предсказать sex.

Так что если вы будете кормить height, weight, foot size и sex для вашей модели в качестве набора входных данных и sex (снова) в качестве выходного вектора, он распознает, что последняя функция sex имеет самый высокий коэффициент (вес), потому что он всегда "предсказывает" правильный пол.