Scikit-learn train de test split avec les indices

Comment puis-je obtenir les indices originaux des données en utilisant train_test_split()?

Ce que j'ai est le suivant

from sklearn.cross_validation import train_test_split
import numpy as np
data = np.reshape(np.randn(20),(10,2)) # 10 training examples
labels = np.random.randint(2, size=10) # 10 labels
x1, x2, y1, y2 = train_test_split(data, labels, size=0.2)

mais cela ne donne pas les indices des données originales. Une solution consiste à ajouter des indices aux données (par exemple data = [(i, d) for i, d in enumerate(data)]) et ensuite les passer à l'intérieur train_test_split et puis se développer à nouveau. Est-il une solution plus propre?

22
demandé sur CentAu 2015-07-20 19:03:19

3 réponses

Scikit learn joue très bien avec les Pandas, donc je vous suggère de l'utiliser. Voici un exemple:

In [1]: 
import pandas as pd
import numpy as np
from sklearn.cross_validation import train_test_split
data = np.reshape(np.random.randn(20),(10,2)) # 10 training examples
labels = np.random.randint(2, size=10) # 10 labels

In [2]: 
X = pd.DataFrame(data)
y = pd.Series(labels)

In [3]:
X_train, X_test, y_train, y_test = train_test_split(X, y, 
                                                    test_size=test_size, 
                                                    random_state=0)

In [4]: X_test
Out[4]:

     0       1
2   -1.39   -1.86
8    0.48   -0.81
4   -0.10   -1.83

In [5]: y_test
Out[5]:

2    1
8    1
4    1
dtype: int32

vous pouvez appeler directement n'importe quelle fonction scikit sur DataFrame/Series et cela fonctionnera.

disons que vous vouliez faire une Régressionlogistique, voici comment vous pourriez récupérer les coefficients d'une manière agréable:

In [6]: 
from sklearn.linear_model import LogisticRegression

model = linear_model.LogisticRegression()
model = model.fit(X_train, y_train)

# Retrieve coefficients: index is the feature name ([0,1] here)
df_coefs = pd.DataFrame(model.coef_[0], index=X.columns, columns = ['Coefficient'])
df_coefs
Out[6]:
    Coefficient
0   0.076987
1   -0.352463
23
répondu Julien Marrec 2015-07-20 17:00:03

Vous pouvez utiliser pandas dataframes ou séries comme Julien l'a dit Mais si vous voulez restreindre votre-self à numpy vous pouvez passer un tableau supplémentaire d'indices:

from sklearn.cross_validation import train_test_split
import numpy as np
n_samples, n_features, n_classes = 10, 2, 2
data = np.random.randn(n_samples, n_features)  # 10 training examples
labels = np.random.randint(n_classes, size=n_samples)  # 10 labels
indices = np.arange(n_samples)
x1, x2, y1, y2, idx1, idx2 = train_test_split(
    data, labels, indices, test_size=0.2)
48
répondu ogrisel 2017-12-15 15:11:53

docs mention train_test_split est juste une fonction de convenance sur le dessus de shuffle split.

j'ai juste réarrangé un peu de leur code pour faire mon propre exemple. Notez que la solution actuelle est le bloc central du code. Le reste est importé, et configuré pour un exemple exécutable.

from sklearn.model_selection import ShuffleSplit
from sklearn.utils import safe_indexing, indexable
from itertools import chain
import numpy as np
X = np.reshape(np.random.randn(20),(10,2)) # 10 training examples
y = np.random.randint(2, size=10) # 10 labels
seed = 1

cv = ShuffleSplit(random_state=seed, test_size=0.25)
arrays = indexable(X, y)
train, test = next(cv.split(X=X))
iterator = list(chain.from_iterable((
    safe_indexing(a, train),
    safe_indexing(a, test),
    train,
    test
    ) for a in arrays)
)
X_train, X_test, train_is, test_is, y_train, y_test, _, _  = iterator

print(X)
print(train_is)
print(X_train)

Maintenant, j'ai le réel index: train_is, test_is

1
répondu Jibwa 2018-04-17 23:01:20