当前位置: 首页 > 面试题库 >

复制训练示例以处理pandas数据框中的类不平衡

顾恺
2023-03-14
问题内容

我在熊猫中有一个DataFrame,其中包含训练示例,例如:

   feature1  feature2  class
0  0.548814  0.791725      1
1  0.715189  0.528895      0
2  0.602763  0.568045      0
3  0.544883  0.925597      0
4  0.423655  0.071036      0
5  0.645894  0.087129      0
6  0.437587  0.020218      0
7  0.891773  0.832620      1
8  0.963663  0.778157      0
9  0.383442  0.870012      0

我生成的使用:

import pandas as pd
import numpy as np

np.random.seed(0)
number_of_samples = 10
frame = pd.DataFrame({
    'feature1': np.random.random(number_of_samples),
    'feature2': np.random.random(number_of_samples),
    'class':    np.random.binomial(2, 0.1, size=number_of_samples), 
    },columns=['feature1','feature2','class'])

print(frame)

如您所见,训练集是不平衡的(8个样本的等级为0,而只有2个样本的等级为1)。我想对训练集进行过度采样。具体来说,我想复制第1类的训练样本,以便平衡训练集(即,第0类的样本数与第1类的样本数大致相同)。我该怎么办?

理想情况下,我想要一个可以推广到多类设置的解决方案(即,类列中的整数可能大于1)。


问题答案:

您可以找到一个小组的最大人数

max_size = frame['class'].value_counts().max()

在您的示例中,该值等于8。对于每个组,您都可以使用替换max_size - len(group_size)元素进行采样。这样,如果将它们连接到原始DataFrame,它们的大小将相同,并且将保留原始行。

lst = [frame]
for class_index, group in frame.groupby('class'):
    lst.append(group.sample(max_size-len(group), replace=True))
frame_new = pd.concat(lst)

您可以使用它max_size-len(group),也可以添加一些噪音,因为这会使所有组的大小相等。



 类似资料:
  • 问题内容: 如果数据如下所示: 我想复制IsHoliday等于TRUE的行,我可以这样做: 但是是否有更好的方法来执行此操作,因为我需要将假日行重复5次,如果使用上述方法,则必须追加5次。 问题答案: 您可以放入列表中,然后执行以下操作:

  • 本文向大家介绍python PyTorch预训练示例,包括了python PyTorch预训练示例的使用技巧和注意事项,需要的朋友参考一下 前言 最近使用PyTorch感觉妙不可言,有种当初使用Keras的快感,而且速度还不慢。各种设计直接简洁,方便研究,比tensorflow的臃肿好多了。今天让我们来谈谈PyTorch的预训练,主要是自己写代码的经验以及论坛PyTorch Forums上的一些回

  • 我试图使用官方OpenNLP网站手册示例来训练一个新模型,以下是示例: 问题出在2º线上, 帮我说:不赞成。改用PlainTextByLineStream(InputStreamFactory,Charset)。但是我不知道如何使用这个构造函数。我想举一个例子,使用同一个语料库文件使用这个未弃用的构造函数。 我已经编写了下一段代码,使用opennlp帮助和两种使用train方法的方法,不推荐的和建

  • 问题内容: 我像这样使用scikit-learn的SVM: 我的问题是,当我使用分类器预测训练集成员的班级时,即使在scikit- learns实现中,分类器也可能是错误的。(例如) 问题答案: 是的,可以运行以下代码,例如: 分数是0.61,因此将近40%的训练数据被错误分类。部分原因是,即使默认内核是(理论上也应该能够对任何训练数据集进行完美分类,只要您没有两个带有不同标签的相同训练点),也可

  • 问题内容: 因此,我一直遵循Google的官方tensorflow指南,并尝试使用Keras构建一个简单的神经网络。但是,在训练模型时,它不使用整个数据集(具有60000个条目),而是仅使用1875个条目进行训练。有可能解决吗? 输出: 这是我一直在为此工作的原始Google colab笔记本:https ://colab.research.google.com/drive/1NdtzXHEpiN

  • 运行此操作时,我得到错误“Assertion failed(Samples.type()==CV_32F samples.type()==CV_32S)in cv::ML::TrainDataImpl::SetData”。但是,我已经放入了几行代码,将我的类Mat和直方图Mat转换为cv_32f类型。问题是与我的输入有关,还是与SVM->Train中的ROW_SAMPLE有关?非常感谢任何帮助。

  • 我一直在努力学习如何训练我的数据,即使用字符串数据实现机器学习。我所能理解的是,您可以将字符串数据类型转换为category,但我无法使用LabelEncoder。我听说,我们不应该绘制数据图并将其更改为数字数据,因为它的预测将是错误的。 以下是数据示例: 如您所见,性别(2)、已婚(3)、受抚养人(4)、教育程度(5)、自雇(6)、财产(11)、贷款状态(!2)是字符串。 某些列缺少数据,因此无

  • 问题内容: 我正在尝试运行以下Colab项目,但是当我想将训练数据分为验证和训练部分时,出现此错误: 我使用以下代码: 如何解决此错误? 问题答案: 根据Tensorflow Dataset docs ,百分比拆分是可能的,例如 如示例所示,更改列表时,您的代码将起作用: 使用上面的代码,有2590个条目,而有1080个。