过采样
在逻辑回归中,过采样技术经常被用来处理类别不平衡的数据集,但直接过采样(即简单复制少数类样本)可能会导致模型过拟合,因为模型会过于关注这些重复的样本。为了缓解这个问题,可以考虑人工拟合数据,特别是结合过采样技术时。这里,“人工拟合数据”通常指的是通过某种方式生成新的、合成的数据点,而不是简单地复制现有数据。
当在逻辑回归中应用过采样并结合人工拟合数据时,可以采取合成少数类过采样技术(SMOTE),近邻方式合成新数据。
优缺点
- 优点
-
减少过拟合风险:
相比于简单的随机过采样(即直接复制少数类样本),SMOTE通过生成新的合成样本来增加数据集的多样性,从而减少了过拟合的风险。这是因为新生成的样本不是简单的重复,而是基于现有样本的特征空间进行插值得到的。
-
提高模型性能:
通过平衡数据集的类别分布,SMOTE有助于模型更全面地学习所有类别的特征,从而提高模型的整体性能。特别是在逻辑回归等分类算法中,平衡的数据集通常能够产生更准确的分类结果。
-
灵活性和可扩展性:
SMOTE算法可以根据需要调整参数(如k近邻中的k值)来生成不同数量的合成样本,从而适应不同规模和不平衡程度的数据集。此外,SMOTE还可以与其他过采样、欠采样或集成学习方法结合使用,以进一步提高模型性能。
-
处理复杂数据集:
对于具有复杂特征空间和高维特征的数据集,SMOTE能够有效地生成具有代表性的合成样本。这些合成样本能够填补原始数据中的空白区域,使得模型能够学习到更加全面的特征表示。
- 缺点
-
可能引入噪声:
在生成合成样本的过程中,如果选择的近邻样本存在噪声或异常值,那么生成的合成样本也可能包含噪声或异常特征。这可能会降低模型的性能,特别是当噪声或异常值对分类结果产生显著影响时。
-
对参数敏感:
SMOTE算法的性能受到参数k(近邻数)的影响。如果k值选择不当,可能会导致生成的合成样本质量不高,从而影响模型的性能。此外,SMOTE算法还可能受到其他参数(如插值权重等)的影响。
-
计算成本较高:
相比于简单的随机过采样,SMOTE算法需要计算每个少数类样本的k近邻,并生成新的合成样本。这可能会增加算法的计算成本和时间复杂度,特别是在处理大规模数据集时。
-
可能不适用于所有情况:
尽管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
总结
本篇介绍了:
- 什么是过采样:SMOTE通过近邻方式生成新的、合成的数据点,扩充少数类的数据。
- 过采样的过程:将每类训练集的样本和结果,每类数量扩充至相等。
- 如何进行过采样:使用SMOTH方法随机拟合数据,用新的变量接收。