我在python中有一个数据框,如下所示:
data labels group
aa 1 x
bb 1 x
cc 2 y
dd 1 y
ee 3 y
ff 3 x
gg 3 z
hh 1 z
ii 2 z
直接将其随机分为70:30进行训练和测试集。在这里,我需要分为测试和训练,以便每个group
中的70%的数据都应接受训练,而每个组中的30%的数据应作为测试数据。然后预测并找到每个组中测试数据的准确性。
我发现cross_val_score
使用以下函数进行拆分,拟合模型和预测:
>>> from sklearn.model_selection import cross_val_score
>>> model = LogisticRegression(random_state=0)
>>> scores = cross_val_score(model, data, labels, cv=5)
>>> scores
cross_val_score
的文档具有groups
参数,表示:
groups : array-like, with shape (n_samples,), optional
Group labels for the samples used while splitting the dataset into
train/test set.
在这里,我需要分为测试和训练两部分,以便每组中70%的数据应接受训练,而每组中30%的数据应作为测试数据。然后预测并找到每个组中测试数据的准确性。通过以下方式使用groups参数是否可以将每个组中的数据分为训练和测试数据并做出预测?
>>> scores = cross_val_score(model, data, labels, groups= group, cv=5)
感谢您的帮助。
答案 0 :(得分:1)
stratify
的{{1}}参数使用标签来对选择进行分层,以保持适当的类平衡。
train_test_split
在您的玩具数据集上,这似乎是您想要的,但是我会在完整的数据集上进行尝试,并通过检查火车和测试集中的数据计数来验证类是否平衡
答案 1 :(得分:0)
我无法直接从函数中得知,但是您可以apply
train_test_split
到组,然后使用pd.concat
将拆分连接起来,例如:
def train_test_split_group(x):
X_train, X_test, y_train, y_test = train_test_split(x['data'],x['labels'])
return pd.Series([X_train, X_test, y_train, y_test], index=['X_train', 'X_test', 'y_train', 'y_test'])
final = df.groupby('group').apply(train_test_split_group).apply(lambda x: pd.concat(x.tolist()))
final['X_train'].dropna()
1 bb
3 dd
4 ee
5 ff
6 gg
7 hh
Name: X_train, dtype: object
答案 2 :(得分:0)
要以这种方式指定训练集和验证集,您将需要创建一个交叉验证对象,并且不使用^[^-]+-([^.]+)[^\s]+ (.*)$
的{{1}}参数。诀窍是您要对折叠进行分层,而不是基于cv=5
中的类,而是基于另一列数据。我认为您可以像下面这样使用cross_val_score
。
y