CSDN机器学习笔记七 实战样本不均衡数据解决方法

时间:2021-10-15 02:29:57

信用卡检测案例

CSDN机器学习笔记七 实战样本不均衡数据解决方法

原始数据:0特别多,1特别少——样本不均衡。
要么让0和1一样多,要么让0和1一样少。
CSDN机器学习笔记七 实战样本不均衡数据解决方法

1.下采样

对于数据0和1,要变为同样少——在0里选择和1一样多数据。

from sklearn.preprocessing import StandardScaler
data['normAmount']=StandardScaler().fit_transform(data['Amount'].reshape(-1,1)
data = data.drop(['Time','Amount'],axis=1)
data.head()

CSDN机器学习笔记七 实战样本不均衡数据解决方法

让所有数据的取值范围尽量相同。
- reshape(-1,1) , -1是个占位符。

CSDN机器学习笔记七 实战样本不均衡数据解决方法
在正常index随机选择多少个。

under_sample_indices=np.concatenate([fraud_indices,random_normal_indices]);

通过索引定位数据
under_sample_data=data.iloc[under_sample_indices,:]
这样就做好了下采样数据集。

交叉验证

假设现在拿到1笔数据,那首先我们要把数据分成2部分,一部分train(训练),一部分test(测试)。
一般比例是train:test=0.9:0.1
CSDN机器学习笔记七 实战样本不均衡数据解决方法

第1步 训练集再分成3份,
CSDN机器学习笔记七 实战样本不均衡数据解决方法
1+2训练,3作为验证。

即调参数是在训练数据中拿一部分作验证。

第2步 2+3作模型,3作验证
第3步 1+3作模型,2作验证
把三次的结果相加 / 3作为最终结果。

实际中可以把数据集切成更多份进行交叉验证。

代码示例:

from sklearn.cross_validation import train_test_split

X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.3,random_state=0);
30%作训练集,random_state复现的结果(?)

print("Number transactions train dataset: " ,len(X_train))

X_train_undersample,X_test_undersample,y_train_undersample,y_test_undersample

建模:
![这里写图片描述](http://img.blog.csdn.net/20170615203117546?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveHVuZGg=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)

CSDN机器学习笔记七 实战样本不均衡数据解决方法

CSDN机器学习笔记七 实战样本不均衡数据解决方法
后一个for是交叉验证。
lr = LogisticRegression(C= c_param,penalty = ‘l1’) 分类器,惩罚力度传进来 。
lr.fit(x_train_data.iloc[indices[0],:],y_train_data.iloc[indices[0],:].values.rave1()
训练模型

接下来预测
y_pred_undersample = lr.predict(x_train_data.iloc[indices[1],:].values)
拿测试样本预测
recall_acc= recall_score(y_train_data.iloc[indices[1],:].values,y_pred_undersample)
recall_accs.append(recall_acc)

打印结果:
CSDN机器学习笔记七 实战样本不均衡数据解决方法

得到5次recall值,计算平均值:
Mean recall score 0.960846151257
目前是验证级的结果。

C parameter: 0.1的时候
CSDN机器学习笔记七 实战样本不均衡数据解决方法
Mean recall score 0.885020…
参数会对结果有非常大的影响 。

模型评估标准
精度指标
recall指标=TP/(TP+FN)
TP:
CSDN机器学习笔记七 实战样本不均衡数据解决方法

fold=KFold(
数据分几份。

惩罚项
X[1,1,1,1]
W1=[1,0,0,0]
W2=[1/4,1/4,1/4,1/4]
X*W1T=1
X*W2T=1
对W1,X后面的三个特征没有作用。
而对W2,每个特征都会考虑进来 。
W2会更好,综合考虑各个特征。 要指定一个惩罚参数,对W1进行惩罚。
L2加平方项,W2
L1加绝对值,|W|。
选择惩罚项比较小的方式。最终目标要把正则化惩罚项加上。

L1 L2前加λ惩罚系数,λ可以取不同的值。什么样的惩罚系数好呢?

Confusion matrix 混淆矩阵

对比真实值与预测值的结果:
CSDN机器学习笔记七 实战样本不均衡数据解决方法

现在混淆矩阵显示的是测试集的结果。

下周要讲怎么解决误杀的问题。主要是下采样策略引起的。主要是过采样策略。

如果直接:
best_c = printing_Kfold_scores(Xtrain.y_train)
看交叉验证的结果,recall值会很小。

2. 过采样

逻辑回归:预值概念

CSDN机器学习笔记七 实战样本不均衡数据解决方法
预值对recall值的影响
CSDN机器学习笔记七 实战样本不均衡数据解决方法

CSDN机器学习笔记七 实战样本不均衡数据解决方法

精度与recall值的权衡要视具体任务来定。

smote算法
CSDN机器学习笔记七 实战样本不均衡数据解决方法

对于少数类中每一个样本x,以欧氏距离为标准计算它到少数类样本集中所有样本的距离,得到其k近邻。

安装 pip install imblearn
算法示例:
CSDN机器学习笔记七 实战样本不均衡数据解决方法

CSDN机器学习笔记七 实战样本不均衡数据解决方法
目前混淆矩阵
CSDN机器学习笔记七 实战样本不均衡数据解决方法
误杀大约1%,recall稍高一些。