我有一个不平衡的数据集,所以我有一个过采样策略,我只在训练数据时应用。我想使用像GridSearchCV
或cross_val_score
这样的scikit-learn类来探索或交叉验证估算器上的某些参数(例如SVC)。但是我看到你要么传递cv折叠数或标准交叉验证生成器。
我想创建一个自定义cv生成器,所以我得到并分层5折并仅过滤我的训练数据(4倍)并让scikit-learn通过我的估算器的参数网格和得分使用剩余的折叠用于验证。
提前致谢。
答案 0 :(得分:12)
交叉验证生成器返回一个长度为n_folds
的可迭代,其中每个元素都是一个2元组的numpy 1-d数组(train_index, test_index)
,包含测试和训练集的索引。交叉验证运行。
因此,对于10倍交叉验证,您的自定义交叉验证生成器需要包含10个元素,每个元素都包含一个包含两个元素的元组:
我正在研究一个类似的问题,我在其中为数据的不同折叠创建了整数标签。我的数据集存储在Pandas数据框myDf
中,该数据框具有交叉验证标签的列cvLabel
。我按如下方式构建自定义交叉验证生成器myCViterator
:
myCViterator = []
for i in range(nFolds):
trainIndices = myDf[ myDf['cvLabel']!=i ].index.values.astype(int)
testIndices = myDf[ myDf['cvLabel']==i ].index.values.astype(int)
myCViterator.append( (trainIndices, testIndices) )
答案 1 :(得分:8)
Scikit-Learn为此提供了一种解决方法,其标签为k-fold迭代器:
LabelKFold 是k-fold的变体,可确保同一标签不在测试和训练集中。这是必要的,例如,如果您从不同科目获得数据,并且您希望通过测试和培训不同科目来避免过度拟合(即,学习人员特定功能)。
要在过采样的情况下使用此迭代器,首先,您可以在数据框中创建一个列(例如UINavigationController
),该列存储每行的索引值。
cv_label
然后,您可以应用过采样,同时确保复制过采样中的df['cv_label'] = df.index
列。此列将包含过采样数据的重复值。您可以从这些标签创建单独的系列或列表,以便以后处理:
cv_label
请注意,在运行交叉验证器/分类器之前,您需要从数据框中删除此列。
将数据分成要素(不包括cv_labels = df['cv_label']
)和标签后,您可以创建cv_label
迭代器并运行所需的交叉验证功能:
LabelKFold
答案 2 :(得分:5)
我有一个类似的问题,这个快速的技巧对我有用:
class UpsampleStratifiedKFold:
def __init__(self, n_splits=3):
self.n_splits = n_splits
def split(self, X, y, groups=None):
for rx, tx in StratifiedKFold(n_splits=self.n_splits).split(X,y):
nix = np.where(y[rx]==0)[0]
pix = np.where(y[rx]==1)[0]
pixu = np.random.choice(pix, size=nix.shape[0], replace=True)
ix = np.append(nix, pixu)
rxm = rx[ix]
yield rxm, tx
def get_n_splits(self, X, y, groups=None):
return self.n_splits
这将对少数类进行上采样(并替换)以获得平衡的(k-1)
倍训练集,但使第k
个测试集不均衡。这似乎可以与sklearn.model_selection.GridSearchCV
以及需要CV生成器的其他类似类一起使用。
答案 3 :(得分:-1)
A-Z