Перекрестная проверка Sklearn дает результаты, отличные от ручного выполнения

Используя Sklearn, я провожу контролируемое обучение на Python с логистической регрессией. Я также использую перекрестную проверку, чтобы проверить точность прогнозов.

Я хотел проверить, есть ли у меня аналогичные результаты, когда я сам провожу перекрестную проверку. Вот результаты:

# X is my features. (m x p)
# y is labels. (m x 1)

# Using cross_validation.cross_val_score() function:
classifier = LogisticRegression()
scores1 = cross_validation.cross_val_score(classifier, X, y, cv=10)
print("Accuracy: %0.2f (+/- %0.2f)" % (scores1.mean(), scores1.std() * 2))

# Doing it "manual":
scores2 = np.array( [] )
classifier = LogisticRegression()
for i in range(10):
   X_train, X_test, y_train, y_test = cross_validation.train_test_split(X, y,
                                                    test_size=0.1, random_state=i)
   classifier.fit(X_train,y_train)
   score = classifier.score(X_test, y_test)
   scores2 = np.append(scores2, score)

print("Accuracy: %0.2f (+/- %0.2f)" % (scores2.mean(), scores2.std() * 2))

# This prints:
# Accuracy: 0.72 (+/- 0.47)
# Accuracy: 0.58 (+/- 0.52) 

У меня довольно большие X и Y. Так что я не ожидал большой разницы в результатах. Эта разница полностью связана с природой случайности процесса или я что-то упускаю в своем коде?

Вот страница документации для cross_validation.cross_val_score ():

http://scikit-learn.org/stable/modules/generated/sklearn.cross_validation.cross_val_score.html

Вот страница документации для cross_validation.train_test_split ():

http://scikit-learn.org/stable/modules/generated/sklearn.cross_validation.train_test_split.html


person Sait    schedule 24.03.2015    source источник


Ответы (1)


train_test_split использует рандомизированное разделение обучающего и тестового набора, а cross_val_score(cv=10) использует стратифицированную k-кратную перекрестную проверку.

Попробуйте использовать cv = ShuffleSplit (test_size = 0.1). Это должно дать вам более похожие результаты. Он не будет использовать то же случайное заполнение, что и вы, поэтому они все равно могут отличаться. Было бы странно, если бы они были вне друг друга.

person Andreas Mueller    schedule 24.03.2015