我在代码中使用了train_test_split,然后想改用交叉验证,但发生了奇怪的事情。
train, test = train_test_split(data, test_size=0)x_train = train.drop('CRO', axis=1)y_train = train['CRO']scaler = MinMaxScaler(feature_range=(0, 1))x_train_scaled = scaler.fit_transform(x_train)x_train = pd.DataFrame(x_train_scaled)for k in range(1, 5): knn = neighbors.KNeighborsRegressor(n_neighbors=k, weights='uniform') scores = model_selection.cross_val_score(knn, x_train, y_train, cv=5) print(scores.mean(), 'score for k = ', k)
这段代码给出的分数大约是0.8,但是当我删除第一行,并在第二行和第三行将’train’集合改为’data’集合时,分数变为0.2,这很奇怪,因为我甚至将test_size设置为0,所以训练集应该等于整个数据集。发生了什么事?
回答:
需要注意的是train_test_split中传递的隐式参数。
默认情况下,shuffle=True
,这可能会通过打乱数据轻松地在训练数据中引入一些噪声,而不打乱数据直接传入可能引入模型中的其他模式。