精华内容
下载资源
问答
  • 在讨论1的基础上,结合案例分析整理众数、中位数、平均数特点及其应用。 一、三个衡量指标的特点 ①众数特点:众数体现了样本数据的最大集中点, 但它对其它数据信息的忽视使得无法客观地反映总体特征。众数容易...

    在讨论1的基础上,结合案例分析整理众数、中位数、平均数的特点及其应用。

    一、三个衡量指标的特点

    ①众数特点:众数体现了样本数据的最大集中点但它对其它数据信息的忽视使得无法客观地反映总体特征。众数容易计算,但不总是存在,众数只有在数据量较多时才有意义,数据量较少时不宜使用。主要适合作为分类数据的集中趋势测度值,应用场合较少。

    ②中位数特点:中位数是样本数据所占频率的等分线,是一组数据的中间位置的代表值,直观并且它不受少数几个极端值的影响,这在某些情况下是优点,但它对极端值的不敏感有时也会成为缺点

    ③平均数特点:平均数=参与统计的样本数据之和÷与参与统计的样本数量,由此可见平均数与每一个样本的数据有关,所以任何一个样本数据的改变都会引起平均数的改变


    二、关于三个衡量指标的案例和应用

    某公司的10名营销人员在2019年完成的营销额情况如下所示,由于HR人员没有历史工作经验,因此她需要以历史数据为参考,制定2020年的营销额标准,则2020年的营销额标准设定为多少比较合适?

    营销额(单位:万元)

    3

    4

    5

    6

    7

    8

    10

    营销人员数量(单位:人)

    1

    3

    2

    1

    1

    1

    1

    分析:上述10名营销人员在2019年的营销额的三个衡量指标如下:

    众数:4万元 、中位数:5万元、平均数:5.6万元,因此,因为10名营销人员的平均营销额是5.6万元,如果2020年的营销额以2019年为参考的话,营销额标准设定为5.6万元比较合适,如果没有达到5.6万元,则认为没有达到平均水平,如果超过5.6万元,则认为超出平均水平,可以给予激励奖励。故2020年的营销额标准设定为5.6万元比较合适。

     

     

     

     

    展开全文
  • 平均数是一组数据的重心,是经多次测量正负误差互相抵消后事物特征的真实反映。 中位数:一组数据排序后,处于中间位置的那个数据,主要用于顺序数据的集中趋势度量,不适用于分类数据。 几何平均数:即对n个数据...

    即一组数据距离数据中心的靠近程度,反应了一组数据中心的位置所在

    数据集中趋势度量的指标有:众数、平均数、中位数、几何平均数等。

    众数:即出现次数最多的,常用在不同类别的数量统计中,不受峰值的影响,一组数据中可能会存在多个众数,不具备唯一性,数据量较少时意义不大。

    平均数:可分为简单平均数和加权平均数,简单平均数即一组数据的平均值,加权平均数即根据分组数据计算的平均数。平均数是一组数据的重心,是经多次测量正负误差互相抵消后事物特征的真实反映。

    中位数:一组数据排序后,处于中间位置的那个数据,主要用于顺序数据的集中趋势度量,不适用于分类数据。

    几何平均数:即对n个数据相乘后,开n次方,G=\sqrt[n]{x_{0}*x_{1}*...**x_{n}},几何平均数主要用于计算平均比率。比如一直股票的年收益率数据,计算平均每年的收益率,用几何平均数才是合理的,要注意几何平均数的变量不能是负数和0。

    下面针对几何平均数与简单平均数的差异进行说明:

    from functools import reduce
    import math
    
    #假设一只股票持有了5年,每年的年收益率数据如下,原始投入成本10000元
    rate = [0.045,0.021,0.255,0.019]
    
    #简单平均收益率
    sig_G = sum(rate)/len(rate)
    print ('简单平均收益率',sig_G)
    简单平均收益率 0.085
    
    #几何平均收益率
    j_G = math.pow(reduce(lambda x,y:x*y,[1+i for i in rate]),1/len(rate))-1
    print ('几何平均收益率',j_G)
    几何平均收益率 0.08078668483359586
    
    #实际收入
    rel_cont = 10000*(1+0.045)*(1+0.021)*(1+0.255)*(1+0.019)
    
    print ('实际收入',rel_cont)
    实际收入 13644.572785249995
    
    #按照简单平均收益率计算
    
    sig_cont=10000*(1+sig_G)**4
    
    print('简单平均收益',sig_cont)
    简单平均收益 13858.587006249998
    
    #按照几何平均收益率计算
    j_cont=10000*(1+j_G)**4
    
    print('几何平均收益',j_cont)
    几何平均收益 13644.572785249995

    可以看到简单平均收益与实际收益不符

    展开全文
  • 个人理解,说简单点: 一组数据中如果有特别大的数或特别小的数时,一般用中位数 一组数据比较多(20个以上),范围比较集中,一般用众数 ... 1、平均数是通过计算得到的,因此它会因每一个数据的变化而变...

    原文链接:http://www.360doc.com/content/18/0717/09/57858800_771067787.shtml

    个人理解,说简单点:
    一组数据中如果有特别大的数或特别小的数时,一般用中位数
    一组数据比较多(20个以上),范围比较集中,一般用众数
    其余情况一般还是平均数比较精确

    一、联系与区别:

      1、平均数是通过计算得到的,因此它会因每一个数据的变化而变化。

      2、中位数是通过排序得到的,它不受最大、最小两个极端数值的影响.中位数在一定程度上综合了平均数和中位数的优点,具有比较好的代表性。部分数据的变动对中位数没有影响,当一组数据中的个别数据变动较大时,常用它来描述这组数据的集中趋势。另外,因中位数在一组数据的数值排序中处中间的位置,

      3、众数也是数据的一种代表数,反映了一组数据的集中程度.日常生活中诸如“最佳”、“最受欢迎”、“最满意”等,都与众数有关系,它反映了一种最普遍的倾向.

    二、平均数、中位数和众数它们都有各自的的优缺点.

    平均数:
    (1)需要全组所有数据来计算;
    (2)易受数据中极端数值的影响.

    中位数:
    (1)仅需把数据按顺序排列后即可确定;
    (2)不易受数据中极端数值的影响.

    众数:
    (1)通过计数得到;
    (2)不易受数据中极端数值的影响

    关于“中位数、众数、平均数”这三个知识点的理解,我简单谈谈自己的认识和理解。
    ⒈众数。
    一组数据中出现次数最多的那个数据,叫做这组数据的众数。
    ⒉众数的特点。
    ①众数在一组数据中出现的次数最多;②众数反映了一组数据的集中趋势,当众数出现的次数越多,它就越能代表这组数据的整体状况,并且它能比较直观地了解到一组数据的大致情况。但是,当一组数据大小不同,差异又很大时,就很难判断众数的准确值了。此外,当一组数据的那个众数出现的次数不具明显优势时,用它来反映一组数据的典型水平是不大可靠的。
    3.众数与平均数的区别。
    众数表示一组数据中出现次数最多的那个数据;平均数是一组数据中表示平均每份的数量。
    4.中位数的概念。
    一组数据按大小顺序排列,位于最中间的一个数据(当有偶数个数据时,为最中间两个数据的平均数)叫做这组数据的中位数。
    5.众数、中位数及平均数的求法。
    ①众数由所给数据可直接求出;②求中位数时,首先要先排序(从小到大或从大到小),然后根据数据的个数,当数据为奇数个时,最中间的一个数就是中位数;当数据为偶数个时,最中间两个数的平均数就是中位数。③求平均数时,就用各数据的总和除以数据的个数,得数就是这组数据的平均数。
    6.中位数与众数的特点。
    ⑴中位数是一组数据中唯一的,可能是这组数据中的数据,也可能不是这组数据中的数据;
    ⑵求中位数时,先将数据有小到大顺序排列,若这组数据是奇数个,则中间的数据是中位数;若这组数据是偶数个时,则中间的两个数据的平均数是中位数;
    ⑶中位数的单位与数据的单位相同;
    ⑷众数考察的是一组数据中出现的频数;
    ⑸众数的大小只与这组数的个别数据有关,它一定是一组数据中的某个数据,其单位与数据的单位相同;
    (6)众数可能是一个或多个甚至没有;
    (7)平均数、众数和中位数都是描述一组数据集中趋势的量。
    7.平均数、中位数与众数的异同:
    ⑴平均数、众数和中位数都是描述一组数据集中趋势的量;
    ⑵平均数、众数和中位数都有单位;
    ⑶平均数反映一组数据的平均水平,与这组数据中的每个数都有关系,所以最为重要,应用最广;
    ⑷中位数不受个别偏大或偏小数据的影响;
    ⑸众数与各组数据出现的频数有关,不受个别数据的影响,有时是我们最为关心的数据。
    8.统计量。
    平均数、众数和中位数都叫统计量,它们在统计中,有着广泛的应用。
    9.举手表决法。
    在生活中,往往会有由多数人来从众多答案中选择一个的情形,一般都利用“举手表决”方式来解决问题。即在统计出所有提议及相应票数的情况下,看各票数的众数是否超过总票数的一半,如果众数超过了总票数的一半,选择的最终答案就是这个众数。如果出现了双众数(两个众数),可对这两个众数采用抓阄、抽签或投掷硬币等办法选出最终的答案。
    10.平均数、众数和中位数三种统计数据在生活中的意义。
    平均数说明的是整体的平均水平;众数说明的是生活中的多数情况;中位数说明的是生活中的中等水平。
    11.如何通过平均数、众数和中位数对表面现象到背景材料进行客观分析。
    在个别的数据过大或过小的情况下,“平均数”代表数据整体水平是有局限性的,也就是说个别极端数据是会对平均数产生较大的影响的,而对众数和中位数的影响则不那么明显。所以,这时要用众数活中位数来代表整体数据更合适。即:如果在一组相差较大的数据中,用中位数或众数作为表示这组数据特征的统计量往往更有意义。

    算数平均数、中位数与众数——统计量背后的故事

    现代经济社会的数字化程度越来越高,我们会发现在我们生活的这个世界里充斥着各种各样的数字。人们在描述事物或过程时,人们也已经习惯性的偏好于接受数字信息以及对于各种数字的整理和分析。因此,社会经济统计越发的重要。统计学一定是基于现实经济社会发展的需要牵引而不断发展的。在运用统计方法、观察统计数字时不能仅仅看到数字,更要看到数字背后的故事。其实统计学作为一门工具能够帮助我们更为深刻的理解抽象的社会经济现象。当我们仔细发掘其中涵义就会发现,其实自然科学与社会科学并不是相隔千里,它们有着很多地方可以相互的对应,存在普遍而深刻的联系。
    笔者曾在为一些本科学生讲授统计学而准备教案时,产生了一些似乎有些勉强,但的确可以训练思维的想法。下面以对于如何理解“算数平均数、中位数与众数”之间的关系为例说一说统计量背后的故事。这三个统计量都是用来描述样本集中趋势的,但三者描述的机制和所表达出来的内涵有不小的区别。算数平均数这样一个统计量反映了样本内所有个体的信息,尽管反映的程度因个体在整体中所占比重不同而不同。在政治过程中,算数平均数与完全的平均主义、严格的每人一票、“全民公投”等相对应。中位数指的在是从小到大排序之后的样本序列中,位于中间的数值,它并不能反映所有样本个体的信息,仅仅考虑的是在相对位置上中间的样本的信息。在一个社会中,按照财富和社会地位进行排序位于中间位置的是中产阶级。中产阶级的意见受到重视的社会是一个较为稳定的社会,是一个有了较高发展程度的社会。众数指的则是在样本中出现次数做多的个体。很明显,在政治过程中这是与“少数服从多数”相对应的。出现次数最多的个体信息被表达出来,其他个体的所有信息完全被忽视。那个个体票数最多,它的利益得以实现,而少数人的利益则不能够得到保证。这恰恰证明了所谓民主的局限之一,即“多数人对少数人的暴政”。
    在一个社会里,完全的平均主义会使人们失去进取的动力,“全民公投”的成本极高并且也不能保证个体表达出其真实意愿,因此这并不是理想的政治过程。在改革开放之前实行的计划经济体制最终走下了历史舞台也正是因为我们清楚地认识到了这样的问题;我们反对台湾当局针对台湾是否独立实行“全民公投”也正是基于这一点。那么美国式的民主,即“少数服从多数”是否理想呢?民主是有局限性的,如此的政治过程不能够保护少数人的利益,正是其重要的缺陷之一。况且如果需要政府来保障那些不能通过政治过程实现自身利益的个体,成本极高。相对而言,使中产阶级的利益得以表达,将会形成一个稳定的社会结构,市较为理想的政治过程。人们会有不断进取的心态使自己成为中产阶级,同时最富裕的阶层也受到了一定限制,从而不会凭借其财富垄断社会的公共资源,为整个社会提供了一套阶层之间相互流动的渠道和机制。当然,如此的政治过程仍然是具有一定局限性的。比如仍然会有部分弱势群体的利益得不到保护。但是,相对于“少数服从多数”的政治过程,政府出面保护弱势群体的成本将低得多了。那么我们能不能为社会提供一个最为理想的政治过程呢,哪怕那仅仅是一种理想呢?或许可以。在统计学中,最理想的情况是反映集中趋势的三个统计量相互重合,即算数平均数、中位数和众数相等。这种情况下的社会结构分布可以被看作为正态分布。中产阶级的在数量上占整体的多数,即为富裕与极贫困者皆为少数;中产阶级通过民主的政治过程表达出自身的利益取向;平均看来整个社会在一个较高的发展水平上运行。

    教参上说了他们三者的联系

    “重视理解平均数、中位数与众数的联系与区别。
    描述一组数据的集中趋势,可以用平均数、中位数和众数,它们有各自不同的特点。
    平均数应用最为广泛,用它作为一组数据的代表,比较可靠和稳定,它与这组数据中的每一个数据都有关系,能够最为充分地反映这组数据所包含的信息,在进行统计推断时有重要的作用;但容易受到极端数据的影响。
    中位数在一组数据的数值排序中处于中间的位置,故其在统计学分析中也常常扮演着“分水岭”的角色,人们由中位数可以对事物的大体趋势进行判断和掌控。
    众数着眼于对各数据出现的频数的考察,其大小仅与一组数据中的部分数据有关,当一组数据中有不少数据多次重复出现时,它的众数往往是我们关心的一种统计量。
    在这部分知识的教学中,要注意讲清上述三个量的联系与区别。使学生知道它们都是描述一组数据集中趋势的统计量,但描述的角度和适用范围有所不同,在具体的问题中究竟采用哪种统计量来描述一组数据的集中趋势,要根据数据的特点及我们所关心的问题来确定。”

    有个顺口溜 分析数据平中众,比较接近选平均,相差较大看中位,频数较大用众数;
       所有数据定平均,个数去除数据和,即可得到平均数;大小排列知中位;
       整理数据顺次排,单个数据取中问,双个数据两平均;频数最大是众数

    展开全文
  • 前言 读完sklearn....然而,进阶的特征工程往往依赖于数据分析师的直觉与经验,而且与具体的数据有密切的联系,比较难找到系统性的“最好”的特征工程方法。 在这里,我希望能向大家分享一种极其有效


    文章原网址: https://zhuanlan.zhihu.com/p/26308272


    • 高势集类别(High Categorical)进行经验贝叶斯转换成数值feature

        什么是High Categorical的特征呢?一个简单的例子就是邮编,有100个城市就会有好几百个邮编,有些房子坐落在同一个邮编下面。很显然随着邮编的数量增多,如果用简单的one-hot编码显然效果不太好,因此有人就用一些统计学思想(经验贝叶斯)将这些类别数据进行一个map,得到的结果是数值数据。在这场比赛中有人分享了一篇paper里面就提到了具体的算法。详细就不仔细讲了,用了这个encoding之后,的确效果提升了很多。那么这场比赛中哪些数据可以进行这样的encoding呢,只要满足下面几点:1. 会重复,2. 根据相同的值分组会分出超过一定数量(比如100)的组。 

    前言

    读完sklearn.preprocessing所有函数的API文档之后,基础的特征工程就可以算是入门了。然而,进阶的特征工程往往依赖于数据分析师的直觉与经验,而且与具体的数据有密切的联系,比较难找到系统性的“最好”的特征工程方法。

    在这里,我希望能向大家分享一种极其有效的、针对高基数定性特征(类别特征)的数据预处理方法。在各类竞赛中,有许多人使用这种方法取得了非常优秀的成绩,但是中文网络上似乎还没有人对此做过介绍。


    平均数编码:针对高基数定性特征(类别特征)的数据预处理

    Mean Encoding: A Preprocessing Scheme for High-Cardinality Categorical Features

    (论文原文下载:helios.mm.di.uoa.gr/~ro,感谢评论区@jin zhang提供更清晰的pdf版本)

    如果某一个特征是定性的(categorical),而这个特征的可能值非常多(高基数),那么平均数编码(mean encoding)是一种高效的编码方式。在实际应用中,这类特征工程能极大提升模型的性能。

    在机器学习与数据挖掘中,不论是分类问题(classification)还是回归问题(regression),采集的数据常常会包括定性特征(categorical feature)。因为定性特征表示某个数据属于一个特定的类别,所以在数值上,定性特征值通常是从0到n的离散整数。例子:花瓣的颜色(红、黄、蓝)、性别(男、女)、地址、某一列特征是否存在缺失值(这种NA 指示列常常会提供有效的额外信息)。

    一般情况下,针对定性特征,我们只需要使用sklearn的OneHotEncoder或LabelEncoder进行编码:(data_df是一个pandas dataframe,每一行是一个training example,每一列是一个特征。在这里我们假设"street_address"是一个字符类的定性特征。)

    from sklearn.preprocessing import OneHotEncoder, LabelEncoder
    import numpy as np
    import pandas as pd
    
    le = LabelEncoder()
    data_df['street_address'] = le.fit_transform(data_df['street_address'])
    
    ohe = OneHotEncoder(n_values='auto', categorical_features='all', dtype=np.float64, sparse=True, handle_unknown='error')
    one_hot_matrix = ohe.fit_transform(data_df['street_address'])
    

    LabelEncoder能够接收不规则的特征列,并将其转化为0n-1的整数值(假设一共有n种不同的类别);OneHotEncoder则能通过哑编码,制作出一个m*n的稀疏矩阵(假设数据一共有m行,具体的输出矩阵格式是否稀疏可以由sparse参数控制)。

    更详细的API文档参见:sklearn.preprocessing.LabelEncoder - scikit-learn 0.18.1 documentation以及sklearn.preprocessing.OneHotEncoder - scikit-learn 0.18.1 documentation

    这类简单的预处理能够满足大多数数据挖掘算法的需求。

    值得一提的是,LabelEncoder将n种类别编码为从0到n-1的整数,虽然能够节省内存降低算法的运行时间,但是隐含了一个假设:不同的类别之间,存在一种顺序关系。在具体的代码实现里,LabelEncoder会对定性特征列中的所有独特数据进行一次排序,从而得出从原始输入到整数的映射。


    定性特征的基数(cardinality)指的是这个定性特征所有可能的不同值的数量。在高基数(high cardinality)的定性特征面前,这些数据预处理的方法往往得不到令人满意的结果。

    高基数定性特征的例子:IP地址、电子邮件域名、城市名、家庭住址、街道、产品号码。

    主要原因:

    1. LabelEncoder编码高基数定性特征,虽然只需要一列,但是每个自然数都具有不同的重要意义,对于y而言线性不可分。使用简单模型,容易欠拟合(underfit),无法完全捕获不同类别之间的区别;使用复杂模型,容易在其他地方过拟合(overfit)。
    2. OneHotEncoder编码高基数定性特征,必然产生上万列的稀疏矩阵,易消耗大量内存和训练时间,除非算法本身有相关优化(例:SVM)。

    因此,我们可以尝试使用平均数编码(mean encoding)的编码方法,在贝叶斯的架构下,利用所要预测的应变量(target variable),有监督地确定最适合这个定性特征的编码方式。在Kaggle的数据竞赛中,这也是一种常见的提高分数的手段。


    基本思路与原理

    平均数编码是一种有监督(supervised)的编码方式,适用于分类和回归问题。为了简化讨论,以下的所有代码都以分类问题作为例子。

    假设在分类问题中,目标y一共有C个不同类别,具体的一个类别用target表示;某一个定性特征variable一共有K个不同类别,具体的一个类别用k表示。

    先验概率(prior):数据点属于某一个target(y)的概率,P(y = target)

    后验概率(posterior):该定性特征属于某一类时,数据点属于某一个target(y)的概率,P(target = y | variable = k)

    本算法的基本思想:将variable中的每一个k,都表示为(估算的)它所对应的目标y值概率

    \hat{P} (target = y | variable = k) 。(估算的结果都用“^”表示,以示区分)

    (备注)因此,整个数据集将增加(C-1)列。是C-1而不是C的原因:
    \sum_{i}^{}{\hat{P}(target = y_i | variable = k)} =1,所以最后一个y_i的概率值必然和其他y_i的概率值线性相关。在线性模型、神经网络以及SVM里,不能加入线性相关的特征列。如果你使用的是基于决策树的模型(gbdt、rf等),个人仍然不推荐这种over-parameterization。


    先验概率与后验概率的计算

    因为我们没有上帝视角,所以我们在计算中,需要利用已有数据估算先验概率和后验概率。我们在此使用的具体方法被称为Empirical BayesEmpirical Bayes method)。和一般的贝叶斯方法(如常见的Laplace Smoothing)不同,我们在估算先验概率时,会使用已知数据的平均值,而不是\frac{1}{C}

    接下来的计算就是简单的统计:

    \hat{P}(y = target) = (y = target)的数量 / y 的总数

    \hat{P}(target = y | variable = k) = (y = target 并且 variable = k)的数量 / (variable = k)的数量

    (其实我本来可以把公式用sigma求和写出来的,但是那样不太方便直观理解)

    使用不同的统计方法,以上两个公式的计算方法也会不同。

    权重

    我们已经得到了先验概率估计\hat{P}(y = target)和后验概率估计\hat{P}(target = y | variable = k)。最终编码所使用的概率估算,应当是先验概率与后验概率的一个凸组合(convex combination)。由此,我们引入先验概率的权重\lambda 来计算编码所用概率\hat{P}

    \hat{P} = \lambda * \hat{P}(y = target) + (1 - \lambda) * \hat{P}(target = y | variable = k)

    或:\hat{P} = \lambda * prior + (1 - \lambda) * posterior

    直觉上,\lambda 应该具有以下特性:

    1. 如果测试集中出现了新的特征类别(未在训练集中出现),那么\lambda = 1
    2. 一个特征类别在训练集内出现的次数越多,后验概率的可信度越高,其权重也越大。
    在贝叶斯统计学中, \lambda 也被称为shrinkage parameter。

    权重函数

    我们需要定义一个权重函数输入特征类别在训练集中出现的次数n,输出是对于这个特征类别的先验概率的权重\lambda。假设一个特征类别的出现次数为n,以下是一个常见的权重函数:

    \lambda(n) = \frac{1}{1 + e^{(n - k)/f}}

    这个函数有两个参数:

    k:当n = k时,\lambda = 0.5,先验概率与后验概率的权重相同;当n > k时,\lambda < 0.5

    f:控制函数在拐点附近的斜率,f越大,“坡”越缓。

    图示:k=1时,不同的f对于函数图象的影响。

    当(freq_col - k) / f太大的时候,np.exp可能会产生overflow的警告。我们不需要管这个警告,因为某一类别的频数极高,分母无限时,最终先验概率的权重将成为0,这也表示我们对于后验概率有充足的信任。


    延伸

    以上的算法设计能解决多个(>2)类别的分类问题,自然也能解决更简单的2类分类问题以及回归问题。

    还有一种情况:定性特征本身包括了不同级别。例如,国家包含了省,省包含了市,市包含了街区。有些街区可能就包含了大量的数据点,而有些省却可能只有稀少的几个数据点。这时,我们的解决方法是,在empirical bayes里加入不同层次的先验概率估计。


    代码实现

    原论文并没有提到,如果fit时使用了全部的数据,transform时也使用了全部数据,那么之后的机器学习模型会产生过拟合。因此,我们需要将数据分层分为n_splits个fold,每一个fold的数据都是利用剩下的(n_splits - 1)个fold得出的统计数据进行转换。n_splits越大,编码的精度越高,但也更消耗内存和运算时间。

    编码完毕后,是否删除原始特征列,应当具体问题具体分析。


    附:完整版MeanEncoder代码(python)。

    一个MeanEncoder对象可以提供fit_transform和transform方法,不支持fit方法,暂不支持训练时的sample_weight参数。

    import numpy as np
    import pandas as pd
    from sklearn.model_selection import StratifiedKFold
    from itertools import product
    
    class MeanEncoder:
        def __init__(self, categorical_features, n_splits=5, target_type='classification', prior_weight_func=None):
            """
            :param categorical_features: list of str, the name of the categorical columns to encode
    
            :param n_splits: the number of splits used in mean encoding
    
            :param target_type: str, 'regression' or 'classification'
    
            :param prior_weight_func:
            a function that takes in the number of observations, and outputs prior weight
            when a dict is passed, the default exponential decay function will be used:
            k: the number of observations needed for the posterior to be weighted equally as the prior
            f: larger f --> smaller slope
            """
    
            self.categorical_features = categorical_features
            self.n_splits = n_splits
            self.learned_stats = {}
    
            if target_type == 'classification':
                self.target_type = target_type
                self.target_values = []
            else:
                self.target_type = 'regression'
                self.target_values = None
    
            if isinstance(prior_weight_func, dict):
                self.prior_weight_func = eval('lambda x: 1 / (1 + np.exp((x - k) / f))', dict(prior_weight_func, np=np))
            elif callable(prior_weight_func):
                self.prior_weight_func = prior_weight_func
            else:
                self.prior_weight_func = lambda x: 1 / (1 + np.exp((x - 2) / 1))
    
        @staticmethod
        def mean_encode_subroutine(X_train, y_train, X_test, variable, target, prior_weight_func):
            X_train = X_train[[variable]].copy()
            X_test = X_test[[variable]].copy()
    
            if target is not None:
                nf_name = '{}_pred_{}'.format(variable, target)
                X_train['pred_temp'] = (y_train == target).astype(int)  # classification
            else:
                nf_name = '{}_pred'.format(variable)
                X_train['pred_temp'] = y_train  # regression
            prior = X_train['pred_temp'].mean()
    
            col_avg_y = X_train.groupby(by=variable, axis=0)['pred_temp'].agg({'mean': 'mean', 'beta': 'size'})
            col_avg_y['beta'] = prior_weight_func(col_avg_y['beta'])
            col_avg_y[nf_name] = col_avg_y['beta'] * prior + (1 - col_avg_y['beta']) * col_avg_y['mean']
            col_avg_y.drop(['beta', 'mean'], axis=1, inplace=True)
    
            nf_train = X_train.join(col_avg_y, on=variable)[nf_name].values
            nf_test = X_test.join(col_avg_y, on=variable).fillna(prior, inplace=False)[nf_name].values
    
            return nf_train, nf_test, prior, col_avg_y
    
        def fit_transform(self, X, y):
            """
            :param X: pandas DataFrame, n_samples * n_features
            :param y: pandas Series or numpy array, n_samples
            :return X_new: the transformed pandas DataFrame containing mean-encoded categorical features
            """
            X_new = X.copy()
            if self.target_type == 'classification':
                skf = StratifiedKFold(self.n_splits)
            else:
                skf = KFold(self.n_splits)
    
            if self.target_type == 'classification':
                self.target_values = sorted(set(y))
                self.learned_stats = {'{}_pred_{}'.format(variable, target): [] for variable, target in
                                      product(self.categorical_features, self.target_values)}
                for variable, target in product(self.categorical_features, self.target_values):
                    nf_name = '{}_pred_{}'.format(variable, target)
                    X_new.loc[:, nf_name] = np.nan
                    for large_ind, small_ind in skf.split(y, y):
                        nf_large, nf_small, prior, col_avg_y = MeanEncoder.mean_encode_subroutine(
                            X_new.iloc[large_ind], y.iloc[large_ind], X_new.iloc[small_ind], variable, target, self.prior_weight_func)
                        X_new.iloc[small_ind, -1] = nf_small
                        self.learned_stats[nf_name].append((prior, col_avg_y))
            else:
                self.learned_stats = {'{}_pred'.format(variable): [] for variable in self.categorical_features}
                for variable in self.categorical_features:
                    nf_name = '{}_pred'.format(variable)
                    X_new.loc[:, nf_name] = np.nan
                    for large_ind, small_ind in skf.split(y, y):
                        nf_large, nf_small, prior, col_avg_y = MeanEncoder.mean_encode_subroutine(
                            X_new.iloc[large_ind], y.iloc[large_ind], X_new.iloc[small_ind], variable, None, self.prior_weight_func)
                        X_new.iloc[small_ind, -1] = nf_small
                        self.learned_stats[nf_name].append((prior, col_avg_y))
            return X_new
    
        def transform(self, X):
            """
            :param X: pandas DataFrame, n_samples * n_features
            :return X_new: the transformed pandas DataFrame containing mean-encoded categorical features
            """
            X_new = X.copy()
    
            if self.target_type == 'classification':
                for variable, target in product(self.categorical_features, self.target_values):
                    nf_name = '{}_pred_{}'.format(variable, target)
                    X_new[nf_name] = 0
                    for prior, col_avg_y in self.learned_stats[nf_name]:
                        X_new[nf_name] += X_new[[variable]].join(col_avg_y, on=variable).fillna(prior, inplace=False)[
                            nf_name]
                    X_new[nf_name] /= self.n_splits
            else:
                for variable in self.categorical_features:
                    nf_name = '{}_pred'.format(variable)
                    X_new[nf_name] = 0
                    for prior, col_avg_y in self.learned_stats[nf_name]:
                        X_new[nf_name] += X_new[[variable]].join(col_avg_y, on=variable).fillna(prior, inplace=False)[
                            nf_name]
                    X_new[nf_name] /= self.n_splits
    
            return X_new

    展开全文
  • 平均指标的种类有:算术平均数、调和平均数、几何平均数、众数和中位数。前三种平均数是根据总体所有标志值计算的所以称为数值平均数,后两种平均数是根据标志值所处的位置确定的,因此称为位置平均数。   1、...
  • 1.指数平均数指标(EXPMA或EMA) 指数平均数指标(Exponential Moving Average,EXPMA或EMA) EXPMA=(当日或当期收盘价-上一日或上期EXPMA)/N+上一日或上期EXPMA,其中,首次上期EXPMA值为上一期收盘价,N为...
  • 测定样本中的各个体而得的样本特征数,如平均数等,称为统计数(statistic)。统计数是总体相应参数的估计值(estimate)。 要从样本估计总体的特征参数,需要考虑样本的代表性,样本越能近似地代表总体就越好。...
  • 平均数 2. 中位数和分位数 3. 两者的对比 4. 最大值和最小值 变异程度的度量 1. 方差和标准差 2. 极差和四分位数间距 3.变异系数 分布形状的度量 1. 偏度 2. 峰度 3. 示例 导读 楼主本人统计学专业在读,这几年也...
  • 摘要:平均鱼类的呼吸运动主要是依靠鳃盖拱起所引起的吸引力和口腔压缩所引起的压挤力产生。求职单位越来越看重毕业生的综合素质,标准所以专业课成绩并不是企业最看重的。()找到心仪的工作,算公式中前提是自己对于...
  • 协方差矩阵相关概念、性质、应用意义及矩阵特征向量的用处
  • 步骤2 + 步骤4 决定比较分布的特征   根据碧欧泉调研小组手头上的数据可知,一般总体(没有使用产品)分布中, μ=6.8\mu=6.8μ=6.8, σ=2\sigma=2σ=2,样本平均数 M=7.3M=7.3M=7.3 再根据上面提高的均值分布对应...
  • 对于数字特征的若干理解

    千次阅读 2017-11-17 17:17:33
     在我们学习概率论的时候,很多时候我们不能深刻理解概率论中的数字特征所具有的含义,本文章尝试去帮助读者理解一些术语、概念。   什么是数字特征?要回答这个问题,先得弄清楚什么是特征特征是一个客体或
  • 在线用户与并发用户的区别和比例关系 在线用户:用户同时在一定时间段的在线数量 并发用户:某一时刻同时向服务器发送请求的用户 一般而言,我们习惯以5-20的比率来推算并发用户与在线用户之间的关系。...
  • 平均分析法顾名思义,就是用平均数来反映数据在某一特征下的水平,平均分析通常和对比分析结合在一起,从时间和空间多个角度衡量差异,找到其中的趋势和规律。 01 不得不提的平均数 平均数用来反映一组数据的...
  • 处理空值的技巧 空值处理的第一种思路是“用最接近的数据来替换...第二种思路是针对数值型的数据,若出现空值,我们可以用该列数值型数据的平均值进行替换。如果条件允许,我建议采用众数进行替换,即该列数据当中出现
  • 对于概率论数字特征的理解

    万次阅读 多人点赞 2017-04-07 15:47:39
    参考数字特征概述 在我们学习概率论的时候,很多时候我们不能深刻理解概率论中的数字特征所具有的含义,本文章尝试去帮助读者理解一些术语、概念。    什么是数字特征?要回答这个问题,先得弄清楚什么是特征。...
  • 5.1.2数据的数字特征(1) 教科书 书名数学 B版 出版社人民教育出版社 出版日期2019年6月 学生信息 姓名 学校 班级 学号 学习目标 通过对实际情境数据的分析体会最值平均数中位数百分位数的作用能计算平均数及百分位数...
  • 文章目录一、指标平均数=均值公式介绍作用优缺点标准差公式介绍作用优缺点方差公式介绍作用优缺点公式介绍作用优缺点公式介绍作用优缺点公式介绍作用优缺点公式介绍作用优缺点公式...
  • 传热学相关的无量纲的物理意义

    万次阅读 2015-09-30 09:53:34
    无量纲在流体与传热中有重要作用,尤其对于传热学的工程计算,多数计算公式是以无量纲为基础的相似准则,所以理解无量纲的物理意义显得格外重要。无量纲 两个具有相同量纲的物理量的比值成为一个无量纲的...
  • 但在某些实际或理论问题中,人们感兴趣于某些能描述随机变量某一种特征的常数,例如,一篮球队上场比赛的运动员的身高是一个随机常量,人们常关心上场运动员的平均身高,一个城市一户家庭拥有汽车的辆。...
  • 1.基础知识(1)平均值(2)平均偏差平均偏差是数列中各项数值与其算术平均数的离差绝对值的算术平均数。平均偏差是用来测定数列中各项数值对其平均数离势程度的一种尺度。平均偏差可分为简单平均偏差和加权平均偏差...
  • 数据集中趋势 在统计研究中,需要搜集大量数据并对其进行加工整理,大多数情况下数据都会呈现...根据统计学知识,集中趋势指平均数,是一组数据中有代表性的值,这些数值趋向于落在数值大小排列的数据中心,被称为...
  • #数学# #头条教育# #我要上头条#方差是用来衡量一组数据波动大小的量,方差越大,表明这组数据偏离平均数越大,即波动越大,数据越不稳定;反之,方差越小,表明这组数据分布比较集中,各数据偏离平均数越小,即波动...
  • 特征向量的几何意义

    千次阅读 2014-04-27 10:08:51
    特征向量的几何意义 长时间以来一直不了解矩阵的特征值和特征...根据特征向量数学公式定义,矩阵乘以一个向量的结果仍是同维的一个向量,因此,矩阵乘法对应了一个变换,把一个向量变成同维的另一个向量
  • 特征向量和特征值的几何意义

    千次阅读 2012-05-27 11:24:51
    特征向量确实有很明确的几何意义,矩阵(既然讨论特征向量的问题,当然是方阵,这里不讨论广义特征向量的概念,就是一般的特征向量)乘以一个向量的结果仍是同维的一个向量,因此,矩阵乘法对应了一个变换,把一个...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 103,904
精华内容 41,561
关键字:

平均数的意义及特点