web-dev-qa-db-fra.com

Comment obtenir un train_test_split non mélangé dans Sklearn

Si je veux un train/test fractionné au hasard, j'utilise la fonction d'assistance Sklearn:

In [1]: from sklearn.model_selection import train_test_split
   ...: train_test_split([1,2,3,4,5,6])
   ...:
Out[1]: [[1, 6, 4, 2], [5, 3]]

Quel est le moyen le plus concis d’obtenir un train/test divisé en deux parties, c’est-à-dire.

[[1,2,3,4], [5,6]]

EDIT J'utilise actuellement

train, test = data[:int(len(data) * 0.75)], data[int(len(data) * 0.75):] 

mais en espérant quelque chose d'un peu plus agréable. J'ai ouvert un numéro sur sklearn https://github.com/scikit-learn/scikit-learn/issues/8844

EDIT 2: Mon RP a été fusionné. Dans scikit-learn version 0.19, vous pouvez passer le paramètre shuffle=False à train_test_split pour obtenir un fractionnement non brassé.

7
maxymoo

J'ajoute peu à la réponse de Psidom, si ce n'est une fonction de copier-coller facile à copier:

def non_shuffling_train_test_split(X, y, test_size=0.2):
    i = int((1 - test_size) * X.shape[0]) + 1
    X_train, X_test = np.split(X, [i])
    y_train, y_test = np.split(y, [i])
    return X_train, X_test, y_train, y_test

Mise à jour: À un moment donné, cette fonctionnalité est devenue intégrée, vous pouvez donc faire:

from sklearn.model_selection import train_test_split
train_test_split(X, y, test_size=0.2, shuffle=False)
7
Anake

Utilisez numpy.split:

import numpy as np
data = np.array([1,2,3,4,5,6])

np.split(data, [4])           # modify the index here to specify where to split the array
# [array([1, 2, 3, 4]), array([5, 6])]

Si vous souhaitez scinder un pourcentage, vous pouvez calculer l’indice de scission à partir de la forme de data :

data = np.array([1,2,3,4,5,6])
p = 0.6

idx = int(p * data.shape[0]) + 1      # since the percentage may end up to be a fractional 
                                      # number, modify this as you need, usually shouldn't
                                      # affect much if data is large
np.split(data, [idx])
# [array([1, 2, 3, 4]), array([5, 6])]
3
Psidom

Tout ce que vous avez à faire est de définir le paramètre shuffle sur False et de stratifier le paramètre sur None:

    In [49]: train_test_split([1,2,3,4,5,6],shuffle = False, stratify = None)
    Out[49]: [[1, 2, 3, 4], [5, 6]]
2
Mayank R