【问题标题】:How to split datatable dataframe into train and test dataset in python如何在python中将数据表数据框拆分为训练和测试数据集
【发布时间】:2020-11-11 06:40:27
【问题描述】:

我正在使用datatable 数据框。如何将数据框拆分为训练和测试数据集?
与 pandas 数据框类似,我尝试使用 sklearn.model_selection 中的train_test_split(dt_df,classes),但它不起作用并且出现错误。

import datatable as dt
import numpy as np
from sklearn.model_selection import train_test_split

dt_df = dt.fread(csv_file_path)
classe = dt_df[:, "classe"])
del dt_df[:, "classe"])

X_train, X_test, y_train, y_test = train_test_split(dt_df, classe, test_size=test_size)

我收到以下错误:TypeError: Column selector must be an integer or a string, not

我尝试通过将数据框转换为 numpy 数组来解决方法:

classe = np.ravel(dt_df[:, "classe"])
dt_df = dt_df.to_numpy()

就像它一样工作,但是,我不知道是否有办法让train_test_split 像在熊猫数据框中一样正常工作。

编辑 1: csv 文件包含作为列的字符串,并且值是无符号整数。使用print(dt_df) 我们得到:

| CCC CCG CCU CCA CGC CGG CGU CGA CUC CUG … ---- + --- --- --- --- --- --- --- --- --- --- 0 | 0 0 0 0 2 0 1 0 0 1 … 1 | 0 0 0 0 1 0 2 1 0 1 … 2 | 0 0 0 1 1 0 1 0 1 2 … 3 | 0 0 0 1 1 0 1 0 1 2 … 4 | 0 0 0 1 1 0 1 0 1 2 … 5 | 0 0 0 1 1 0 1 0 1 2 … 6 | 0 0 0 1 0 0 3 0 0 2 … 7 | 0 0 0 1 1 0 0 0 1 2 … 8 | 0 0 0 1 1 0 1 0 1 2 … 9 | 0 0 1 0 1 0 1 0 1 3 … 10 | 0 0 1 0 1 0 1 0 1 3 … ...

感谢您的帮助。

【问题讨论】:

  • 添加样本数据可以让我们清楚地了解您希望在哪一列中创建 IV 和 DV
  • 感谢您的评论 :) ,csv 文件包含作为列字符串,并且值是无符号整数。

标签: python pandas dataframe train-test-split


【解决方案1】:

这是我仅使用 pandas 制作的一个简单函数。 sample 函数在测试集的数据框中随机且均匀地选择行(axis=0)。可以通过删除原始数据框中与测试集具有相同索引的行来选择训练集的行。

def train_test_split(df, frac=0.2):
    
    # get random sample 
    test = df.sample(frac=frac, axis=0)

    # get everything but the test sample
    train = df.drop(index=test.index)

    return train, test

【讨论】:

    【解决方案2】:

    我使用 sklearn.model_selection 中的train_test_split(dt_df,classes) 在 python 中将数据表数据框拆分为训练和测试数据集的解决方案是将数据表数据框转换为我在问题帖子中提到的 numpy,或者转换为 @ 评论的 pandas 数据框Manoor Hassan(往返):

    拆分方法前的源码:

    import datatable as dt
    import numpy as np
    from sklearn.model_selection import train_test_split
    from sklearn.ensemble import ExtraTreesClassifier
    
    dt_df = dt.fread(csv_file_path)
    
    classe = np.ravel(dt_df[:, "classe"])
    del dt_df[:, "classe"])
    

    拆分方法后的源码:

    ExTrCl = ExtraTreesClassifier()
    ExTrCl.fit(X_train, y_train)
    pred_test = ExTrCl.predict(X_test)
    

    方法一:转换为numpy

    # source code before split method
    
    dt_df = dt_df.to_numpy()
    
    X_train, X_test, y_train, y_test = train_test_split(dt_df, classe, test_size=test_size)
    
    # source code after split method
    

    方法2:转换为numpy,拆分后返回datatable数据框:

    # source code before split method
    
    dt_df = dt_df.to_numpy()
    
    X_train, X_test, y_train, y_test = train_test_split(dt_df, classe, test_size=test_size)
    
    X_train = dt.Frame(X_train)
    
    # source code after split method
    

    方法3:转换成pandas数据框

    # source code before split method
    
    dt_df = dt_df.to_pandas()
    
    X_train, X_test, y_train, y_test = train_test_split(dt_df, classe, test_size=test_size)
    
    # source code after split method
    

    这 3 种方法工作正常,但是对于大约 500 Mo 的 csv 文件,训练 (ExTrCl.fit) 和预测 (ExTrCl.predict) 的时间性能存在差异我有这些结果:

    T 转换 T.train T.pred M1 to_numpy 3 85 0.5 M2 to_numpy 并返回 3.5 29 0.5 M3 转熊猫 4 37 4

    【讨论】:

      【解决方案3】:

      我不知道可以拆分dt 的函数。但你可以我们

      dt_df = df.read_csv(csv_file_path)
      classe = dt_df[:, "classe"])
      del dt_df[:, "classe"])
      
      X_train, X_test, y_train, y_test = train_test_split(dt_df, classe, test_size=test_size)
      

      然后通过以下方式将DataFame 转换为DataTable

      X_train = dt.Frame(X_train)
      X_test = dt.Frame(X_test)
      

      【讨论】:

      • 感谢您的回复。实际上我必须使用 datatable 来加载 csv 文件而不是 panda read_csv,因为我处理的是大文件,其中 pandas read_csv 需要很多时间(例如 34 分钟),而 datatable fread() 只需要 40 秒。跨度>
      • 在两者之间来回转换会解决你的问题吗?使用 dataTable 进行加载,然后转换为 DF 进行拆分,然后返回
      • 是的,是的,现在我使用这样的解决方案,正如我在帖子中所说,我将数据表转换为 numpy 数组并且拆分工作正常。我现在的目标是搜索(当然如果存在的话)一种与 pandas 数据框类似的方式,直接无需转换。非常感谢您的帮助@Manoor Hassan
      猜你喜欢
      • 2019-05-01
      • 2019-06-30
      • 1970-01-01
      • 1970-01-01
      • 2018-10-13
      • 1970-01-01
      • 2010-11-25
      • 2017-02-20
      • 2019-12-15
      相关资源
      最近更新 更多