You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
pt5jvslni/Chapter12/解决样本不平衡问题.md

45 lines
2.7 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# 12.3 解决样本不平衡问题
在本章的第一节中已经提到过,该数据集有着非常严重的数据倾斜。
```python
sns.countplot('Class', data=transactions)
plt.title('Class Distributions \n (0: No Fraud || 1: Fraud)', fontsize=14)
```
![](6.jpg)
那么对于这种样本极不平衡的数据我们有两种大致的思路,一种是降采样,另一种是过采样。
降采样,顾名思义就是从标签所占比例非常高的那一部分样本中随机选取一些样本,至于选取多少个样本,就要看标签所占比例非常低的那一部分的样本有多少个了。对于该数据集来说,我们需要从标签值为 0 的样本中随机选取 492 个左右的样本出来,然后与标签值为 1 的样本组合成一个新的数据集。这就是降采样的意思。
```python
# 从标签值为0的数据中随机抽取492个样本
df0 = transactions[transactions['Class'] == 0].sample(492)
# 提取出标签值为1的数据
df1 = transactions[transactions['Class'] == 1]
# 将两部分数据合并在一起
all_df = pd.concate([df0, df1], axis=0)
```
然后依葫芦画瓢的将数据的分布图可视化出来,就能看到经过降采样之后的数据分布变成了均匀分布。
![](7.jpg)
但是降采样有个问题,就是丢弃了非常多的数据所提供的信息,因为我们是从 28 万条数据中随机选取的,所以无形之中就丢弃掉了大量信息!
那么有没有一种即让数据呈现出均匀分布的样子,又不会丢失信息呢?有!那就是过采样。一般来说,现在经常使用的过采样算法是 SMOTE 算法。SMOTE 算法与随机欠采样不同SMOTE 算法会创建新的数据,以便在类之间保持相等的平衡。这是解决数据不平衡问题的另一种很棒的选择。
SMOTE 算法的大致思路是根据标签所占比例较少的那一部分数据创建一些合成点,这些合成点可以看成是数据。而这些数据中字段的值,是最近邻的思想来构建的。所以使用 SMOTE 算法来解决样本不平衡的问题,实际上就是通过使用 SMOTE 算法来生成一些新的数据,然后与原始数据合并起来,让整个数据变成均匀分布。下面是使用 SMOTE 算法实现过采样的示例代码:
```python
# 导入SMOTE
from imblearn.over_sampling import SMOTE
# 使用SMOTE算法实现过采样
transactions = SMOTE().fit_sample(transactions)
```
好了,这节主要介绍了解决样本不平衡问题的两种方法,至于哪种方法的效果好,你可以自己在本章结束之后自己动手试试。至于过采样之后的数据分布图是怎样的,这里就当给你留的一个作业吧。