【问题标题】:Make data balanced after train test split operation (scikit)?在训练测试拆分操作(scikit)后使数据平衡?
【发布时间】:2020-03-18 08:38:31
【问题描述】:

我遇到了一个问题,将我的数据分成训练和测试数据后,我的测试集中完全缺少一个类。

Example on 60/40 split: <br/>
Training: 'Orange', 0,0,0, 'Orange' <br/>
Testdata: 0,0,0,0,0 

显然“橙色”这个词不包含在测试集中。如何确保拆分考虑到至少一些目标样本包含在测试集和训练集中?我以为 stratify 参数可以做到这一点,但不幸的是没有。

【问题讨论】:

  • train_test_splitstratify 输入参数是要走的路。请参阅我的答案以获取示例

标签: python scikit-learn classification


【解决方案1】:

1.使用下面来拆分您的训练/测试数据 - 这使用 train_test_split 的分层选项

   from sklearn.model_selection import train_test_split 
   train, test = train_test_split(X, test_size=0.25, stratify=y) 

2.或者您可以尝试使用 - stratified K fold 这将应用 k 折交叉验证

【讨论】:

    【解决方案2】:

    当您使用不平衡的数据集时,我强烈建议您不要手动调整类中的平衡并改为运行交叉验证:https://scikit-learn.org/stable/modules/cross_validation.html

    这将为您提供未来的稳定参数和更好的结果。这个想法是,您在不同的折叠上运行,并且训练和测试数据会发生变化,您的参数也会因此而调整。

    一个小例子:

    from sklearn.model_selection import cross_val_score
    clf = svm.SVC(kernel='linear', C=1) #your classifier
    scores = cross_val_score(clf, X, y, cv=5) #Assumming your features are X, and target is y
    

    【讨论】:

      【解决方案3】:

      您可以根据类别将数据分成两组:

      Group1: 'Orange', 'Orange'
      Group2: 0,0,0,0,0,0,0,0
      

      在每个组内进行拆分,然后像这样将它们重新组合在一起。

      mylist = [''Orange',0,0,0 ,'Orange',...]
      Oranges = mylist[mylist=='Orange'] 
      zeros = mylist[mylist==0]
      orange_data = [O.X for O in Oranges]
      orange_label = [O.y for o in Oranges]
      Orange_data_train, orange_data_test, orange_label_train, orange_label_test = train_test_split(orange_data, orange_labels) 
      

      然后对零做同样的事情并将它们放在一起:

      training_data = Orange_data_train + zero_data_train
      

      请注意,如果类具有相似的样本量,许多分类算法效果最好,但这是另一个主题。

      【讨论】:

        【解决方案4】:

        使用train_test_splitstratify 输入参数:

        import numpy as np
        from sklearn.model_selection import train_test_split
        X = np.arange(100).reshape((25, 4))
        y= [0,1,2,3,4] * 5
        
        X_train, X_test, y_train, y_test = train_test_split(
            X, y, test_size=0.3, random_state=42, stratify=y)
        
        print(y_train)
        print(y_test)
        
        [0, 4, 1, 4, 3, 2, 1, 1, 0, 4, 0, 2, 4, 3, 1, 2, 3]
        [1, 4, 3, 2, 0, 0, 2, 3]
        

        【讨论】:

          猜你喜欢
          • 2020-09-09
          • 1970-01-01
          • 2021-03-09
          • 2017-02-04
          • 2015-06-08
          • 2020-06-22
          • 2021-12-08
          • 1970-01-01
          • 2019-04-10
          相关资源
          最近更新 更多