Вы пытаетесь нарезать кадр данных pandas с float
, так как следующие операции генерируют нецелые значения для размера данных обучения, проверки и проверки:
train_size = float(len(all_x)*0.7)
valid_size = float(len(all_x)*0.2)
test_size = float(len(x_prime)*0.1)
Обратите внимание, что ваше разделениенеправильно;Ваш обучающий набор включает в себя все точки данных наборов проверки и тестирования, в то время как ваш набор проверки содержит все экземпляры набора испытаний.Кроме того, вы никогда не должны полагаться на разбиения, которые не перемешивают ваш набор данных.Следующая функция должна помочь вам.
import numpy as np
import pandas as pd
def train_valid_test(df, train_split=.7, valid_split=.2, seed=None):
np.random.seed(seed)
perm = np.random.permutation(df.index)
training_max_index = int(train_split * len(df.index))
validate_max_index = int(valid_split * len(df.index)) + training_max_index
training = df.ix[perm[:training_max_index]]
validation = df.ix[perm[training_max_index:validate_max_index]]
test = df.ix[perm[validate_max_index:]]
return training, validation, test
Если вы хотите передать зависимые (y
) и независимые (x
) переменные по отдельности, вы можете использовать следующую функцию:
import numpy as np
import pandas as pd
def train_valid_test(x_data, y_data, train_split=.7, valid_split=.2, seed=None):
if len(x_data.index) != len(y_data.index):
raise Exception('x_data and y_data must contain the same number of data points'
np.random.seed(seed)
perm = np.random.permutation(x_data.index)
x_data = x_data.reindex(perm)
y_data = y_data.reindex(perm)
training_max_index = int(train_split * len(x_data.index))
validate_max_index = int(valid_split * len(x_data.index)) + training_max_index
X_train, y_train = x_data[:training_max_index], y_data[:training_max_index]
X_valid, y_valid = x_data[:validate_max_index], y_data[:validate_max_index]
X_test, y_test = x_data[validate_max_index:], y_data[validate_max_index:]
return X_train, X_valid, X_test, y_train, y_valid, y_test