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?
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
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)
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