如何在 python 中将数据表数据帧拆分为训练和测试数据集

How to split datatable dataframe into train and test dataset in python

我正在使用 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)

我收到以下错误:类型错误:列选择器必须是整数或字符串,而不是

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

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

就像它的工作原理一样,但是,我不知道是否有一种方法可以让 train_test_split 像在 pandas 数据帧中一样正常工作。

编辑 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  …  
      ...

谢谢你的帮助。

我不知道可以拆分的函数 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)

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

拆分方法前的源代码:

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并return返回datatable dataframe:

# 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种方法都很好,但是对于大约[=34的csv文件,训练(ExTrCl.fit)和预测(ExTrCl.predict)的时间性能存在差异=]500 Mo 我有这些结果:

                       T convert    T.train     T.pred
M1 to_numpy             3           85          0.5
M2 to_numpy and back    3.5         29          0.5
M3 to pandas            4           37          4

这是我仅使用 pandas 制作的一个简单函数。 sample 函数随机均匀地选择数据框中的行(轴=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