【问题标题】:TypeError: Level type mismatch: 0.2. When splitting data into training, validating and testing setsTypeError:级别类型不匹配:0.2。将数据拆分为训练、验证和测试集时
【发布时间】:2019-07-25 06:37:53
【问题描述】:

美好的一天,

我正在尝试在不使用 scikit-learn 的情况下训练、验证和测试数据。 我希望将数据拆分为以下样本:

  • 训练数据 0.7(70%)
  • 验证数据 0.2(20%)
  • 测试数据 0.1(10%)

但是,当我尝试拆分数据时,出现以下错误:

 TypeError: Level type mismatch: 6.0

我需要帮助来了解我在这里做错了什么。样本数据和目标数据分别是 x_data 是一个数据框和 y_data 一个 Pandas 系列。这是我在下面尝试的代码:

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

【问题讨论】:

    标签: python pandas machine-learning cross-validation


    【解决方案1】:

    您正在尝试使用 float 对 pandas 数据帧进行切片,因为以下操作会为训练、验证和测试数据的大小生成非整数值:

    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
    

    【讨论】:

    • 谢谢!只需澄清一个问题。我使用了变量 test size 而你没有。不需要吗?还是validate_max_index 在您的示例中考虑了测试大小?
    • @DeepakM 测试集包括所有未包含在训练和验证集中的剩余数据点。只要知道验证集的最大索引,就不需要明确计算大小。为了构建测试集,您只需要从“validate_max_index”开始获取数据点。
    • 谢谢。是的,我将您的答案标记为该问题的解决方案。最后一个问题。供将来参考如果我必须明确显示/计算test_size。怎么做?
    • test_size = int((1 - train_split - valid_split) * len(x_data.index)) + validate_max_index
    【解决方案2】:

    索引必须是整数。可以试试:

        train_size = int(len(all_x)*0.7)
        valid_size = int(len(all_x)*0.2)
        test_size = int(len(x_prime)*0.1)
    

    【讨论】:

      猜你喜欢
      • 2019-05-01
      • 2021-01-19
      • 2013-09-27
      • 2018-11-19
      • 2021-04-19
      • 2021-05-08
      • 2016-07-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多