0

我想做什么;获取 SVM 的 K 倍交叉验证分数。数据具有所有数值自变量和分类因变量。我使用 python3、sklearn 和特征引擎。

我对此事的理解;

自变量具有 NA 值,它们都低于总数据点的 5%,因此我使用训练集中的中值估算它们,因为变量不是正态分布的。我还使用测试集的值缩放了训练集和测试集的值。我的训练测试拆分为 80-20。

我知道仅使用训练集来缩放和估算数据是一种很好的做法。因为这有助于避免过度拟合和数据泄漏。

当谈到 Kfold 交叉验证时,训练集和测试集会发生变化。

问题;

有没有办法确保我可以根据每个折叠的训练集重新估算和重新缩放训练集和测试集?

任何帮助表示赞赏,谢谢!

使用随机种子进行训练测试拆分。K-Fold 交叉验证中使用相同的随机种子。

from sklearn.model_selection import train_test_split 
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2, random_state = 3)

NA值估算;

from feature_engine import missing_data_imputers as mdi
imputer = mdi.MeanMedianImputer(imputation_method = 'median')
imputer.fit(X_train)
X_train = imputer.transform(X_train)

变量变换;

from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
scaler.fit(X_train)
X_train_trans = scaler.transform(X_train)
X_test_trans = scaler.transform(X_test)

下面是支持向量机;

def svm1(gam, C):
clf1 = svm.SVC(gamma=gam, C=C)    
clf1.fit(X_train_trans, y_train)
print('The Trainset Score is {}.'.format(clf1.score(X_train_trans , y_train)))
print('The Testset Score is {}.'.format(clf1.score(X_test_trans , y_test)))
print('')

y_pred1 = clf1.predict(X_test_trans)
print('The confusin matrix is; \n{}'.format(metrics.confusion_matrix(y_test , y_pred1)))

interactive(svm1, gam = G1, C = cc1)

然后我合并训练集和测试集,以获取转换后的数据集;

frames3 = [X_test_trans, X_train_trans ]
X_Final = pd.concat(frames3)

现在我拟合 X_Final,它是连接的训练和测试集,以获得 K-fold 交叉验证分数。

kfold = KFold(n_splits = 10, random_state = 3)
model = svm.SVC(gamma=0.23, C=3.20)
results = cross_val_score(model, PCA_X_Final,y_Final, cv = kfold)
print(results)
print('Accuracy = {}%, Standard Deviation = {}%'.format(round(results.mean(), 4), round(results.std(), 2)))

我想知道如何重新缩放和重新估算每个折叠,以便重新缩放变量,并使用训练集在每个折叠中重新估算 NA 值以避免过度拟合/数据泄漏

4

1 回答 1

0

要使用从 CV 中每个折叠派生的参数来估算和缩放数据,您首先需要在管道中建立工程步骤,然后在整个管道上执行 CV。例如这样的:

设置工程管道:

my_pipe = Pipeline([
    # missing data imputation
    ('imputer_num',
     mdi.MeanMedianImputer(imputation_method='mean', variables=['varA', 'varB'])),

    # scaler
    ('scaler', StandardScaler()), 

    # Gradient Boosted machine (or your SVM instead)
    ('gbm', GradientBoostingClassifier(random_state=0))
])

然后是简历:

param_grid = {    
    # try different gradient boosted tree model parameters
    'gbm__max_depth': [None, 1, 3],
}


# now we set up the grid search with cross-validation
grid_search = GridSearchCV(my_pipe, param_grid,
                           cv=5, n_jobs=-1, scoring='roc_auc')

此笔记本中的更多详细信息。

于 2021-08-30T13:09:55.970 回答