分组训练并按分组+ sklearn cross_val_score进行测试

时间:2018-11-07 19:07:45

标签: python scikit-learn

我在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)

感谢您的帮助。

3 个答案:

答案 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