我有一个数据帧df,看起来像这样。我正在尝试使用逻辑回归对此数据进行建模,其中特征(f1-f6)是二进制的,目标也是二进制的。
f1 f2 f3 f4 f5 f6 target
0 0 1 1 0 1 0
0 1 0 0 0 0 0
0 1 1 1 1 0 1
1 1 0 0 1 0 1 根据我的理解,分层的K折叠确保在训练集和测试集中有良好均匀的标签分布。但我希望确保每个功能的分布也是均匀的。
例如,我可以有一个交叉表的某个功能,如下所示:
target 0 1
f1
0 240 125
1 11 18正如您所看到的,f1为1有少量的出现,我希望确保它在测试和训练集中都合理地显示出来。我想要确保所有功能都是这样的。
我做了类似下面的事情(https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.StratifiedKFold.html)。但我认为这只会确保标签甚至没有考虑到功能不平衡。如何对数据进行交叉验证,以便在所有要素/标签上有一个合理均匀的分布?
import numpy as np
from sklearn.model_selection import StratifiedKFold
X = df[['f1','f2','f3','f4','f5','f6']]
y = df['target']
skf = StratifiedKFold(n_splits=2)
skf.get_n_splits(X, y)
StratifiedKFold(n_splits=5)
for train_index, test_index in skf.split(X, y):
X_train, X_test = X.iloc[train_index], X.iloc[test_index]
y_train, y_test = y.iloc[train_index], y.iloc[test_index]
]发布于 2020-06-25 11:50:09
我使用了Jason Brownlee,机器学习精通,解释并展示了一个很好的简单的工作示例:
from sklearn.model_selection import KFold
import pandas as pd
data = {'f1': [0,0,0,1],
'f2': [0,1,1,1],
'f3': [1,0,1,0],
'f4': [1,0,1,0],
'f5': [0,0,1,1],
'f6': [1,0,0,0],
'target': [0,0,1,1]}
df = pd.DataFrame(data, columns=['f1','f2','f3','f4','f5','f6','target'])
print(df)
kfold = KFold(3, True, 1)
for train, test in kfold.split(data):
print('train: %s, test: %s' % (train, test))
# scikit-learn k-fold cross-validation
from numpy import array
from sklearn.model_selection import KFold
# data sample
data = array([0, 0, 1, 1, 0, 1, 0])
# prepare cross validation
kfold = KFold(3, shuffle=True, random_state=1, )
# enumerate splits
for train, test in kfold.split(data):
print('train: %s, test: %s' % (data[train], data[test]))https://machinelearningmastery.com/k-fold-cross-validation/
以下是在Macbook Pro上使用Python3.8的PyCharm输出:

https://stackoverflow.com/questions/62415750
复制相似问题