Python 平均神经网络性能取决于KFold交叉验证中使用的折叠次数

Python 平均神经网络性能取决于KFold交叉验证中使用的折叠次数,python,tensorflow,keras,scikit-learn,k-fold,Python,Tensorflow,Keras,Scikit Learn,K Fold,这是我第一次将KFold与神经网络结合使用,我很难理解为什么性能会随着折叠次数的变化而显著变化 我担心我的代码有错误,可能我遗漏了什么。代码如下: import pandas as pd import numpy as np from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Dense, Activation, Dropout from tensorflow.keras.callb

这是我第一次将KFold与神经网络结合使用,我很难理解为什么性能会随着折叠次数的变化而显著变化

我担心我的代码有错误,可能我遗漏了什么。代码如下:

import pandas as pd
import numpy as np
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Activation, Dropout
from tensorflow.keras.callbacks import EarlyStopping
from tensorflow.keras.optimizers import Adam
from sklearn.model_selection import KFold
from sklearn.preprocessing import StandardScaler, MinMaxScaler
from sklearn.metrics import r2_score

df = pd.read_csv('../xxx/xxx')

X = df.drop('Dependent', axis=1).values
y = df['Dependent'].values

kf = KFold(n_splits=10, shuffle=True, random_state=101)

oos_y = []
oos_pred = []

fold = 0
for train, test in kf.split(X):
    fold+=1
    print(f'Fold #{fold}')
    
    X_train = X[train]
    y_train = y[train]
    X_test = X[test]
    y_test = y[test]
    
    scaler = MinMaxScaler()
    X_train = scaler.fit_transform(X_train)
    X_test = scaler.transform(X_test)
    
    model = Sequential()
    model.add(Dense(units=936, activation='relu'))
    model.add(Dropout(0.2))
    
    model.add(Dense(units=468, activation='relu'))
    model.add(Dropout(0.2))
    
    model.add(Dense(units=1))
    
    model.compile(loss='mse', optimizer='adam')
    
    early_stop = EarlyStopping(monitor='val_loss',
                          mode='min',
                          verbose=0,
                          patience=25)
    
    model.fit(X_train, y_train, 
              validation_data=(X_test, y_test),
              batch_size=128,
              verbose=0, 
              epochs=400,
             callbacks=[early_stop])
    
    pred = model.predict(X_test)
    
    oos_y.append(y_test)
    oos_pred.append(pred)
    
    score = r2_score(pred, y_test)
    print(f'Fold score (r2): {score}')
    
oos_y = np.concatenate(oos_y)
oos_pred = np.concatenate(oos_pred)
score = r2_score(oos_pred, oos_y)
print(f'Final, out of sample score (r2): {score}')
我运行了这段代码,拆分的数量分别为5、10、15、20、25和30,性能分别为:0.77、0.72、0.79、0.80、0.79和0.76。具体来说,在10倍时,性能似乎明显下降,这是令人困惑的,因为使用相同的分割和数据集检查不同的机器学习算法并没有再现这种趋势。如果有人能解释性能突然下降10倍,或者指出代码中的错误,我将不胜感激


大部分代码都是通过以下方式获得的:添加定标器,并在我自己身上提前停止。

如果你更仔细地观察交叉验证是什么,对于不同的k值会有不同的结果是正常的

特别是,如果您有100个数据点,10个折叠将使用90个元素创建折叠,用于训练,10个元素用于测试。 如果将折叠数更改为20,则测试零件将更小,而测试零件将更大,分别为95和5

考虑到这一点,平均精度会有所不同,因为您使用的数据本身的尺寸也在变化。 它们直接影响网络可用于培训的示例以及用于测试的示例数量

<> P>选择k值时应该考虑的一个因素是数据集的维数,对于一个大的数据集,你可以想到一个k>=10,但是记住这意味着你将使用少于10%作为每个集合的测试集。这可能导致对结果有效性的错误假设