2015-07-20 17 views
15

Train_test_split() kullanırken verilerin orijinal endekslerini nasıl edinebilirim?Scikit-learn train_test_split with endeksler

Ne var şu

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) 

olduğunu Fakat bu orijinal verilerin indeksleri vermez. Tek çözüm, verilere indeks eklemek (ör. data = [(i, d) for i, d in enumerate(data)]) ve daha sonra bunları train_test_split içine geçirip tekrar genişletmektir. Temiz bir çözüm var mı?

+0

de dikkat [sklearn.model_selection.ShuffleSplit] (http://scikit-learn.org/stable/modules/generated/sklearn.model_selection.ShuffleSplit. html) ve [sklearn.model_selection.StratifiedShuffleSplit] (http: // scikit-lear n.org/stable/modules/generated/sklearn.model_selection.StratifiedShuffleSplit.html). – Jost

cevap

16

Bilimkurgu, Panda'larla gerçekten iyi çalışmayı öğrenir, bu yüzden onu kullanmanızı öneririm. İşte bir örnek:

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 

doğrudan DataFrame/Series üzerinde herhangi scikit işlevlerini çağırabilir ve işe yarayacak.

burada güzel bir şekilde katsayıları almak nasıl, haydi bir lojistik regresyon yapmak istedim diyelim:

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 
Julien söylediği gibi Rapordan kısıtlamak istiyorsanız ama panda dataframes veya dizi kullanabilirsiniz
+0

Ayrıca, ya sorunuzdaki kodla ilgili bir sorununuz var gibi görünüyor ya da scikit ve numpy'nin kullanımdan kaldırılmış sürümlerini kullanıyor olabilirsiniz (np.randn benimki yok, ve 'test_size' kullanılıyor ve 'size' değil train_test_split) –

+2

Katsayıları, pandalar veri tabanından gelen özellik adlarıyla nasıl alacağınızı göstermek için cevabımı düzenledim. Gelecekte biraz zaman kazandırabilirim. –

+0

Merhaba @Julien Marrec Çözümünüzü uygulamayı denedim ama işe yaramadı, lütfen buradan kontrol edebilirsiniz https://stackoverflow.com/questions/48734942/how-to-maintain-the-x-axis-value-from- tren-test-split-ne zaman-komplo-y-tren – Victor

33

kendi kendine indisli ek dizisi iletebilir numpy için:

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) 
+1

Teşekkürler Ogrisel, bu yaklaşım çok basit ve yararlı. NumPt v1.1'den itibaren –

+0

, 3. satır 'data = np.reshape (np.random.randn (20), (10,2))' olmalıdır; son satır "... train_test_split (data, label, indices, test_size = 0.2)' dır. – pepe

+0

Teşekkürler, düzeltmeleri hesaba katmak için cevabımı düzenledim. – ogrisel