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

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

作者: Andrew0000 | 来源:发表于2019-09-29 16:27 被阅读0次

    数据不平衡以及危害

    批发和零售业 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

    相关文章

      网友评论

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

          本文链接:https://www.haomeiwen.com/subject/jmafpctx.html