精华内容
下载资源
问答
  • 常见的缺失值填充方法有填充默认值、均值、众数、KNN填充、以及把缺失值作为新的label通过模型来预测等方式,为了介绍这几种填充方法的使用以及填充效果,本文将在真实数据集上进行简单比较。 1. 数据集介绍 数据...

    面试不仅仅是一个找工作的过程,还是一个向面试官交流学习的过程。之前的某次面试中,聊到了缺失值填充方法,经面试官指点学到了一些技能,下面简要总结一下。

    常见的缺失值填充方法有填充默认值、均值、众数、KNN填充、以及把缺失值作为新的label通过模型来预测等方式,为了介绍这几种填充方法的使用以及填充效果,本文将在真实数据集上进行简单比较。

    1. 数据集介绍

    数据集来源于 天池精准医疗大赛——人工智能辅助糖尿病遗传风险预测。该数据集共有1000条数据,特征共83维,加上id和label共85列,每维特征缺失数量范围为0~911。为了简单比较各种填充方法的效果,我们选取最简单的二分类模型(逻辑回归),选取F1 score作为评测指标。

    读取数据集代码如下:

    
       
    1. train_data = pd.read_csv( 'train_data.csv', encoding= 'gbk') # 读取数据集
    2. filter_feature = [ 'id', 'label'] # 过滤无用的维度
    3. features = []
    4. for x in train_data.columns: # 取特征
    5. if x not in filter_feature:
    6. features.append(x)
    7. train_data_x = train_data[features]
    8. train_data_y = train_data[ 'label']
    9. X_train, X_test, y_train, y_test = train_test_split(train_data_x, train_data_y, random_state= 1) # 划分训练集、测试集

    2. 常见的填充方法

    (1)填充固定值

    选取某个固定值/默认值填充缺失值。

    train_data.fillna(0, inplace=True) # 填充 0
       

    (2)填充均值

    对每一列的缺失值,填充当列的均值。

    train_data.fillna(train_data.mean(),inplace=True) # 填充均值
       

    (3)填充中位数

    对每一列的缺失值,填充当列的中位数。

    train_data.fillna(train_data.median(),inplace=True) # 填充中位数
       

    (4)填充众数

    对每一列的缺失值,填充当列的众数。由于存在某列缺失值过多,众数为nan的情况,因此这里取的是每列删除掉nan值后的众数。

    
       
    1. train_data.fillna(train_data.mode(),inplace= True) # 填充众数,该数据缺失太多众数出现为nan的情况
    2. features_mode = {}
    3. for f in features:
    4. print f, ':', list(train_data[f].dropna().mode().values)
    5. features_mode[f] = list(train_data[f].dropna().mode().values)[ 0]
    6. train_data.fillna(features_mode,inplace= True)

    (5)填充上下条的数据

    对每一条数据的缺失值,填充其上下条数据的值。

    
       
    1. train_data.fillna(method= 'pad', inplace= True) # 填充前一条数据的值,但是前一条也不一定有值
    2. train_data.fillna( 0, inplace= True)
    3. train_data.fillna(method= 'bfill', inplace= True) # 填充后一条数据的值,但是后一条也不一定有值
    4. train_data.fillna( 0, inplace= True)

    (6)填充插值得到的数据

    用插值法拟合出缺失的数据,然后进行填充。

    
       
    1. for f in features: # 插值法填充
    2. train_data[f] = train_data[f].interpolate()
    3. train_data.dropna(inplace= True)

    (7)填充KNN数据

    填充近邻的数据,先利用knn计算临近的k个数据,然后填充他们的均值。(安装fancyimpute)除了knn填充,fancyimpute还提供了其他填充方法。

    
       
    1. from fancyimpute import KNN
    2. train_data_x = pd.DataFrame(KNN(k= 6).fit_transform(train_data_x), columns=features)

    (8)填充模型预测的值

    把缺失值作为新的label,建立模型得到预测值,然后进行填充。这里选择某个缺失值数量适当的特征采用随机森林RF进行拟合,其他缺失特征采用均值进行填充。

    
       
    1. new_label = 'SNP46'
    2. new_features = []
    3. for f in features:
    4. if f != new_label:
    5. new_features.append(f)
    6. new_train_x = train_data[train_data[new_label].isnull()== False][new_features]
    7. new_train_x.fillna(new_train_x.mean(), inplace= True) # 其他列填充均值
    8. new_train_y = train_data[train_data[new_label].isnull()== False][new_label]
    9. new_predict_x = train_data[train_data[new_label].isnull()== True][new_features]
    10. new_predict_x.fillna(new_predict_x.mean(), inplace= True) # 其他列填充均值
    11. new_predict_y = train_data[train_data[new_label].isnull()== True][new_label]
    12. rfr = RandomForestRegressor(random_state= 666, n_estimators= 10, n_jobs= -1)
    13. rfr.fit(new_train_x, new_train_y)
    14. new_predict_y = rfr.predict(new_predict_x)
    15. new_predict_y = pd.DataFrame(new_predict_y, columns=[new_label], index=new_predict_x.index)
    16. new_predict_y = pd.concat([new_predict_x, new_predict_y], axis= 1)
    17. new_train_y = pd.concat([new_train_x, new_train_y], axis= 1)
    18. new_train_data = pd.concat([new_predict_y,new_train_y])
    19. train_data_x = new_train_data[features]
    20. train_data_y = train_data[ 'label']

    3. 实验对比

    (1)评测指标

    选取F1 score进行评测。

    
       
    1. def countF1(train, predict):
    2. count = 0 # 统计预测的正确的正样本数
    3. for i in range(len(train)):
    4. if predict[i] == 1 and train[i] == 1:
    5. count += 1
    6. pre = count * 1.0 / sum(predict) # 准确率
    7. recall = count * 1.0 / sum(train) # 召回率
    8. return 2 * pre * recall / (pre + recall)

    (2)对比结果

    填充方式训练集_F1测试集_F1
    默认值00.705167170.59689922
    均值(mean)0.701863350.67768595
    中位数(median)0.708268330.67479675
    众数(mode)0.704791340.68852459
    上一个数据(pad)0.704097120.62711864
    下一个数据(bfill)0.669811320.60169492
    插值0.690184050.61333333
    KNN_30.710769230.66393443
    KNN_60.708978330.68852459
    KNN_100.704791340.68032787
    随机森林_feature30.5714285710.4
    随机森林_feature460.5851393190.41509434

    (3)实验小结

    对于缺失值的处理,除了直接删除缺失严重的特征外,还可以选择各种各样的填充方法。对于每一种填充方式而言,都有其适用的场景,没有绝对的好坏之分,因此在做数据预处理时,要多尝试几种填充方法,选择表现最佳的即可。

     

    本文完整代码已上传至git(https://github.com/AHNU/fill_missing_values)

    参考文献

    1. 训练模型填充空值(fill null)的几种方法

    2. https://www.kaggle.com/pmarcelino/comprehensive-data-exploration-with-python

    展开全文
  • 用fillna()填充众数

    2021-10-26 20:04:44
    今天在做特征工程时,考虑给某列的缺失值,填充为该列的众数。按照之前填补均值和最大最小值的方法: import pandas as pd df.Mer_min_discount.fillna(df.Mer_min_discount.mode(), inplace=True) 结果发现缺失...

    今天在做特征工程时,考虑给某列的缺失值,填充为该列的众数。按照之前填补均值和最大最小值的方法:

    import pandas as pd
    df.Mer_min_discount.fillna(df.Mer_min_discount.mode(), inplace=True)

    结果发现缺失值怎么都填充不上,查阅资料后,恍然大悟,原来由于众数可能存在多个,所以pandas返回的是一个Series,而不像mean()返回的是一个值:

    IN: print(type(df.id.mode()))
    <class 'pandas.core.series.Series'>
    

    IN: print(type(df.id.mean()))
    <class 'numpy.float64'>

    解决办法:

    df.Mer_min_distance.fillna(df.Mer_min_distance.mode()[0], inplace=True)

    默认取第一个众数。

    展开全文
  • SQL求众数、中值(Having)

    千次阅读 2020-11-30 14:00:31
    众数 众数:顾名思义就是一组数据中出现次数最多的数。 现有Graduates表: Graduates表 | name | income | +--------+--------+ | 桑普森 | 400000 | | 迈克 | 30000 | | 怀特 | 20000 | | 阿诺德 | 20000 | | ...

    众数

    众数:顾名思义就是一组数据中出现次数最多的数。
    现有Graduates表:

    Graduates表
    | name   | income |
    +--------+--------+
    | 桑普森 | 400000 |
    | 迈克   |  30000 |
    | 怀特   |  20000 |
    | 阿诺德 |  20000 |
    | 史密斯 |  20000 |
    | 劳伦斯 |  15000 |
    | 哈德逊 |  15000 |
    | 肯特   |  10000 |
    | 贝克   |  10000 |
    | 斯科特 |  10000 |
    

    查找众数:

    select income from graduates group by income 
    having count(*) >= all(select count(*) from graduates group by income);
    

    注意:当income列有值为null时,用谓词all可能会出现unknown的情况。这种情况是我们不愿意看到的。
    可以用极值函数来代替,避免这种情况的发生。

    select income from graduates group by income 
    having count(*) >= max(select count(*) from graduates group by income);
    

    中位数

    当平均值不可信时,与众数一样经常被用到的另一个指标是中位数 (median)。它指的是将集合中的元素按升序排列后恰好位于正中间 的元素。如果集合的元素个数为偶数,则取中间两个元素的平均值作 为中位数。
    以Graduates表为例求中位数:

    --如果中间值有两个,则求平均值。
    select avg(income) from (
    select g1.income from graduates g1 ,graduates g2
    group by g1.income 
    having 
    /*我是这样理解的。
    count(*)/2可以看作是一组数据排序后的中间的值(组数据长度为偶数则中间值有两个),(sum(case when g1.income >= g2.income then 1 else 0 end) >= count(*)/2) 
    可以理解为判断该值是不是中间值的之前的最大值,如果是则sum的结果必定是大于等于中间值的。
    (sum(case when g1.income <= g2.income then 1 else 0 end) >= count(*)/2)
    同样,可以理解为判单g1.incom是不是中间值之后的数据中最小的值,如果大于g1.incom的值超过了count(*)/2,则该值必定小于等于中间值。
    两个条件同时满足则就是中间值(数据组中个数为偶数则中间值有两个)。
    */
    	(sum(case when g1.income >= g2.income then 1 else 0 end) >= count(*)/2)
    	and
    	(sum(case when g1.income <= g2.income then 1 else 0 end) >= count(*)/2)
    ) as t_graduates;
    

    特征函数:用来判断各个元素是否属于满足某个条件的结合。
    或则从定义了的集合的角度来说,他是定义函数。

    展开全文
  • 文章目录算数平均数、中位数、众数和几何平均数 算数平均数、中位数、众数和几何平均数 统计数据时经常用到的几种数的比较: 算数平均数 中位数 众数 几何平均数 英文名 Arithmetic mean Median Mode ...

    算数平均数、中位数、众数和几何平均数

    统计数据时经常用到的几种数的比较:

    算数平均数中位数众数几何平均数
    英文名Arithmetic meanMedianModeGeometric Mean
    别称均值中值
    定义n个变量的和除以n。中位数是按顺序排列的一组数据中居于中间位置的数,即在这组数据中,有一半的数据比他大,有一半的数据比他小。一组数据中,出现次数最多的数就叫这组数据的众数。几何平均数是n个变量值连乘积的n次方根。
    优点只需要知道变量组的总额,不需要知道每个变量值,就可以计算。不容易受极大值和极小值影响。数据项没有数值时也可以计算。不容易受极大值和极小值影响。
    缺点容易受极大值或极小值影响。需要知道每个变量的值,并且先排序,再找出中位数。需要知道每个变量出现的次数,仅适用于计算Top N的情况。变量值不能为0或负数,仅适用于具有等比或近似等比关系的数据。

    考虑上算数平均数和几何平均数的数据项采用不同的权重,就是加权算数平均数和加权几何平均数。

    在统计一般的“平均数”时,比如统计平均工资、平均房价时,用中位数比算数平均数更合理,可以避免受极大值或极小值影响。但是在实际中,考虑到统计成本,统计的样本比较小,统计数据缺失,统计对象的有意漏报错报,而算数平均数因为计算简单对数据要求不高,仍然被广泛使用。

    参考文档:

    展开全文
  • 给定一个有相同值的二叉搜索树(BST),找出 BST 中的所有众数(出现频率最高的元素)...解析:根据BST树的特征,BST树的中序遍历是一个非递减数列,所以求出树的中序遍历,再去遍历这个序列即可 /** * Definition fo
  • 二叉搜索树中的众数基本思想1:dfs+map统计次数基本思想2:中序遍历 题目:501. 二叉搜索树中的众数 给定一个有相同值的二叉搜索树(BST),找出 BST 中的所有众数(出现频率最高的元素)。 假定 BST 有如下定义: ...
  • 分析了当遥感分类类别存在光谱特征重叠时,以训练区数据估计类别总体特征发生偏差的原因和性质,提出运用众数滤波(Majority滤波)对训练区进行纯化。一个例子的研究表明,尤其在提取某一类或少数几类专题信息时,如果不...
  • 个人理解,说简单点: ...一组数据比较多(20个以上),范围比较集中,一般用众数 其余情况一般还是平均数比较精确 一、联系与区别:  1、平均数是通过计算得到的,因此它会因每一个数据的变化而变...
  • 众数与中位数典型例题》由会员分享,可在线阅读,更多相关《众数与中位数典型例题(3页珍藏版)》请在人人文库网上搜索。1、典型例题例1 求下列数据的众数(1)3,2,5,3,1,2,3(2)5,2,1,5,3,5,2,2分析:一...
  • matlab求五数概括与众数代码如下: clc; A=round(rand(3,21)*100); [r,c] = size(A); % 读取行r、列c A for i = 1:r % 建立for循环嵌套 %for k = 1:c %A(i,k) % 读取矩阵每个位置数据,先行后列 B = sort(A(i,:))...
  • 众数、中位数、分位数 2. 偏度、峰度 1. 众数、中位数、分位数 使用 numpy 的 median 函数可以得到其中位数,quantile 函数可以得到其分位数,但 numpy 包目前还没有计算众数的函数。例如: >>> a = [8, 19, 34, 9,...
  • 平均数、中位数、众数,在分析中如何使用?01 平均值的种类02 平均数、中位数还是众数?03 全距和数值分布 01 平均值的种类 请检查下面的陈述: 1、一个快速致富的方法就是做一名职业橄榄球员,2015年美国国家橄榄...
  • 众数特点:众数体现了样本数据的最大集中点, 但它对其它数据信息的忽视使得无法客观地反映总体特征众数容易计算,但不总是存在,众数只有在数据量较多时才有意义,数据量较少时不宜使用。主要适合作为分类数据...
  • 1 众数、中位数和均值的特点和应用场合1 .1 概念均值(mean): 样本中所有数的平均值。 众数(mode): 样本中出现次数最多的数。 中位数(median): 样本排序后,处于中间位置的那个数。 极差或全距(range) ...
  • 众数问题 算法分析 题意描述 输入一个大小为n的有序数组,求该数组中出现次数最多的数,及其出现的次数,注:当有多个数出现次数最多时,只输出一个。 算法过程描述 假设我们先求出中位数的重数,再求出中位数往左往...
  • 但是有时候图像的sku是粘连的,可以利用图像中sku的特点(每行的宽度相似,比较规范,那么只要不是超过50%粘连,众数就必定是区分的合理阈值,再利用极值点作为分割点,以及众数作为校验参数) /** * 纵向自动...
  • 众数:是一组数据中出现次数最多的数值;  众数、中位数与算术平均数之间有着一定的关系,这种关系决定于总体次数分布的状况。当次数分布呈对称的钟型分布时,算术平均数位于次数分布曲线的对称点上,而该点又是...
  • 本篇博客讲解了ADC采样原理、cube工程配置及代码实现,简单介绍了均值,中值,众数滤波方法及代码实现。
  • 平均数、中位数、众数都是度量一组数据集中趋势的统计量。所谓集中趋势是指一组数据向某一中心值靠拢的倾向,测度集中趋势就是寻找数据一般水平的代表值或中心值。而这三个特征数又各有特点,能够从不同的角度提供...
  • 对于未分组数据,众数可用Mode函数来求;对于分组数据的众数求解,大家可能比较陌生。 下面介绍一下如何求得分组数据(在原始数据的基础上进行过汇总的数据)的众数
  • 解(某企业50名工人加工零件中位数计算表): 由上表可知,中位数的位置=50/2=25,即中位数在120~125这一组,L=120,Sm − 1 = 16,U=125,Sm + 1 = 20,fm = 14,d=5,根据中位数公式得: (3)众数 众数是...
  • 首先我们来思考是2的幂次方具有什么特征: 1,大于0; 2,这个数的二进制位表达式中一定只有一个位置为1; 根据这些特点:我们想到了一个神奇的表达式:n=n&(n-1),这个表达式的神奇之处在于:每进行一次运算,n的二...
  • 估计误差小,能反映出所有的数据特征。 易受到粗大误差的影响,属于非稳健估计。 计算简单 几何均值 表示平均增长率或变化率。 不具有最佳性、属于非稳健估计。 在实际运用中使用的不多 调和均值 一般用来分析...
  • 分析过程对于建模非常的重要,可以帮助我们减少实际上不相关的特征被错误的加入到模型中,尽管在一些模型里,比如线性回归,在建模后期可以通过一定的方法将这些不相关的特征识别出来,但既然能够通过前期的数据观察...
  • 常见的统计,都会对数据进行相加,然后有平均数、中位数、众数等; 求和:(西格玛)∑x = x1 + x2 + x3 + .....+ xn  那么均值:我们这样来标记: (缪) μ = ∑x /n  (所有的数字相加之和 ∑)...
  • 平均数是一组数据的重心,是经多次测量正负误差互相抵消后事物特征的真实反映。 中位数:一组数据排序后,处于中间位置的那个数据,主要用于顺序数据的集中趋势度量,不适用于分类数据。 几何平均数:即对n个数据...
  • 数据描述性统计整理

    2019-09-30 19:16:16
    特征:数据集合中出现次数最多(不唯一) (备注:因为普通的scipy.stats.mode仅能返回最先出现的其中一个众数,所以以下我进行了扩充改写更符合众数的定义) #!/usr/bin/python # coding:utf-8 from scipy import stats...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 7,389
精华内容 2,955
关键字:

众数的特征