任务描述
本关任务:完成不平衡数据分类的学习。
相关知识
为了完成本关任务,你需要掌握:
- 不平衡数据分类介绍,
- 随机采样。
不平衡数据分类介绍
从数据角度出发的不平衡数据集的处理方法有两种随机采样法,以及对应的python
库(imblearn
)。
imblearn介绍 imblearn/imbalanced-learn
是一个python
包,它提供了许多重采样技术,常用于显示强烈类间不平衡的数据集中。它与scikit learn
兼容,是 scikit-learn-contrib
项目的一部分。
数据集:
随机采样
Oversampling 过采样 针对不平衡数据, 最简单的一种方法就是生成少数类的样本, 这其中最基本的一种方法就是: 从少数类的样本中进行随机采样来增加新的样本,对应Python
库中函数为RandomOverSampler
。
复制正样本, 直到训练集中正样本和负样本一样多,可能导致模型过分拟合,因为一些噪声样本也可能被复制多次。
代码示例:
# 随机过采样
from imblearn.over_sampling import RandomOverSampler
ros = RandomOverSampler(random_state=0)
X_resampled, y_resampled = ros.fit_sample(X, y)
Undersampling欠采样 与过采样相反,欠采样是从多数类样本中随机选择少量样本,再合并原有少数类样本作为新的训练数据集。
随机欠采样有两种类型分别为有放回和无放回两种,无放回欠采样在对多数类某样本被采样后不会再被重复采样,有放回采样则有可能。
对应Python
库中函数为RandomUnderSampler
,通过设置RandomUnderSampler
中的replacement=True
参数, 可以实现自助法(boostrap
)抽样。
随机抽取100个负样本, 与所有的正样本一起形成训练集 。
问题: 一些有用的负样本可能没有选出来用于训练, 因此导致一个不太优的模型怎么办? 答:多次执行不充分抽样, 并归纳类似于组合学习方法的多分类器 。
代码示例:
#随机欠采样
from imblearn.under_sampling import RandomUnderSampler
rus = RandomUnderSampler(random_state=0)
X_resampled, y_resampled = rus.fit_resample(X, y)
编程要求
根据提示,在右侧编辑器补充代码,完成随机过采样对不平衡数据分类。
测试说明
平台会对你编写的代码进行测试:
预期输出:
<bound method DataFrame.info of Pregnancies Glucose ... DiabetesPedigreeFunction Age
0 6 148 ... 0.627 50
1 1 85 ... 0.351 31
2 8 183 ... 0.672 32
3 1 89 ... 0.167 21
4 0 137 ... 2.288 33
5 5 116 ... 0.201 30
6 3 78 ... 0.248 26
7 10 115 ... 0.134 29
8 2 197 ... 0.158 53
9 8 125 ... 0.232 54
10 4 110 ... 0.191 30
11 10 168 ... 0.537 34
12 10 139 ... 1.441 57
13 1 189 ... 0.398 59
14 5 166 ... 0.587 51
15 7 100 ... 0.484 32
16 0 118 ... 0.551 31
17 7 107 ... 0.254 31
18 1 103 ... 0.183 33
19 1 115 ... 0.529 32
20 3 126 ... 0.704 27
21 8 99 ... 0.388 50
22 7 196 ... 0.451 41
23 9 119 ... 0.263 29
24 11 143 ... 0.254 51
25 10 125 ... 0.205 41
26 7 147 ... 0.257 43
27 1 97 ... 0.487 22
28 13 145 ... 0.245 57
29 5 117 ... 0.337 38
.. ... ... ... ... ...
970 8 176 ... 0.467 58
971 0 167 ... 0.839 30
972 0 109 ... 0.855 38
973 6 125 ... 0.565 49
974 8 105 ... 0.239 45
975 0 179 ... 0.455 22
976 0 137 ... 2.288 33
977 7 159 ... 0.383 36
978 0 162 ... 0.759 25
979 2 174 ... 0.646 24
980 1 128 ... 0.613 24
981 0 179 ... 0.686 23
982 3 171 ... 0.199 24
983 0 131 ... 0.196 22
984 5 116 ... 0.660 35
985 2 118 ... 0.693 21
986 5 124 ... 0.220 38
987 5 112 ... 0.261 41
988 3 139 ... 0.402 22
989 10 148 ... 1.001 51
990 8 124 ... 0.687 52
991 7 114 ... 0.258 42
992 4 183 ... 0.212 36
993 0 146 ... 0.334 28
994 5 130 ... 0.956 37
995 10 125 ... 0.205 41
996 7 161 ... 0.165 47
997 1 181 ... 0.328 38
998 6 119 ... 1.318 33
999 7 103 ... 0.344 31
[1000 rows x 8 columns]>
开始你的任务吧,祝你成功!
代码如下:
import pandas as pd
from imblearn.over_sampling import RandomOverSampler
data_url = "/data/workspace/myshixun/step1/diabetes.csv"
df = pd.read_csv(data_url)
X = df.iloc[:,0:8]
y=df.iloc[:,8]
###### Begin ######
# 随机过采样
ros = RandomOverSampler(random_state=0)
###### End ######
X_resampled, y_resampled = ros.fit_resample(X, y)
# 显示采样后的数据
print(X_resampled.info)