代码之家  ›  专栏  ›  技术社区  ›  ScalaBoy

如何根据一些准则将数据集拆分为子集?

  •  1
  • ScalaBoy  · 技术社区  · 6 年前

    虽然我使用机器学习相关术语,但我的问题是100%的工程主题,与统计和数学无关。因此,我在这个论坛中提问,而不是交叉验证。

    这是我用来评论问题的示例数据:

    X = pd.DataFrame(columns=["F1","F2"], 
                      data=[[23,0.8],
                            [11,5.35],
                            [24,19.18],
                            [15,10.25],
                            [10,11.30],
                            [55,44.85],
                            [15,33.88],
                            [12,45.30],
                            [14,22.20],
                            [15,15.80],
                            [83,0.8],
                            [51,5.35],
                            [34,30.28],
                            [35,15.25],
                            [60,13.30],
                            [75,44.80],
                            [35,30.77],
                            [62,40.33],
                            [64,23.40],
                            [14,11.80]])
    
    y = pd.DataFrame(columns=["y"], 
                      data=[[0],
                            [0],
                            [1],
                            [0],
                            [2],
                            [2],
                            [2],
                            [1],
                            [0],
                            [1],
                            [0],
                            [0],
                            [1],
                            [0],
                            [1],
                            [0],
                            [1],
                            [1],
                            [0],
                            [2]])
    

    我应该将数据分为训练集和测试集。经典的方法是 train_test_split 功能 sklearn :

    X_train, X_test, y_train, y_test = model_selection.train_test_split(X, y, test_size=0.25)
    

    但我想指定要分配给培训和测试集的记录的百分比。下面将解释更多详细信息。

    在我的例子中,我处理一个多类分类问题,其中 y 可以采用3个不同值之一:0、1、2。值为2的记录非常罕见(在我的实际数据集中,大约占整个数据集的3%)。因此,这是一个不平衡的分类问题。

    由于这是一个不平衡的分类问题,稀有类的记录非常重要。因此我想更新 model_selection.train_test_split 如下:我想为培训和测试集分配每节课记录的百分比。 例如,<50%、60%、90%>意味着90%的稀有课程记录被分配给培训组。

    例如,在我的示例中,我希望获得 Y 等于 2 在训练集中( X_train , y_train )和1个记录。

    我在谷歌上搜索类似的问题,但没有发现任何问题。

    为了解决这个问题,我对初始数据帧进行了无序处理:

    df = pd.concat([X, y], axis=1)
    
    df = df.sample(frac=1).reset_index(drop=True)
    

    但是,我不知道如何继续执行其余的任务。也许有一些sklearn内置函数或库可以解决这个问题?

    1 回复  |  直到 6 年前
        1
  •  2
  •   Bruno Carballo    6 年前

    有一个叫做分层的选项,在火车测试中。还要看看这个 kind of similar question

    为了达到你需要的比例,你可以使用 np.random.choice 来自麻木:

    import numpy as np
    df = pd.concat([X,y], axis = 1)
    
    #get index values for y = 0
    i0 = np.random.choice(df.loc[df.y==0].index.values,
    round(len(df.loc[df.y==0])*.5), replace = False)
    
    i1 = np.random.choice(df.loc[df.y==1].index.values,
    round(len(df.loc[df.y==1])*.6), replace = False)
    
    i2 = np.random.choice(df.loc[df.y==2].index.values,
    round(len(df.loc[df.y==1])*.9), replace = False)
    
    df_train = df.loc[df.index.isin(np.concatenate([i1,i2,i0]))]
    df_test = df.loc[~df.index.isin(np.concatenate([i1,i2,i0]))]