记-机器学习-预处理中数据集分布不均衡问题

数据不平衡以及危害

批发和零售业 118307
租赁和商务服务业 53294
制造业 49937
农、林、牧、渔业 48816
建筑业 33034
信息传输、软件和信息技术服务业 17388
交通运输、仓储和邮政业 15048
房地产业 12991
科学研究和技术服务业 9150
居民服务、修理和其他服务业 8052
金融业 7626
住宿和餐饮业 4390
文化、体育和娱乐业 4251
电力、热力、燃气及水生产和供应业 2943
水利、环境和公共设施管理业 2235
采矿业 1694
教育 1390
卫生和社会工作 488

以‘卫生和社会工作’为正样本,与其他负样本比例悬殊,最终模型score对该类分类能力不足。

因此数据不平衡在分类问题中尤其值得关注,不平衡的数据集分布使得模型拟合能力不足。

不均衡问题的解决思路以及代码

  1. 采样---包括过采样(其中以SMOTE较为出色)和欠采样;又称上采样与负采样
  2. 加权---让小样本类别权重增加,提升小样本类别的‘话语权’
  3. 集成方法---随机森林
  4. 特征选择---特征工程在特征表达或抽取后,特征选择也可看做特征降维的一部分
采样

上采样(过采样),其实就是以最多量的类为基准,复制放大其他类数据达到平衡

缺点:数据单一、过拟合

优化:SMOTE算法,实际是利用已有样本KNN随机合成小样本数据,达到数据平衡。

代码:

from imblearn.over_sampling import SMOTE
sm = SMOTE(random_state=42)
X_sample, y_sample = sm.fit_sample(datas['feature'], datas['label'])

过采样(上采样)参考官网

下采样,也就是以最小量的类数据为准,舍弃缩小其他类部分数据

缺点:可能丢失重要特征

代码:

>>> from collections import Counter
>>> from sklearn.datasets import make_classification
>>> from imblearn.under_sampling import RandomUnderSampler # doctest: +NORMALIZE_WHITESPACE
>>> X, y = make_classification(n_classes=2, class_sep=2,
...  weights=[0.1, 0.9], n_informative=3, n_redundant=1, flip_y=0,
... n_features=20, n_clusters_per_class=1, n_samples=1000, random_state=10)
>>> print('Original dataset shape %s' % Counter(y))
Original dataset shape Counter({1: 900, 0: 100})
>>> rus = RandomUnderSampler(random_state=42)
>>> X_res, y_res = rus.fit_resample(X, y)
>>> print('Resampled dataset shape %s' % Counter(y_res))
Resampled dataset shape Counter({0: 100, 1: 100})

下采样参考官网

加权
from sklearn.svm import SVC
model_svm=SVC(class_weight='balanced')
model_svm.fit(x,y)

思路:对于分类中不同样本数量的类别分别赋予不同的权重,一般是小样本量类别权重高,大样本量类别权重低。

特征选择

特征较多的时候,特征选择作为特征降维的一种方法。

from sklearn.feature_selection import SelectKBest, SelectPercentile
from sklearn.feature_selection import f_classif, chi2, mutual_info_classif
from sklearn.svm import LinearSVC
from sklearn.feature_selection import RFE

estimator = LinearSVC()
sp = RFE(estimator=estimator)
# sp = SelectPercentile(mutual_info_classif, percentile=10)
# 得到返回至少含有10%特征信息的特征
X_result = sp.fit_transform(X, industry)

参考:

https://www.jianshu.com/p/76dce1fca85b

https://blog.csdn.net/weixin_42243942/article/details/80480313

https://www.cnblogs.com/guoruibing/articles/9561035.html

你可能感兴趣的:(记-机器学习-预处理中数据集分布不均衡问题)