python中的Kfold交叉验证

时间:2019-12-11 12:37:27

标签: python-3.x scikit-learn k-fold

我想做什么? 获取SVM的K折交叉验证分数。数据具有所有数值自变量和分类因变量。我正在使用python3,sklearn和功能引擎。

我对此事的理解;

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

我知道,仅使用训练集缩放和估算数据是一种好习惯。这样可以避免过度拟合和数据泄漏。

涉及Kfold交叉验证时,训练和测试集会更改。

问题;

有没有一种方法可以确保我可以根据每次折叠的火车设置来重新估算和缩放火车和测试设置?

感谢您的帮助,谢谢!

使用随机种子对测试进行拆分。 K折交叉验证中使用了相同的随机种子。

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)

下面是SVM;

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倍交叉验证得分。

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值重新计算,以避免过度拟合/数据泄漏

0 个答案:

没有答案