Train_test_split()を使用するときにデータの元のインデックスを取得するにはどうすればよいですか?
私が持っているのは以下です
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)
しかし、これは元のデータのインデックスを提供しません。回避策の1つは、インデックスをデータに追加し(例:data = [(i, d) for i, d in enumerate(data)]
)、それらをtrain_test_split
内に渡し、再度展開することです。よりクリーンなソリューションはありますか?
Scikit learnはPandasで非常によくプレイするので、使用することをお勧めします。以下に例を示します。
In [1]:
import pandas as pd
import numpy as np
from sklearn.model_selection 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
DataFrame/Seriesで任意のscikit関数を直接呼び出すことができ、機能します。
LogisticRegressionを実行したいと考えたとします。ここで、素敵な方法で係数を取得できます。
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が言ったようにpandasデータフレームまたはシリーズを使用できますが、自分自身をnumpyに制限したい場合は、追加のインデックスの配列を渡すことができます:
from sklearn.model_selection 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)
ここに最も簡単な解決策があります(別の答えではJibwaが複雑に見えました)。自分でインデックスを生成する必要はありません-ShuffleSplitオブジェクトを使用して1つのスプリットを生成します。
import numpy as np
from sklearn.model_selection import ShuffleSplit # or StratifiedShuffleSplit
sss = ShuffleSplit(n_splits=1, test_size=0.1)
data_size = 100
X = np.reshape(np.random.Rand(data_size*2),(data_size,2))
y = np.random.randint(2, size=data_size)
sss.get_n_splits(X, y)
train_index, test_index = next(sss.split(X, y))
X_train, X_test = X[train_index], X[test_index]
y_train, y_test = y[train_index], y[test_index]