Ошибка типа: несоответствие типов уровня: 0,2.При разделении данных на обучающие, проверочные и тестовые наборы - PullRequest
0 голосов
/ 04 марта 2019

добрый день,

Я пытаюсь обучать, проверять и тестировать данные без использования scikit-learn.Я хочу разбить данные на следующие образцы:

  • данные обучения 0,7 (70%)
  • данные проверки 0,2 (20%)
  • данные тестирования 0,1 (10%)

Однако, когда я пытаюсь разделить данные, я получаю следующую ошибку:

 TypeError: Level type mismatch: 6.0

Мне нужна помощь, чтобы понять, что я здесь делаю неправильно.Типовые данные и целевые данные представляют собой x_data, который представляет собой фрейм данных, и y_data, соответственно, ряд Панд.Вот код, который я попробовал ниже:

def train_valid_test(x_data y_data, train_split, valid_split, test_split):

    """ Parameters
    x_data: the input data
    y_data: target values 
    train_split: the portion used for training data 
    valid_split: the portion used for validating data
    test_split: the portion used for testing data 
    """ 

    # setting sizes to split the data into training validating and testing samples accordingly 
    train_size = float(len(all_x)*0.7)
    valid_size = float(len(all_x)*0.2)
    test_size = float(len(x_prime)*0.1)

    # Creating Training and Validation sets
    x_train, x_prime = x_data[:valid_size], x_data[valid_size:]
    y_train, y_prime = y_data[:valid_size], y_data[valid_size:]

    # Creating test sets
    x_valid, x_test = x_prime[:test_size], x_prime[test_size:]
    y_valid, y_test = y_prime[:test_size], y_prime[test_size:]


    # Return the samples 
    return X_train, X_valid, X_test, y_train, y_valid, y_test

Ответы [ 2 ]

0 голосов
/ 04 марта 2019

Индексы должны быть целыми.Можно попробовать:

    train_size = int(len(all_x)*0.7)
    valid_size = int(len(all_x)*0.2)
    test_size = int(len(x_prime)*0.1)
0 голосов
/ 04 марта 2019

Вы пытаетесь нарезать кадр данных 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
...