训练模型时通常会遇到样本数据分布不均匀导致模型效果不理想,有些算法可以通过配置class_weight参数保证样本均衡,当算法不存在这些参数时我们需要手动处理样本数据保证样本得均衡。
今天主要介绍样本不均衡中欠采样的处理方法:
# !/usr/bin/python
# -*- coding:utf-8 -*-
# file: sample_balanced.py
# author: Lawrence
# datetime: 2021/8/26 16:23
import pandas as pd
from imblearn.over_sampling import SMOTE # 过抽样处理库SMOTE
def sample_balanced(df, colss):
"""
样本均衡策略
"""
df = df[colss['F9']]
x = df.iloc[:, :-1]
y = df.iloc[:, -1]
groupby_data_orgianl = df.groupby('F9').count() # 对label做分类汇总
groupby_data_orgianl = groupby_data_orgianl[groupby_data_orgianl['F14'].between(2, 400, inclusive=True)] # 筛选出出现频率少于400大于2次的数据
ratio1 = {}
for i in groupby_data_orgianl.index:
# 数据源中样本数少于2个不能过采样
ratio1[i] = 400 # 指定样本过采样到多少
# SMOTE方法进行过采样处理
model_smote = SMOTE(sampling_strategy=ratio1, k_neighbors=1) # 建立SMOTE模型对象
x_smote_resampled, y_smote_resampled = model_smote.fit_sample(x, y) # 输入数据做过抽样处理
smote_resampled = pd.concat([x_smote_resampled, y_smote_resampled], axis=1) # 按列合并数据框
groupby_data_smote = smote_resampled.groupby('F9').count() # 对label做分类汇总
# print(groupby_data_smote) # 打印输出经过SMOTE处理后的数据集样本分类分布
return groupby_data_smote