亦菲喊你来学机器学习(8) --逻辑回归内过采样(人工拟合)

过采样

在逻辑回归中,过采样技术经常被用来处理类别不平衡的数据集,但直接过采样(即简单复制少数类样本)可能会导致模型过拟合,因为模型会过于关注这些重复的样本。为了缓解这个问题,可以考虑人工拟合数据,特别是结合过采样技术时。这里,“人工拟合数据”通常指的是通过某种方式生成新的、合成的数据点,而不是简单地复制现有数据。

当在逻辑回归中应用过采样并结合人工拟合数据时,可以采取合成少数类过采样技术(SMOTE),近邻方式合成新数据。

优缺点

  • 优点
  1. 减少过拟合风险:

    相比于简单的随机过采样(即直接复制少数类样本),SMOTE通过生成新的合成样本来增加数据集的多样性,从而减少了过拟合的风险。这是因为新生成的样本不是简单的重复,而是基于现有样本的特征空间进行插值得到的。

  2. 提高模型性能:

    通过平衡数据集的类别分布,SMOTE有助于模型更全面地学习所有类别的特征,从而提高模型的整体性能。特别是在逻辑回归等分类算法中,平衡的数据集通常能够产生更准确的分类结果。

  3. 灵活性和可扩展性:

    SMOTE算法可以根据需要调整参数(如k近邻中的k值)来生成不同数量的合成样本,从而适应不同规模和不平衡程度的数据集。此外,SMOTE还可以与其他过采样、欠采样或集成学习方法结合使用,以进一步提高模型性能。

  4. 处理复杂数据集:

    对于具有复杂特征空间和高维特征的数据集,SMOTE能够有效地生成具有代表性的合成样本。这些合成样本能够填补原始数据中的空白区域,使得模型能够学习到更加全面的特征表示。

  • 缺点
  1. 可能引入噪声:

    在生成合成样本的过程中,如果选择的近邻样本存在噪声或异常值,那么生成的合成样本也可能包含噪声或异常特征。这可能会降低模型的性能,特别是当噪声或异常值对分类结果产生显著影响时。

  2. 对参数敏感:

    SMOTE算法的性能受到参数k(近邻数)的影响。如果k值选择不当,可能会导致生成的合成样本质量不高,从而影响模型的性能。此外,SMOTE算法还可能受到其他参数(如插值权重等)的影响。

  3. 计算成本较高:

    相比于简单的随机过采样,SMOTE算法需要计算每个少数类样本的k近邻,并生成新的合成样本。这可能会增加算法的计算成本和时间复杂度,特别是在处理大规模数据集时。

  4. 可能不适用于所有情况:

    尽管SMOTE算法在许多情况下都表现出色,但它并不总是适用于所有类型的不平衡数据集。在某些特定情况下,可能需要结合其他方法(如欠采样、集成学习等)来进一步提高模型性能。

具体步骤

收集数据:

链接:实验数据
提取码:0qw2

1. 数据观察:

首先,需要观察数据集的分布情况,特别是目标变量的分布,以确定是否存在数据不平衡问题。通过可视化数据来观察:

#一、数据预处理
data = pd.read_csv('creditcard.csv')
data = data.drop('Time',axis=1)
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
data['Amount'] = scaler.fit_transform(data[['Amount']])

#二、绘制图像,查看正负样本个数
mpl.rcParams['font.sans-serif'] = ['Microsoft YaHei'] #修改字体
mpl.rcParams['axes.unicode_minus'] = False

lei_count = pd.value_counts(data['Class'])
plt.title('样本数')
plt.xlabel('类别')
plt.ylabel('数量')

lei_count.plot(kind = 'bar')
plt.show()   #通过可视化查看样本数量差异

#(此处发现,样本数相差数量过大,进行过取样操作)

在这里插入图片描述

可以发现,类别为1的样本数量几乎不可见,样本极度不均衡。

2. 过采样,确定使用SMOTE:

在众多过采样技术中,选择SMOTE(Synthetic Minority Over-sampling Technique)作为合成少数类样本的方法,将少数类的数据人工拟合,让其能和多数类的数据一样多。

#三、过采样
from imblearn.over_sampling import SMOTE
from sklearn.model_selection import train_test_split

X = data.drop('Class',axis=1)
Y = data.Class

train_x_w,test_x_w,train_y_w,test_y_w = \  #提前从原始数据中预留一部分测试数据
    train_test_split(X,Y,test_size=0.3,random_state=0)

over_sampl = SMOTE(random_state=0)
#用os_train_x,os_train_y分别来接收拟合后的数据
os_train_x,os_train_y = over_sampl.fit_resample(train_x_w,train_y_w)

#此时训练集为(os_train_x,os_train_y)

3. 构建模型:

使用过采样后的数据集来训练逻辑回归模型。通过训练数据集对逻辑回归模型进行训练,学习数据中的特征和类别之间的关系。

from sklearn.linear_model import LogisticRegression
lr = LogisticRegression()
lr.fit(os_train_x,os_train_y) #使用过采样后的数据训练

4. 模型评估:

使用测试集对模型进行评估,观察模型在少数类和多数类上的表现。

from sklearn import metrics
#训练集本身测试数据
train_x,test_x,train_y,test_y = \
    train_test_split(os_train_x,os_train_y,test_size=0.3,random_state=0)
test_x_predict = lr.predict(test_x)
print(metrics.classification_report(test_y, test_x_predict))
-----------------------------
              precision    recall  f1-score   support

           0       0.92      0.97      0.95     60051
           1       0.97      0.92      0.94     59361

    accuracy                           0.95    119412
   macro avg       0.95      0.95      0.95    119412
weighted avg       0.95      0.95      0.95    119412
#原始数据测试集
test_X_predict = lr.predict(test_x_w)
print(metrics.classification_report(test_y_w,test_X_predict))
-------------------------
              precision    recall  f1-score   support

           0       1.00      0.98      0.99     85296
           1       0.06      0.92      0.11       147

    accuracy                           0.98     85443
   macro avg       0.53      0.95      0.55     85443
weighted avg       1.00      0.98      0.99     85443

总结

本篇介绍了:

  1. 什么是过采样:SMOTE通过近邻方式生成新的、合成的数据点,扩充少数类的数据。
  2. 过采样的过程:将每类训练集的样本和结果,每类数量扩充至相等。
  3. 如何进行过采样:使用SMOTH方法随机拟合数据,用新的变量接收。
  • 14
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值