В то время как ответ @NicolasGervais доходит до сути вопроса, почему ваша конкретная c модель переоснащается, я думаю, что существует концептуальное недопонимание в отношении перекрестной проверки в исходном вопросе:
Перекрестная проверка является метод, который улучшает производительность модели машинного обучения.
Это не случай.
Перекрестная проверка - это метод, который используется для оценки производительности данной модели на невидимых данных. Само по себе это не может улучшить точность. Другими словами, соответствующие оценки могут сказать вам, соответствует ли ваша модель данным обучения, но простое применение перекрестной проверки не делает вашу модель лучше.
Пример. Давайте рассмотрим набор данных с 10 точками и проведем через него линию:
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
X = np.random.randint(0,10,10)
Y = np.random.randint(0,10,10)
fig = plt.figure(figsize=(1,10))
def line(x, slope, intercept):
return slope * x + intercept
for i in range(5):
# note that this is not technically 5-fold cross-validation
# because I allow the same datapoint to go into the test set
# several times. For illustrative purposes it is fine imho.
test_indices = np.random.choice(np.arange(10),2)
train_indices = list(set(range(10))-set(test_indices))
# get train and test sets
X_train, Y_train = X[train_indices], Y[train_indices]
X_test, Y_test = X[test_indices], Y[test_indices]
# training set has one feature and multiple entries
# so, reshape(-1,1)
X_train, Y_train, X_test, Y_test = X_train.reshape(-1,1), Y_train.reshape(-1,1), X_test.reshape(-1,1), Y_test.reshape(-1,1)
# fit and evaluate linear regression
reg = LinearRegression().fit(X_train, Y_train)
score_train = reg.score(X_train, Y_train)
score_test = reg.score(X_test, Y_test)
# extract coefficients from model:
slope, intercept = reg.coef_[0], reg.intercept_[0]
print(score_test)
# show train and test sets
plt.subplot(5,1,i+1)
plt.scatter(X_train, Y_train, c='k')
plt.scatter(X_test, Y_test, c='r')
# draw regression line
plt.plot(np.arange(10), line(np.arange(10), slope, intercept))
plt.ylim(0,10)
plt.xlim(0,10)
plt.title('train: {:.2f} test: {:.2f}'.format(score_train, score_test))
![enter image description here](https://i.stack.imgur.com/4rq9p.png)
Вы можете Обратите внимание, что оценки на тренировках и тестах очень разные. Вы также можете видеть, что расчетные параметры меняются много с изменением поезда и набора тестов.
Это не делает вашу линейную модель лучше. Но теперь вы точно знаете, насколько это плохо:)