精华内容
下载资源
问答
  • 统计学在业内的应用1:分布、参数估计与假设检验及工业界应用统计学的方法应用框架1、统计学的学科逻辑2、分布2.1 何为分布2.2 概率分布函数(通常直接简称为分布函数)一、离散情况二、连续情况2.3、总体分布、样本...


    写在前面,由于篇幅比较长,我也是零散时间写的,所以文章总体上是有框架的,但是一些细节所放置的位置可能有所不妥当,可能需要辛苦读者朋友多次上下跳转。很是抱歉。

    统计学的方法应用框架

    在一线互联网公司技术岗工作了一年多的时间,先后从事了算法、统计学习方面的工作,作为一名本科数理统计出身的玩家,今天想对统计学的主要方法及在业内落地应用的场景做一个回顾和总结,利己利他,为大家讲明白,巩固一下自己的基本功,也是为以后留下一份比较好的笔记。

    篇幅可能比较长,读者朋友可以选取自己感兴趣的地方参考,也可以mark一下,以后用到的时候互相交流。

    在这篇Blog中,我主要会涉及到以下几个方面:

    1. 统计学的学科逻辑:统计学是一门方法论,是一个寄生学科,寄生在各行各业的数据中,脱离了行业场景和数据,统计学基本没有独立的用武之地;统计学的核心就是用样本数据(数据中的一部分数据)取描述甚至推断总体数据(全部数据),因为实际工作中,哪怕是在当下号称大数据时代的场景中,也很少有真真切切的全部数据,或者各种各样的原因无法获取全部数据,即使有全部数据,统计学依然有它发挥作用之处;
    2. 统计学的基础-抽样分布:一切的统计推断都是建立在某种分布假设或前提下的,抽样分布奠定了统计学一系列的方法论;
    3. 统计推断之参数估计:统计学宏观的讲我理解可以分为两部分,其一是描述统计,基本会以各种基础统计量(均值、标准差等)描述数据的分布情况,或以各种可视化的方式更好的理解数据,对数据做出洞察和洞见,这部分本篇中不会涉及,描述统计更像艺术,一个好的描述统计足以让阅读者了解数据的基本情况,描述统计的方式也多种多样,一千个人眼里有一千个哈姆雷特;其二是推断统计,及用样本数据的样子去推断(估计)总体数据的样子,本篇主要会回顾统计推断,首先是参数估计;
    4. 统计推断之假设检验:统计推断中比较重要的两块儿内容,其一是上述的参数估计,其二就是假设检验,假设检验通常更会直接影响决策;
    5. 统计学常用方法:本节会简单介绍一些统计学常用的方法,如实验设计常用的方差分析、预测问题常用的回归分析、降为问题常用的PCA,本篇不涉及具体原理,以后有空可以再其他篇幅中另外详细回顾;
    6. 统计学在业内的落地和应用场景:读者一定也很感兴趣统计学在工业界到底有哪些用途,本节会就我个人遇到的部分场景做一些介绍。

    1、统计学的学科逻辑

    统计学是一门寄生学科,是一门方法论,本质上要依托于实际工业而产生作用和价值。统计学的本质就是在有限的样本下,推断总体的情况。

    例1:比如说,我看好了一家公司的某个职位,我想了解一下应该要多少工资比较好,即所有员工的平均工资,而我又没有公司所有员工的工资条,那应该怎么办呢?比如说公司有200人,我随机在门口先后拦截了15个人套近乎,问道了他们的工资,假设他们都说了实话,那我求一个平均数和标准差,而我对自己的能力有比较强的自信,认为自己在平均水平之上,那我就在平均数上加上0.8倍的标准差,定为自己想要的薪资(当然,如果我不幸的选中了两个老板级别的人物,工资太高,我自然会对这两个样本进行删除,这便是离群值的处理),这样我就用了一部分数据推断了总体数据的平均水平。

    例2:再比如我想看该公司是否男女平等,同样的,选了15个男员工和15个女员工询问其工资,建立假设检验,检验男女员工工资是否存在差异,具体的后面会详细说明。

    综上所述,统计学是一门研究样本,使用样本对总体做出科学推断的学科。

    2、分布

    2.1 何为分布

    统计学的基础便是分布,何为分布?顾名思义,就是数据长什么样子,首先,分布是建立在随机变量上的,所谓随机变量,通常认为是随机事件的结果变量,例如掷骰子(6面骰),抛硬币(正反面),结果的情况就是概率分布,以掷6面的均匀骰子为例:

    投掷结果123456
    概率 1 6 \frac{1}{6} 61 1 6 \frac{1}{6} 61 1 6 \frac{1}{6} 61 1 6 \frac{1}{6} 61 1 6 \frac{1}{6} 61 1 6 \frac{1}{6} 61

    这便是概率分布。

    2.2 概率分布函数(通常直接简称为分布函数)

    我会先统一以离散情况(抛硬币,掷骰子这样结果可以逐一列出来的,不管结果是否是有限个,就属于离散随机变量,比如每天的温度这样无法一一列出来的的属于连续型随机变量,ps:原则上说,0摄氏度-1摄氏度直接有无限多个温度值,无法列出来)对分布相关的知识做回顾。
    为什么需要分布函数呢?因为实际情况中,像掷骰子这种只可能有6种结果的情况不在少数,但更多的情况下是结果非常多,100个,100万个,是指是无穷个可能的结果,这样我们编写表格是困难的甚至是不可实现的,那么我们就应当用一个高度概括的函数 f ( x ) f(x) f(x)去代替这个分布表格,取解决哪些数不过来的情况。

    一、离散情况

    依然以掷骰子的例子来说,一般教材中会先介绍一个概念叫做 “分布律”,也可能叫做“概率函数”,也有很多海归背景的人会叫他“概率质量函数”(感觉第三种叫法用的人比较多)它是啥呢?

    P ( X = X k ) = p k ( k = 1 , 2 , 3... , 对 于 掷 骰 子 , k = 1 , 2 , 3 , 4 , 5 , 6 ) P(X = X_k)=p_k (k=1,2,3...,对于掷骰子,k=1,2,3,4,5,6) P(X=Xk)=pk(k=1,2,3...,,k=1,2,3,4,5,6)

    切记,上面这个是分布率,不是概率分布函数。分布律描述的是出现某种结果(科学的说应该是每种各个结果)的概率。
    在分布律的基础下,就是概率分布函数:

    F ( x ) = P ( X < = x ) = ∑ x k < = x p k F(x)=P(X<=x)=\sum_{x_k<=x}p_k F(x)=P(X<=x)=xk<=xpk

    F ( x ) F(x) F(x)是概率分布函数(简称分布函数),概率分布函数是概率函数的累加,所以它又被叫做累计概率函数。本质上,概率函数(分布律)和累计概率函数(概率分布函数)是描述随机变量结果的两种方式,前者是描述单一结果的概率,后者则是累加多个单一结果的概率。(我承认各种概率函数、概率分布函数、累计概率函数特别烦人,各种名字,只能怪从外文翻译过来的种类太多了,大家习惯一下。。。我做了如下总结)

    对于离散型随机变量,有如下主要信息:
    1、概率函数(分布律,概率质量函数):probability mass function,简称PMF;描述的是离散随机变量出现某特定结果的概率;
    2、概率分布函数(分布函数,累积分布函数):cumulative distribution function,简称CDF,是对PMF的累加,能完整描述一个实随机变量X的概率分布
    3、另有 F ( a < x < b ) = F ( b ) − F ( a ) F(a < x < b)=F(b)-F(a) F(a<x<b)=F(b)F(a)

    PS:嗯。。。如果和别人就概率分布函数等概念交流起来有问题就用英文简称吧,一般不会有歧义。

    二、连续情况

    连续情况下,其实就没有分布律一说了,比如说在[1,100]实数范围内,取到1的概率是多少呢?0,在二维空间中求一维对象的任何值都是没有意义的。[1,100]实数集就是连续的,而[1,100]的整数就是离散的~。
    既然如此,连续随机变量下的PMF如何定义呢?在一个区间中,一个点的统计没有意义,但是一群点组成的一个子区间就是有意义的,好比一根线,你统计一个点的长度,是无法计算的,但是统计一段线的长度就是可以的。
    为了在连续型随机变量情况下给出PMF等价的概念,引入了“概率密度函数”probability density function简记PDF(可以简称密度函数)。如何理解“密度”这一概念,引用陈希孺老师所著的《概率论与数理统计》这本书中的讲解:
    Alt
    所以说,概率密度描绘的是随机变量落在一个点邻域(附近)的概率的变化情况(注意:并非概率本身而是变化情况),而概率分布函数(CDF)则是概率密度的积分(广义的说也就是求和),如下图所示:

    引用简书讲解
    Alt
    概率密度函数是概率分布函数的导函数,反之,概率密度函数的积分则是概率分布函数。如上图所示,曲线为概率分布函数曲线,它的斜率就是概率密度,切记,概率密度是变化速率,不是随机变量落在某范围内的概率值
    Alt

    对于连续型随机变量,有如下主要信息:
    1、概率密度函数(概率密度):probability density function,简称PDF;给出了 x i x_i xi落在某值 x x x邻域内的概率变化快慢,概率密度函数的值不是概率,而是概率的变化率,概率密度函数下面的面积才是概率
    2、概率分布函数:cumulative distribution function,简称CDF,是对PDF的积分,即面积,是 x i x_i xi落在某范围的概率。

    引用原文链接:https://blog.csdn.net/anshuai_aw1/article/details/82626468的说明,我觉得很形象:

    概率密度函数在某一参数下值的意义:比较容易理解的意义,某点的概率密度函数即为概率在该点的变化率(或导数)。该点概率密度值并非概率值.
    比如: 距离(概率)和速度(概率密度)的关系.
    某一点的速度,不能以为是某一点的距离,没意义;因为距离是从XX到XX的概念。所以概率也需要有个区间。这个区间可以是x的邻域(邻域大小可以无限趋近于0)。对x邻域内的 f ( x ) f(x) f(x)进行积分,可以求得这个邻域的面积,就代表了这个邻域所代表这个事件发生的概率。

    写在后面(参考出处):

    1、为何需要有概率分布函数:对于离散型随机变量,可以直接用分布律来描述其统计规律性,而对于连续型随机变量,无法一一列举出随机变量的所有可能取值,所以它的概率分布不能像随机变量那样进行描述,于是引入PDF,用积分来求随机变量落入某个区间的概率。
    分布律不能描述连续型随机变量,密度函数不能描述离散随机变量,因此需要找到一个统一方式描述随机变量统计规律,这就有了分布函数。另外,在现实生活中,有时候人们感兴趣的是随机变量落入某个范围内的概率是多少,如掷骰子的数小于3点的获胜,那么考虑随机变量落入某个区间的概率就变得有现实意义了,因此引入分布函数很有必要。
    2、概率分布函数的意义:分布函数在点处的函数值表示落在区间内的概率,所以分布函数就是定义域内的一个普通函数,因此我们可以把概率问题转化为函数问题,从而可以利用普通的函数知识来研究概率问题,增大了概率的研究范围。

    2.3、总体分布、样本分布、抽样分布

    一、总体、样本、抽样分布

    大数据时代下经常认为我们可以有总体数据,所谓总体数据,就是你研究对象的全集,就好比上文中公司员工工资的例子,你如果拿到了财务的员工工资清单,就有了所有人的工资,那便不需要做推断,有了全部的数据,你看到的即为真实的情况,这便是总体;但在没有这个清单的情况下,我选择随机的选取一部分人做调查,这部分人的工资就是样本,样本可大可小,可想而知,样本量越大(越接近总体),那样本产生的信息就越可信,越和总体真实情况一样。对应的,就有了总体分布和样本分布:

    • 总体分布:总体中各元素的观测值所形成的相对频数分布,称为总体分布。
    • 样本分布:从总体中抽取一个容量为 n n n的样本,由这 n n n个观测值形成的相对频数分布,称为样本分布。
      读者们应该还常听说一个名词,叫做抽样分布,抽样分布在课本中出现的频次甚至高于总体分布和样本分布,那么何为抽样分布?
    • 抽样分布:在重复选取样本量为 n n n的样本时,由该样本统计量的所有可能取值形成的相对频数分布。举个例子,你从一个容量为 N N N的总体中,抽取了1000次样本量未 n ( n < N ) n(n<N) n(n<N)的样本,统计这1000个样本的某个统计量,比如样本均值,那样本均值这个随机变量就是有分布的,它的分布叫做抽样分布。切记,抽样分布是统计量的分布。
      OK,了解了总体分布、样本分布和抽样分布后,补充介绍统计推断的两个奠基理论:大数定律&中心极限定理

    二、大数定律

    百度百科解释:在随机事件的大量重复出现中,往往呈现几乎必然的规律,这个规律就是大数定律。通俗地说,这个定理就是,在试验不变的条件下,重复试验多次,随机事件的频率近似于它的概率。偶然中包含着某种必然。即大量重复试验,随机事件发生的频率为其概率
    大数定律不会对已经发生的情况进行平衡,而是利用新的数据来削弱它的影响力,直至前面的结果从比例上看影响力非常小,可以忽略不计。 这就是大数定律发生作用的原理。 简而言之,大数定律发挥作用,是靠大数对小数的稀释作用。举个例子,你抛一个均匀正常的1元硬币,即使你十分的幸运,连续10次抛出正面,但是再抛1000次后,你会发现这1010次中正面出现的频数基本在一半左右,起初10次100%正面的作用在大量重复(大数)试验的作用下微乎其微,下图为用计算机模拟的10000次跑硬币得到正面的频率,可以发现,最终会收敛在0.5,这就是抛硬币得到正面的概率。
    归纳为一句话:随着样本量的增大,样本的均值几乎必然的等于真实总体的均值。()
    在这里插入图片描述

    三、中心极限定理

    中心极限定理的说明如下:

    大量的独立随机变量之和具有近似于正态的分布,教科书定义如下:
    设 随 机 变 量 X 1 , X 2 , … 独 立 同 分 布 , E X 1 = μ , V a r ( X 1 ) = σ 2 > 0 。 如 果 S n = ∑ j = 1 n X j , 则 S n 的 标 准 化 ξ n = S n − n μ n σ 2 → N ( 0 , 1 ) , 即 对 任 何 x i , lim ⁡ n → ∞ P ( ξ n ≤ x ) = P ( Z ≤ x ) , 其 中 Z ∼ N ( 0 , 1 ) 设随机变量X_1,X_2,…独立同分布,EX_1=\mu,Var(X_1)=\sigma^2>0。如果S_n=\sum\limits_{j=1}^{n}X_j,则S_n的标准化\xi_n=\frac{S_n-n\mu}{\sqrt{n\sigma^2}}\rightarrow N(0,1),即对任何x_i,\lim\limits_{n\rightarrow \infty}P(\xi_n\le x)=P(Z\le x),其中Z \sim N(0,1) X1,X2,EX1=μVar(X1)=σ2>0Sn=j=1nXjSnξn=nσ2 SnnμN(0,1)xinlimP(ξnx)=P(Zx)ZN(0,1)

    中心极限定理指的是给定一个任意分布的总体。我每次从这些总体中随机抽取 n 个抽样,一共抽 m 次。 然后把这 m 组抽样分别求出平均值。 这些平均值的分布近似正态分布。
    PS:关于大数率和中心极限定理一些理论概念的补充可以参考这个博客
    关于中心极限定理证明可以参考知乎回答

    2.4、常见分布

    一、二项分布

    回顾二项分布之前先来回顾伯努利分布:
    伯努利试验是单次随机试验,只有"成功(值为1)"或"失败(值为0)"这两种结果,是由瑞士科学家雅各布·伯努利(1654 - 1705)提出来的。例如掷一次硬币的结果(正vs反);买一注彩票(中vs不中);某篮球队伍一场比赛的结果(赢vs输)。

    其概率分布称为伯努利分布(Bernoulli distribution),也称为两点分布或者0-1分布,是最简单的离散型概率分布。我们记成功概率为 p ( 0 ≤ p ≤ 1 ) p(0≤p≤1) p(0p1),则失败概率为 q = 1 − p q=1-p q=1p

    若随机变量 X X X服从二项分布,则其数学期望和方差为:
    E ( X ) = p E(X)=p E(X)=p
    V a r ( X ) = p q Var(X)=pq Var(X)=pq

    接下来是二项分布:
    如前所述,某个伯努利实验,其成功概率用 p p p表示,失败的概率为 q = 1 − p q=1-p q=1p。进行 n n n次这样的试验,成功了 x x x次,则失败次数为 n − x n-x nx,发生这种情况的概率可用下面公式来计算(PMF):
    p ( x ) = C n x p x ( 1 − p ) n − x p(x)=C_n^{x}p^{x}(1-p)^{n-x} p(x)=Cnxpx(1p)nx

    若随机变量 X X X服从伯努利分布,记做 X ∼ B ( n , p ) X \sim B(n, p) XB(n,p),则其数学期望和方差为:
    E ( x ) = n p E(x)=np E(x)=np
    V a r ( x ) = n p ( 1 − p ) Var(x)=np(1-p) Var(x)=np(1p)

    当二项分布n较大(通常认为大于等于30)时,其分布近似于 N ( n p , n p ( 1 − p ) ) N(np, np(1-p)) N(np,np(1p))的正态分布。

    二、正态分布

    正态分布实际上是由二项分布经过一些推导得来的,具体的可以参考文章
    期望为 μ \mu μ,方差为 σ 2 \sigma^2 σ2的正态分布记为 N ( μ , σ 2 ) N(\mu, \sigma^2) N(μ,σ2)
    正态分布的概率密度函数如下所示:
    f ( x ) = 1 2 π σ e x p ( − ( x − μ ) 2 2 σ 2 ) f(x)=\frac{1}{\sqrt{2\pi} \sigma}exp(-\frac{(x-\mu)^2}{2\sigma^2}) f(x)=2π σ1exp(2σ2(xμ)2)
    正态分布PDF图如下所示:
    在这里插入图片描述

    三、泊松分布

    泊松分布适合于描述单位时间内随机事件发生的次数的概率分布。如某一服务设施在一定时间内受到的服务请求的次数(也是二项分布推导而来)。
    其概率质量函数如下:
    p ( X = k ) = e − λ λ k k ! p(X=k)=\frac{e^{-\lambda} \lambda^k}{k!} p(X=k)=k!eλλk
    若随机变量 X X X服从泊松分布 P ( λ ) P(\lambda) P(λ),在其期望和方差分别为:
    E ( X ) = λ E(X)=\lambda E(X)=λ
    V a r ( X ) = λ Var(X)=\lambda Var(X)=λ

    四、样本方差的抽样分布

    样本方差的抽样分布用 χ 2 \chi^2 χ2分布表示。设 μ 1 \mu_1 μ1 μ 2 \mu_2 μ2、…、 μ m \mu_m μm为m个独立同分布的标准正态变量,则其平方和 Y = ∑ i = 1 n μ i 2 Y=\sum_{i=1}^{n}\mu_i^2 Y=i=1nμi2的分布为自由度为 m m m χ 2 \chi^2 χ2分布,记做 χ 2 ( m ) \chi^2(m) χ2(m)
    E ( y ) = m E(y)=m E(y)=m
    V a r ( y ) = 2 m Var(y)=2m Var(y)=2m
    不同自由度的卡方分布如下图所示, n n n越大,其越近似与正态分布。
    在这里插入图片描述
    另,记样本方差为 s 2 s^2 s2,则:
    ( n − 1 ) s 2 σ 2 ∼ χ ( n − 1 ) \frac{(n-1)s^2}{\sigma^2}\sim\chi(n-1) σ2(n1)s2χ(n1)

    五、样本均值与样本标准差只比的t分布

    由中心极限定理可知,样本均值 x ‾ \overline{x} x的分布为 N ( μ , σ 2 n ) N(\mu,\frac{\sigma^2}{n}) N(μ,nσ2),其标准化变量 x ‾ − μ σ / n \frac{\overline{x}-\mu}{\sigma/{\sqrt{n}}} σ/n xμ服从 N ( 0 , 1 ) N(0,1) N(0,1),其中 μ \mu μ σ \sigma σ为总体均值和总体标准差。如果把标准化变量中的总体标准差更换为样本标准差 s s s,则前述标准化变量将服从自由度为 n − 1 n-1 n1 t t t分布,记做 t ( n − 1 ) t(n-1) t(n1)
    另,若 X X X~ N ( 0 , 1 ) N(0,1) N(0,1) Y Y Y ~ χ 2 ( n ) \chi^2(n) χ2(n),且 X X X Y Y Y相互独立,则 x Y / n \frac{x}{\sqrt{Y/n}} Y/n x~ t ( n ) t(n) t(n)

    • n = 1 n=1 n=1时, t t t分布为柯西分布,不存在数学期望;
    • n > 1 n>1 n>1时, t t t分布存在数学期望, E ( t ) = 0 E(t)=0 E(t)=0
    • n > 2 n>2 n>2时, t t t分布存在方差, V a r ( t ) = n n − 2 Var(t)=\frac{n}{n-2} Var(t)=n2n
      t t t分布的期望和方差可以看出,它很接近 N ( 0 , 1 ) N(0,1) N(0,1),尤其是当 n n n比较大的时候,二者是趋于一致的。如下图所示,样本量不太大时,t分布也是一个钟型线(同正态分布一样),只是它要更“矮”和更“平坦”一些。
      在这里插入图片描述

    六、两个独立正态样本方差之比的F分布

    X 1 ∼ χ 2 ( n 1 ) X_1\sim\chi^2(n_1) X1χ2(n1) X 2 ∼ χ 2 ( n 2 ) X_2\sim\chi^2(n_2) X2χ2(n2),且 X 1 X_1 X1 X 2 X_2 X2独立,则: F = X 1 / n 1 X 2 / n 2 F=\frac{X_1/n_1}{X_2/n_2} F=X2/n2X1/n1,记为 F ( n 1 , n 2 ) F(n_1,n_2) F(n1,n2)( X 1 X_1 X1 X 2 X_2 X2可以视作样本方差的分布,这样就记住F分布的含义了,样本方差服从卡方分布,两个卡方分布之比是 F F F分布)。

    • n 2 > 2 n_2>2 n2>2时, F F F分布数学期望存在, E ( F ) = n 2 n 2 − 2 E(F)=\frac{n_2}{n_2-2} E(F)=n22n2
    • n 2 > 4 n_2>4 n2>4时, F F F分布方差存在, E ( F ) = 2 n 2 2 ( n 1 + n 2 − 2 ) n 1 ( n 2 − 2 ) 2 ( n 2 − 4 ) E(F)=\frac{2n_2^2(n_1+n_2-2)}{n1(n_2-2)^2(n_2-4)} E(F)=n1(n22)2(n24)2n22(n1+n22)
    • KaTeX parse error: Undefined control sequence: \simF at position 2: F\̲s̲i̲m̲F̲(n_1,n_2),则 1 F ∼ F ( n 2 , n 1 ) \frac{1}{F}\sim F(n_2,n_1) F1F(n2,n1)
    • t ∼ t ( n ) t\sim t(n) tt(n),则 t 2 ∼ F ( 1 , n ) t^2\sim F(1, n) t2F(1,n)
      不同自由度的 F F F分布的分布图如下所示:
      在这里插入图片描述

    3、参数估计

    参数估计是统计学中的核心方法之一,所谓“估计”——就是在我们不知道真实值的情况下推真实值进行一个推断,通常有点估计、区间估计两种方式。因为往往,我们并不知道总体的全部数据,例如我们想知道某个时间结点下北京市所有人的平均身高 H H H,这是 H H H就是我们的未知参数。总体就是北京市全部人口的身高,而在不进行普查的情况下,我们是获取不到这个数据的,这就需要我们使用一些方法,推测这个 H H H,这就是参数估计。

    3.1、点估计

    点估计推断总体阐述的方式基本思路是获取到一个样本,用样本的平均值 H ^ \hat{H} H^代替总体的平均值。这就叫做“点估计”。
    常见的点估计方法包括:矩法估计、极大似然估计(暂时不详细展开了)。
    点估计的可靠性是由其抽样分布的标准误差(通常也叫做标准误)来衡量的。

    这里,要说明一下标准差(standard deviation)标准误差(standard error) 的差异:

    • 标准差就不多说了,描述数据的离散程度,任何一个总体都有其总体标准差(通常用 σ \sigma σ 表示),当我们无法获取总体全部,而是使用一个样本的时候,对应的产生样本标准差(通常用 s s s表示, s = 1 n − 1 ∑ i = 1 n ( x i 2 − x ‾ ) 2 s=\sqrt{\frac{1}{n-1}\sum_{i=1}^{n}(x_i^2-\overline x)^2} s=n11i=1n(xi2x)2 )
    • 而标准误差( S E SE SE)是抽样分布(样本统计量的分布)的标准差。通常是在推断统计例如参数估计的过程中用来评价估计的有多准确或者有多离谱的场景下使用的(本质也是描述离散程度)。当我们无法获取总体,我们可以尽可能多的从标准差为 σ \sigma σ的总体中抽取样本量为 n n n的样本,每个样本有一个均值 x ‾ \overline x x,样本平均值的标准差 S D x ‾ = σ n SD_{\overline x}=\frac{\sigma}{\sqrt n} SDx=n σ,这是大数定律告诉我们的,而我们并不知道总体标准差,所以用样本标准差 s s s代替 σ \sigma σ,即 S E x ‾ = s n SE_{\overline x}=\frac{s}{\sqrt n} SEx=n s
      二者的核心差异在于标准差是某一次抽样得到样本后的样本离散程度度量,而标准误是多次抽样后得到了多个样本均值组成的新样本(比如100次抽样,得到了100个 x ‾ \overline x x,这就是咱们算 S E SE SE用的新样本)的离散程度。
      请牢记标准误差,它将是后面推断统计中的一个重要因素!

    下面简单回顾一下无偏估计和有偏估计:
    有偏估计和无偏估计
    左侧是一个估计值 A ^ \hat A A^的概率密度函数(代表了它的抽样分布),虚线对应的 A ^ \hat A A^的数学期望等于总体分布的总体均值 A A A,这就是无偏估计,若二者不等,如右图,则为有偏估计。还有一个概念叫做“渐进无偏估计”,是说当n很大(趋于无穷)时,估计值为渐进无偏估计。例如,样本方差( s 2 = 1 n − 1 ∑ ( x i 2 − x ‾ ) 2 s^2=\frac{1}{n-1}\sum(x_i^2-\overline x)^2 s2=n11(xi2x)2)是总体方差 σ 2 \sigma^2 σ2的无偏估计,而样本的平均偏差平方和( s n 2 = 1 n ∑ ( x i 2 − x ‾ ) 2 s_n^2=\frac{1}{n}\sum(x_i^2-\overline x)^2 sn2=n1(xi2x)2)则是总体方差 σ 2 \sigma^2 σ2总体的渐进无偏估计,显而易见,n很大时二者趋于相等。

    3.2、区间估计

    用一个样本得到的估计值代表总体参数的估计值可能或多或少有点儿“一言堂”,有些中央集权了,而区间估计是在点估计的基础上给出总体参数估计的一个估计区间(上下限),该区间是由样本统计量加减估计误差得到的,这样就比较民主,且把握更大(好比射击打靶,命中靶心是很难得,就那一个点,但是命中靶子或者命中靠近靶心的区域是简单的、更有把握的)。区间估计示意图如下所示:
    在这里插入图片描述
    样本均值 x ‾ \overline x x的数学期望为 μ \mu μ,标准误差为 σ n \frac{\sigma} {\sqrt n} n σ,则样本均值落在总体均值1个标准误差范围内的概率是68%;2个标准误差内的概率为95%,3个标准误差范围内的概率是99.7%。实际用用中, μ \mu μ是未知的, x ‾ \overline x x是已知的,所以反其道而行之,若样本均值落在总体均值1个标准误差范围内,则说明总体均值包括在以 x ‾ \overline x x为中心,左右两侧1个标准误差范围内。( x ‾ \overline x x落在 μ \mu μ的1.65、1.96、2.58倍标准误差范围内的概率分别为90%、95%、99%)。
    由样本估计量构造出的总体参数在一定置信水平下的估计区间称为置信区间。何为“置信”,就是在一定程度上确信该区间会包含真实的总体参数。例如95%置信区间的含义是:重复抽样若干次(比如100次),每次抽样都可以构造出一个估计区间,其中95个区间包含了真实的总体参数值,5%没有包含。95%称为置信水平或置信度或置信系数。

    3.3、评价估计量的标准

    1、无偏性(前面已经提及,不重复赘述);
    2、有效性:估计量的方差尽可能小。用估计量的方差或标准误来度量;
    3、一致性:随着样本量的增大,点估计量的值与被估计的总体参数越来越仅仅。

    3.4、常见区间估计

    一、单总体参数区间估计
    单总体均值区间估计的核心思想是:
    x ‾ ± ( 分 位 数 值 × x ‾ 的 标 准 误 差 ) \overline x±(分位数值×\overline x的标准误差) x±(×x)
    单总体比例区间估计的核心思想是( p p p为样本比例):
    p ± ( 分 位 数 值 × p 的 标 准 误 差 ) p±(分位数值×p的标准误差) p±(×p)
    在这里插入图片描述
    二、两总体参数区间估计
    两总体均值区间估计核心思想:
    ( x 1 ‾ − x 2 ‾ ) ± 分 位 数 值 × ( x 1 ‾ − x 2 ‾ ) 的 标 准 误 差 (\overline {x_1}-\overline {x_2})±分位数值×(\overline {x_1}-\overline {x_2})的标准误差 (x1x2)±×(x1x2)
    两总体比例区间估计核心思想:
    ( p 1 − p 2 ) ± 分 位 数 值 × ( p 1 − p 2 ) 的 标 准 误 差 (p_1-p_2)±分位数值×(p_1-p_2)的标准误差 (p1p2)±×(p1p2)
    在这里插入图片描述
    其中,上图中 s p 2 = ( n 1 − 1 ) s 1 2 + ( n 2 − 1 ) s 2 2 n 1 + n 2 − 2 s_p^2=\frac{(n_1-1)s_1^2+(n_2-1)s_2^2}{n_1+n_2-2} sp2=n1+n22(n11)s12+(n21)s22 v = ( s 1 2 n 1 + s 2 2 n 2 ) 2 ( s 1 2 / n 1 ) 2 n 1 − 1 + ( s 2 2 / n 2 ) 2 n 2 − 1 v=\frac{(\frac{s_1^2}{n_1}+\frac{s_2^2}{n_2})^2}{\frac{(s_1^2/n_1)^2}{n_1-1}+\frac{(s_2^2/n_2)^2}{n_2-1}} v=n11(s12/n1)2+n21(s22/n2)2(n1s12+n2s22)2 d ‾ \overline d d表示各组配对样本差值的均值。
    三、区间估计样本量确定
    E E E代表允许的估计误差
    1、估计总体均值时样本量确定:

    • 估计单总体均值: n = ( z α / 2 ) 2 σ 2 E 2 n=\frac{(z_{\alpha/2})^2\sigma ^2}{E^2} n=E2(zα/2)2σ2
    • 估计两总体均值差: n 1 = n 2 = ( z α / 2 ) 2 ( σ 1 2 + σ 2 2 ) E 2 n_1=n_2=\frac{(z_{\alpha/2})^2(\sigma_1^2+\sigma_2^2)}{E^2} n1=n2=E2(zα/2)2(σ12+σ22)

    2、估计总体比例时样本量确定:

    • 估计一个总体比例: n = ( z α / 2 ) 2 π ( 1 − π ) E 2 n=\frac{(z_{\alpha/2})^2\pi(1-\pi)}{E^2} n=E2(zα/2)2π(1π),其中 π \pi π为总体比例;
    • 估计两个总体比例差: n 1 = n 2 = ( z α / 2 ) 2 ( π 1 ( 1 − π 1 ) + π 2 ( 1 − π 2 ) ) E 2 n_1=n_2=\frac{(z_{\alpha/2})^2(\pi_1(1-\pi_1)+\pi_2(1-\pi_2))}{E^2} n1=n2=E2(zα/2)2(π1(1π1)+π2(1π2))

    4、假设检验

    4.1、假设检验基本概念

    假设检验是推断统计中另一个重要的分支,与参数估计地位不相上下。参数估计是用样本信息推断未知的总体参数,而假设检验是对总体参数提出一个假设值,然后利用样本去判断这个假设是否成立。假设检验中分位两种假设:

    • 原假设(零假设,null hypothesis):通常是我们想要推翻的假设,用 H 0 H_0 H0表示;
    • 备择假设(alternative hypothesis):通常是我们希望证明成立的假设,用 H 1 H_1 H1表示。

    例如:
    H 0 : μ 1 = μ 2 H_0:\mu_1=\mu_2 H0:μ1=μ2
    H 1 : μ 1 ≠ μ 2 H_1:\mu_1≠\mu_2 H1:μ1=μ2
    原假设最初被假设为成立的,然后根据样本数据确定是否有足够的证据拒绝(推翻)这个假设。
    假设检验中,若备择假设没有方向性,使用 ≠ ≠ =,这样的假设检验称为双侧检验,如果备择假设有方向性,并含有 > > > < < <的假设检验称为单侧检验( < < <对应左侧检验, > > >对应右侧检验)。

    4.2、如何完成假设检验

    一、两类错误与显著性水平

    我们知道,样本具有随机性,我们用具有随机性的样本去推断总体是存在一定风险的,也就是说在假设检验的场景中,我们不一定能做到100%的正确,存在犯错误的风险。理想情况是:当原假设正确时,我们不拒绝它;当它不正确时,我们拒绝了它。对应的,我们就会用两种错误:

    • 1、原假设正确,但是我们拒绝了原假设,称为第一类错误,也叫拒真错误,犯第一类错误的概率记为 α \alpha α,故这类错误也成为 α \alpha α错误;
    • 2、原假设错误,但我们没能拒绝它,称为第二类错误,也叫取伪错误,犯错误的概率记为 β \beta β,故这类错误也成为 β \beta β错误。

    也就是拒绝原假设时我们就有可能犯第一类错误;未拒绝原假设时有可能犯第二类错误; α \alpha α β \beta β在样本来量一定时,是跷跷板的关系,无法同时减小(其加和不是1)。同时减少二者的唯一方式就是增加样本量。按道理说,哪种错误会导致更严重的后果,我们就应当首先降低这种错误(比如原假设是某个病毒对人类无害,不需要注意,如果我们犯了第二类错误,即病毒对人有害,而我们没有拒绝原假设,认为病毒无害,可能就会带来一场空前绝后的传染病,但如果我们犯第一类错误,即病毒对人无害,但我们拒绝了它,认为病毒对人有害,我们进行了一系列措施防治,顶多是多花费了一些金钱,老话说得好,有备无患,钱能解决的问题都不叫问题,花钱买平安,那么其实犯第二类错误的后果更严重,那么我们可以努力降低 β \beta β,对应的,适当放松对 α \alpha α的要求)。实际情况中, α \alpha α可以由研究者实现控制,而 β \beta β相对难以计算,所以我们通常是先控制 α \alpha α
    假设检验中犯第一类错误的概率称为显著性水平,记为 α \alpha α显著性水平是研究者事先指定的犯第一类错误概率的最大允许值( α \alpha α越小,对应 β \beta β就会越大, α \alpha α通常为 0.05 0.05 0.05,或 0.01 0.01 0.01,或 0.1 0.1 0.1)。

    二、如何决策

    1、用统计量决策

    我们用样本可以对总体参数(比如总体均值)做出点估计,将这个点估计标准化后,就可以度量它与原假设参数值之间的差异程度(在均值和比例的假设检验下通常是这样的方法):
    标 准 化 检 验 统 计 量 = 点 估 计 量 − 假 设 值 点 估 计 量 的 标 准 误 差 标准化检验统计量=\frac{点估计量-假设值}{点估计量的标准误差} =
    该量反映了点估计量与假设的总体参数相比差了多少个标准差的距离。
    有了样本,就可以计算标准化检验统计量,我们实现给定显著性水平 α \alpha α后,可以在统计量的分布上找到临界值,根据您显著性水平和对应的临界值围成的区域称为==“拒绝域”==,若统计量落在拒绝域内就拒绝原假设,反之不拒绝。用统计量判断是否拒绝原假设的方式,在双侧和单侧检验的情况如下图所示:
    在这里插入图片描述

    2、用p值决策

    用统计量检验,不管统计量的值是大还是小,只要它落入拒绝域就会拒绝原假设,此时,我们只能说犯第一类错误的概率是 α \alpha α,但实际上,统计量不同值,或者说它落在拒绝域的不同位置,对应犯第一类错误的概率是不同的。所以如果能把犯第一类错误的概率计算出来,是更好的选择。这个概率就是 P P P值。
    P P P值的意义是:如果原假设正确,那么得到的样本结果会像实际观测结果那么极端或更极端的概率称为 P P P值,也称为观察到的显著性水平。
    判断规则很简单:如果 P P P值小于显著性水平则拒绝原假设,反之不拒绝。

    三、多说一些

    1、p值的含义

    关于p值,我想多说一些:

    美国统计学会(American Statistical Association, ASA)明确告诉我们:
    P-values do not measure the probability that the studied hypothesis is true, or the probability that the data were produced by random chance alone.
    ( p值不是“我们研究的假设是真的”的概率,也不是“数据仅仅由随机因素产生的”的概率)

    p值解释的并非假设本身,而是数据和假设的关系(比如,我们收集到的A组和B组的数据,和假设“A与B的平均值存在明显差异”的关系)。这是因为,假设本身要么就是对的,要么就是错的,不存在一个概率的问题
    举个例子:我们得到了A公司中部分普通职员中男性员工的工资和女性工资数据,其中男性平均月薪7500元,女性平均月薪7300元,我们想证明男女员工工资存在明显差异,即原假设是男员工工资=女员工工资,备择假设是二者不等。进行两双样本t检验后,得到了p值为0.013,那么这个p值的含义是什么呢?它的含义是:如果我们的假设是正确的(即男性员工工资与女性员工工资没有差异),那么我们在这个样本下得到男性员工与女性员工工资相差200元这个结果,甚至于更极端(差异大于200元)的结果的概率是0.013。

    p值描述的是:如果原假设是正确的,我们得到某次观测值甚至更极端的值的概率

    其实,p值描述的是数据和一个特定的统计学模型(原假设)的不匹配程度:p值越小,数据和该统计学模型的不匹配程度就越大。

    可以看到,如果我们的原假设正确,我们得到如同当前样本表现或者更极端表现结果的概率只有0.013(1.3%),相当低,所以我们有比较充分的理由怀疑原假设的正确性,如果将显著性水平定为0.05,我们可以拒绝原假设,即拒绝男女工资无差异的原假设。

    2、显著≠大效应

    所谓效应,对于上述案例,就是这个差异的大小,上述案例在7000+工资范围上存在200的差异,看起来不太小,假如大家的公司不是7000+这个水位,而是700000+(好有钱啊。。。。),那么200这个差异可以说是微乎其微,效应很小,所以,pvalue很小,我们可能认为存在统计显著,但和存在大的效应是两码事。

    3、p>0.05(或某个显著性水平)≠无效

    如果pvalue大于显著性水平下,我们通常认为无统计显著性,但正如之前所说的,pvalue说的是假设与样本数据之间的关系,我们只能说pvalue带给我们的信息是目前的样本无法作为拒绝原假设证据,而不是原假设成立的证据,不拒绝原假设不代表原假设为真的概率很高。对应到例子就是,加入pvalue比较大,为0.3,那么它的含义是说当前没有足够的证据说明男女工资存在差异,并不能说明我们可以证明男女工资相等。
    上述说明主要受到于个人图书馆360doc文章的启发,这个文章讲的很好。

    四、总体参数的检验

    1、单个总体参数的假设检验

    单个总体参数(如总体均值、总体比例、总体方差)的假设检验通常是通过样本检验总体参数是否等于(或大于或小于)某个常数值,比如通过一个班的男生学生身高作为样本,检验全校男生学生平均身高是否等于175cm。
    总体均值、方差的检验,要求总体服从正态分布。
    在这里插入图片描述

    2、两个总体参数的假设检验

    首先是两总体均值差的检验,统计量如下所示,其中: s p 2 = ( n 1 − 1 ) s 1 2 + ( n 2 − 1 ) S 2 2 n 1 + n 2 − 2 s_p^2=\frac{(n_1-1)s_1^2+(n_2-1)S_2^2}{n_1+n_2-2} sp2=n1+n22(n11)s12+(n21)S22 v = ( s 1 2 n 1 + s 2 2 n 2 ) 2 ( s 1 2 n 1 ) 2 n 1 − 1 + ( s 2 2 n 2 ) 2 n 2 − 1 v=\frac{(\frac{s_1^2}{n_1}+\frac{s_2^2}{n_2})^2}{\frac{(\frac{s_1^2}{n_1})^2}{n_1-1} + \frac{(\frac{s_2^2}{n_2})^2}{n_2-1}} v=n11(n1s12)2+n21(n2s22)2(n1s12+n2s22)2
    在这里插入图片描述
    两总体比例差有两种情况:检验二者相等或二者差为某固定值,如下所示,其中 p p p为两样本中合并的比例: p = p 1 n 1 + p 2 n 2 n 1 + n 2 p=\frac{p_1n_1+p_2n_2}{n_1+n_2} p=n1+n2p1n1+p2n2。比例检验中通常要求 n 1 p 1 、 n 1 ( 1 − p 1 ) 、 n 2 p 2 、 n 2 ( 1 − p 2 ) n_1p1、n_1(1-p_1)、n_2p_2、n_2(1-p_2) n1p1n1(1p1)n2p2n2(1p2)都大于等于10,就认为是大样本,大样本下可得到样本比例差的抽样分布为正态分布。
    在这里插入图片描述
    两总体方差比,要求两总体独立,服从正态:
    H 0 : σ 1 2 σ 2 2 = 1 H_0:\frac{\sigma_1^2}{\sigma_2^2}=1 H0:σ22σ12=1
    H 1 : σ 1 2 σ 2 2 ≠ 1 H_1:\frac{\sigma_1^2}{\sigma_2^2}≠1 H1:σ22σ12=1
    检验统计量为:
    F = s 1 2 s 2 2 F=\frac{s_1^2}{s_2^2} F=s22s12

    写在后面:这里着重说一下独立样本和配对样本,所谓独立样本,顾名思义,两组样本是独立的,顾不干扰,例如选取两个班级男生的身高,作为两个组,他们就是独立的;而配对样本是说他们是有联系的,比如10个患者用药前的效果,和他们用药后效果的差异,这就属于配对样本了。对应的区间估计和假设检验的统计量是不同的。

    5、统计学常用方法梳理

    待补充

    6、业内应用场景

    待补充

    展开全文
  • ,其实取几倍的标准误,就看你要多大的置信区间,但置信区间不是越大越好,置信区间大了,你估计的把握是大了,但是你作出的估计可能就没有什么实际价值,置信区间越小,给的信息量就越大,越有价值 均值的标准...

    主要内容

    • 假设检验与单样本T检验
    • 两样本T检验
    • 方差分析(分类变量和连续变量关系检验)
    • 相关分析(两连续变量关系检验)
    • 卡方检验(两分类变量关系检验)

    研究两个变量是否有关系,即是否独立,如身高与性别是否有关系,男生的身高均值与女生身高的均值是不等的,它们的差不为零,但其实很多变量(如性别男、女)之间的均值之差都不为零,那它们均值之差到什么程度才认为这两个变量是有关系的,是独立的呢?

    两变量关系检验方法综述

    通过数据得到统计量,然后作出假设

    总体 – 研究所感兴趣的所有个体组成总体

    样本 – 从总体抽取的部分个体组成样本,样本用于对总体的某些指标作推断使用

    统计量由样本获取,用于对总体的参数进行估计

    样本统计量是随机变量,因为样本是随机抽取的,但总体参数不是随机变量,是真实存在的,只是我们不知道,我们只能用样本统计量去估计它

    如点估计,就直接认为样本统计量就是总体参数

    但点估计准不准呢,样本的变异来自于抽样的偏差

    如2012年的时候房屋价格增长最快的是学区房,非学区房涨的慢,我们抽样有可能抽的涨的快的地方,计算的平均增长率就大,拿一次抽样的点代表总体就有问题了,然后置信区间就出来了

    我们根据样本的均值估计出一个区间来,我们认为总体的均值是有一定的概率落在这个区间之内的,这个概率我们就叫做置信度,得到这个置信度是95%,我们就认为有95%的把握这个均值是在这个置信区间里面的。

    我们怎么确定这个区间多大呢,以正太分布来说,我们以均值为中心,取两倍的标准差,得(μ-2σ,μ+2σ),通过这个方法作置信区间,我们通常的做法也就是这样,注意我们作置信区间时,中心点是样本的均值,然后取两本的标准误,得置信区间,其实取几倍的标准误,就看你要多大的置信区间,但置信区间不是越大越好,置信区间大了,你估计的把握是大了,但是你作出的估计可能就没有什么实际价值,置信区间越小,给的信息量就越大,越有价值

    均值的标准误差

    房价增长率的均值的分布是如何作出来的?比如我每次抽150个小区,150个小区能算出一个均值,抽10次,就能作出房价增长率均值的分布,然后再用这个分布计算出一个标准差,就叫做均值标准误差(简称标准误),但避免多次抽取,科学家发现了这个公式

    2012年北京市9月份房价同比增长率案例

    # - 数据说明:本数据是地区房价增长率数据
    # - 名称-中文含义
    # - dis_name-小区名称
    # - rate-房价同比增长率
    #%% 2012年北京市9月份房价同比增长率
    
    import os
    os.chdir(r"D:\pydata")
    # In[1]:
    
    import pandas as pd
    
    house_price_gr = pd.read_csv(r'house_price_gr.csv', encoding='gbk')
    house_price_gr.head()
    
    
    Out[2]: 
       dis_name      rate
    0   东城区甘南小区  0.169747
    1   东城区察慈小区  0.165484
    2  东城区胡家园小区  0.141358
    3  东城区台基厂小区  0.063197
    4  东城区青年湖小区  0.101528
    
    
    # 进行描述性统计分析
    
    # In[2]:
    
    house_price_gr.describe(include='all')
    
    
    Out[3]: 
           dis_name        rate
    count       150  150.000000
    unique      150         NaN
    top     顺义区双裕小区         NaN
    freq          1         NaN
    mean        NaN    0.110061
    std         NaN    0.041333
    min         NaN    0.029540
    25%         NaN    0.080027
    50%         NaN    0.104908
    75%         NaN    0.140066
    max         NaN    0.243743
    
    
    get_ipython().magic('matplotlib inline')
    import seaborn as sns
    from scipy import stats
    
    sns.distplot(house_price_gr.rate, kde=True, fit=stats.norm) # Histograph

    黑色的线是正太分布,蓝色的线是我们样本的分布 

    # Q-Q
    
    # In[4]:
    
    import statsmodels.api as sm
    from matplotlib import pyplot as plt
    
    fig = sm.qqplot(house_price_gr.rate, fit=True, line='45')
    fig.show()

    蓝点是我们的数据,红线是正太分布 

    house_price_gr.plot(kind='box') # Box Plots

    # 置信度区间估计
    
    # In[6]:
    # 计算标准误
    se = house_price_gr.rate.std() / len(house_price_gr) ** 0.5
    # 置信区间下界,95%的置信区间准确来说是1.98倍的标准误,而不是2倍的标准误
    LB = house_price_gr.rate.mean() - 1.98 * se
    # 置信区间上界
    UB = house_price_gr.rate.mean() + 1.98 * se
    (LB, UB)
    
    
    Out[7]: (0.10337882853175007, 0.11674316487209624)
    
    # 如果要求任意置信度下的置信区间的话,可以自己编一个函数
    def confint(x, alpha=0.05):
        n = len(x)
        xb = x.mean()
        df = n-1
        tmp = (x.std() / n ** 0.5) * stats.t.ppf(1-alpha/2, df)
        return {'Mean': xb, 'Degree of Freedom':df, 'LB':xb-tmp, 'UB':xb+tmp}
    
    confint(house_price_gr.rate, 0.05)

    抽取150个小区的9月份的房价同比增长率,得到增长率的均值是11%,有95%的把握认为整个北京市9月份的房价同比增长率在10.3%到11.6%之间,小于等于10.3%的概率不超过2.5%

    如果数据是正太分布的,那么它的均值一定是正太分布的,但如果数据不是正太分布的呢。

    中心极限定理

    根据中心极限定理,当我们的数据是独立同分布的,并且样本量足够大的情况下,“足够大”表示大于30 个样本,那么它的均值渐进地服从正太分布,即近似正太。如果数据严重偏态,则需要更多的样本,如果数据本身是对称则不用

    当抽样越来越多的时候,它的均值越来越接近正太分布

    有了中心极限定理,我们置信区间的取法就有依据了

    展开全文
  • 本书从实际应用的角度出发,以大量的案例详细介绍了MATLAB环境下的统计分析与应用。 本书主要内容包括:利用MATLAB制作统计报告或报表;从文件中读取数据到MATLAB;从MATLAB中导出数据到文件;数据的平滑处理、标准...
  • 推荐系统的应用案例剖析

    千次阅读 2016-04-13 09:28:11
    推荐系统的应用案例剖析 发表于2016-01-04 17:34|1007次阅读| 来源阿里巴巴资深工程师|0 条评论| 作者贾双成 系统谷歌数学原理应用案例 摘要:本章将继续讲述推荐系统的应用案例。为了说明推荐系统的详细实施方案...

    推荐系统的应用案例剖析

    发表于 2016-01-04 17:34| 1007次阅读| 来源 阿里巴巴资深工程师| 0 条评论| 作者 贾双成

    摘要:本章将继续讲述推荐系统的应用案例。为了说明推荐系统的详细实施方案,本章首先详细介绍了一个音乐系统推荐的实施案例,之后为了让读者清晰大型推荐系统的原理,简要介绍一个淘宝周边兴趣点推荐的技术方案。

    《程序员》杂志12期A中,我们介绍了推荐系统的数学原理和应用案例,本章将继续讲述推荐系统的应用案例。为了说明推荐系统的详细实施方案,本章首先详细介绍了一个音乐系统推荐的实施案例,之后为了让读者清晰大型推荐系统的原理,简要介绍一个淘宝周边兴趣点推荐的技术方案。

    音乐推荐

    音乐推荐系统是一个很好的说明说明推荐系统工作原理的例子。

    1. 音乐推荐特点

    • 物品空间大。物品数很多,物品空间很大,这主要是相对于书和电影而言。
    • 消费每首歌的代价很小。对在线音乐来说,音乐都是免费的,不需要付费。
    • 物品种类丰富。音乐种类丰富,有很多的流派。
    • 听一首歌耗时很少。听一首音乐的时间成本很低,不太浪费用户的时间,而且用户大都把音乐作为背景声音,同时进行其他工作。
    • 物品重用率很高。每首歌用户都会听很多遍,这和其他物品不同,比如用户不会反复看一个电影,不会反复买一本书。
    • 用户充满激情。用户很有激情,一个用户会听很多首歌。
    • 上下文相关。用户的口味很受当时上下文的影响,这里的上下文主要包括用户当时的心情(比如沮丧的时候喜欢听励志的歌曲)和所处情境(比如睡觉前喜欢听轻音乐)。
    • 次序很重要。用户听音乐一般是按照一定的次序一首一首地听。
    • 很多播放列表资源。很多用户都会创建很多个人播放列表。
    • 不需要用户全神贯注。音乐不需要用户全神贯注地听,很多用户将音乐作为背景声音。
    • 高度社会化。用户听音乐的行为具有很强的社会化特性,比如我们会和好友分享自己喜欢的音乐。

    上面这些特点决定了音乐是一种非常适合用来推荐的物品。

    2. 音乐推荐的实现方案

    目前大部分做推荐的应用推荐逻辑应该都是多种逻辑并行。编辑推荐和用户推荐的歌曲一般会有专门的版块展示。

    个性化推荐理论上来讲都是通过算法直接从音乐库里面由程序产出的。

    • 冷启动(用户第一次使用)的时候基于热度的推荐会比较多,推荐流行热点音乐总是不会错的。
    • 在用户使用一段时间,用户行为达到一定样本量以后,程序开始通过内容和社交关系逻辑产出内容,并且与热门内容按照一定比例推送给用户。
    • 程序推荐和编辑人员人工推荐结合。
    • 各个用户好友的歌单的交互。

    用户所有的行为(包括下载/喜欢、评论、播放完成度、播放次数等)都会以不同的权重呈现在后续的推荐逻辑中。比如,一种权重的设置方法为:

    下载+播放 > 喜欢+播放 > 搜索+播放 > 播放 > 下载 > 喜欢

    至于准确不准确,合不合口味这个事情,与推荐算法的关系其实是不大的。做内容推荐的关键是内容质量是否过关。也就是音乐库里面对不同歌曲,不同歌手的音乐基因标记的是否正确,是否够专业,Jing.FM可能是近两年相对专业一些的个性化电台。

    3. 关于实现方案的分析

    先从相似度的问题说起。大多数用户一开始会先从自己熟悉的歌曲开始,然后一般都会给出非常相关的推荐,比如你听周杰伦的任何歌曲,他的其他热门歌曲肯定都会非常相关,比如周杰伦的《东风破》,周杰伦的《游园会》,周杰伦的《七里香》,也不失为一个好的推荐。但是你会发现全都是周杰伦,单调死了。全是周杰伦的理由很简单,因为很多用户都连着听下去呀,听完一首周杰伦到下一首周杰伦,听完这个专辑听下个专辑。如果你往后再翻翻,估计还能找到别歌手的歌曲,但是请记着:你的屏幕就这么大,坑就这么多,再好的推荐不能在靠前的位置被用户看到和消费到终归也还是没用。现在我们来尝试解决这个问题,我们先来做个简单的多样化过滤,我们限制来自同一个歌手的推荐数量,这样后面更多歌手的歌去被推上来了。

    现在出现了一个新的问题,陈奕迅这时候发新专辑了,用户一下子蜂拥去听他的新专辑了,包括周杰伦的拥趸们也跑去观望了一下,这样的情况持续了一个多月,这下好了,用户看到的推荐里面现在几乎都能看到陈奕迅的这些歌了,尽管他这的歌跟周杰伦的歌原本不至于这么相关。而且由于这个效应,更多的人从推荐里面点进去了听陈奕迅的这些歌,造成了一个恶性循环,使得你的基于相似度的算法以为他们真的相关,这时候其他真正相关的优质推荐却被挤压到后面了。我们来尝试解决这个问题,最简单的莫过于是计算相似度的时候过滤掉“过于”热门的歌曲了,把这些歌曲推后吧,感觉问题应该也能解决了。

    这种结合就是基于热度的推荐和用户行为推荐的结合。

    现在一波未平一波又起,假设现在一个非常优秀的新歌手,唱的歌也好有周杰伦的早年的风采,反正就是非常相关,周杰伦的歌迷肯定会喜欢那种。这位新歌手刚出道,宣传力度不大,也只有少数几个地方能听到他的歌曲,只有被小数的几个周杰伦迷给发掘出来了,现在问题来了,我们该如何使得这个歌手被发掘出来呢?这个基本上与上一个问题相反,这是冷门的优秀推荐很难被发掘。这时候我们可以用归一化(Normalization)的小伎俩微调一下。值得一提的是,归一化更能给解决一下上一个提及的太过热门的问题。可以说怎样归一化才是各大厂家的杀手锏吧,虽然都可能大同小异,但是不同行业还是需要细分。

    实际上,基于相似度的算法的确是非常自然的推荐算法,事实上当数据足够大、足够干净和精确的时候,基于相似度的算法是很难被打败的。但是设想如果是网易音乐发展初期,没有很多用户数据的情况下呢?又如果是网易音乐急速扩张时期,用户数据很多但是很稀疏的时候呢?又从用户角度切入,设想是一个刚加入的新用户,并没有其它用户数据来源来提供推荐的情况下呢?这些冷启动问题,又该如何解决呢?难道就应该放弃这些用户?可能我们可以做更多的小把戏来调整我们的算法,也可以去尝试一些其他算法,尝试去做一些混合推荐算法系统。但是由于产品的研发周期会变长,开发投入变大,系统变复杂,维护的消耗更大,然后更糟糕的是因为进展缓慢,用户一直看的就是不好的推荐,用户开始流失,数据更加稀疏,最后导致恶性循环。

    这时,可以尝试通过别的途径来解决这些问题。

    我们先从做一个首页显示热门榜单开始,这是一个非常容易实现的功能,计数、排序、简单分类:中国、欧美、日本和韩国,按流派也行:流行、摇滚、古典,甚至按年龄段或者群体,不外乎是几个数据库搜索的事情。但是这些热门排行榜却作用非凡,用户可以从中发现当前的大趋势(Trending),比如说,现在张杰比周杰伦风头要盛,听听张杰的看看怎样。由此榜单也能帮助用户发现他本来兴趣圈以外的东西。这么容易实现的功能,却也可以带来不少的好处。

    然后我们来聘请一批专业的媒体编辑员,让他们根据我们歌曲库里的内容,生成比较专业的榜单,比如:“高逼格小清新”,“喧嚣中,不妨试的调调” 还有 “被遗忘的经典华语女声”。用过其它的歌曲软件的人估计对这个也不陌生,比如说虾米。这个也能很大程度上帮助用户发现兴趣圈以外的东西,而且由专业人员生成的歌单,更有目的性,比如说你喜欢苏打绿是因为“小清新”,那么在“小清新”的歌单里的,就是一大批高质量的,对你而言非常优秀的推荐了。这样的功能也能很快组织和实现起来,好处也是大大的。

    这其实就是人工推荐和程序推荐的结合。

    最后,看到了知乎的威力以后,我们考虑做UGC。从做一个简单的UGC功能开始,我们现在另开一个数据库,允许用户保存自己的歌单,并在个人主页推荐这些歌单。同时我们在主页中定期置顶一些访问量较大的歌单。功能上非常容易实现。UGC所激发的用户潜能可以使得用户产生与专业编辑员质量相当的、甚至更高的歌单。功能上的实现实在是再简单不过,效果更是不言而喻。

    这就是不同歌单之间的交互。

    这时,我们的很大一部分问题得到解决,就算是我们的基于相似度的算法所产生的推荐并不是那么好的时候,我们的用户并不会由此而失去发现音乐的途径。听歌的人多了,老用户们持续产生高质量的数据,之前的个性化推荐算法也能有更好数据来调整参数,从而产生更好的音乐推荐,更好好的用户群体也能推动热门榜单与UGC的发展,进入良性循环。

    大型推荐系统的技术方案

    我们知道,电子商务的公司需要定制化界面。否则手机那么小的界面,根本没有办法呈现用户所需的信息,用户很容易流失。所以,因人而异,制定不同的定制化页面是移动互联网时代的制胜关键。那么如何制作一个大型的商品推荐系统呢?比如制作一个类似淘宝口碑那样的兴趣点商品推荐系统。

    在制作技术方案时,要考虑用户需求的种类,无非是分:

    • 你可能需要买的东西(普遍性需求);
    • 你现在想要买的东西(即时刚需);
    • 你潜在想要买的东西(潜在普遍性需求和潜在即时刚需)。
    这跟淘宝一直标榜的个性化搜索差不多,首页中有很多广告位,其中以首页的焦点图第2,3,4页最为明显,这里的图片都是商家拍下广告位然后投放的,拍广告位的时候可以选择通投、地域、兴趣点等等。

    通投就是所有的人都可以看到的

    地域是按不同的地方投放,

     兴趣点就是淘宝对你以往的购买记录进行分析,以及你的搜索情况等,计算出你可能感兴趣的。

    在具体的商品推荐技术实现上,淘宝/天猫的商品推荐采用了逻辑回归算法,用了上百亿的特征,并基于库存等约束来进行商品推荐。由于逻辑回归的算法本质上属于一种单层神经网络系统,所以大致的结构如下所示:


    其中layer1代表输入的商品特征,比如可以是目前的所有商品,以及其他所能想到的各种特征,layer2可以是目前的所有商品。目的是:当用户购买了一些商品之后,向用户推荐别的**商品。所以训练数据是:输入用户购买的数据的各种特征(没购买或浏览的商品的特征可以为零),输出是用户随后购买的商品(没购买的商品可以设置输出为零)。所以通过大量数据训练后,可以得到一个神经网络,这个神经网络就是所求的推荐系统。这样,每一个用户所看到的商品都是不同的,而且都是她/他很有可能要购买的。

    值得一提的是,谷歌或者facebook的推荐系统也采用了逻辑回归算法。

    综上所述,我们已经把推荐系统的应用案例剖析讲完了。我们将从下一期开始讲述LBS应用中的数据挖掘方法。

    作者简介:

    贾双成,阿里巴巴资深工程师,擅长于数据编译、数据挖掘的系统分析和架构设计,主持研发过多个高端车载导航及adas数据编译器。曾发表发明专利、论文四十余篇,著有《LBS核心技术揭秘》、《数据挖掘核心技术揭秘》。

    展开全文
  • 机器学习 逻辑回归算法应用案例

    千次阅读 2020-09-12 16:41:41
    机器学习 逻辑回归算法应用案例 时间:2020.09.12 出处:https://www.kesci.com/home/project/5bfe39b3954d6e0010681cd1 注明:初学逻辑回归,跟着博客大佬文章过了一遍,自己留个记录以便之后翻阅,也供大家学习。...

    机器学习 逻辑回归算法应用案例

    时间:2020.09.12
    出处:https://www.kesci.com/home/project/5bfe39b3954d6e0010681cd1
    注明:初学逻辑回归,跟着博客大佬文章过了一遍,自己留个记录以便之后翻阅,也供大家学习。。

    1、数据

    本次数据为Kaggle著名的公开数据集坦泰尼克号之灾。
    数据源地址:https://www.kaggle.com/c/titanic
    如果你是第一次进入kaggle,你需要注册一个账号才能下载数据集,进入该链接之后请按下图找数据。
    在这里插入图片描述

    在这里插入图片描述
    下载数据即可,前提是你处于登录状态,如果你没有Kaggle账号,你可以通过Kaggle创捷一个账号,毕竟这么强的网站不创建个账号都亏了太多了_,但是这个账号创建好像是得用VPN,不然无法进行人机验证(我是这样的)。
    如果你真的没有账号也不想注册,你可以去原作者的github瞅瞅:https://github.com/HanXiaoyang/Kaggle_Titanic

    2、数据分析处理

    现在先来看看数据长什么样

    import pandas as pd #数据分析
    import numpy as np #科学计算
    from pandas import Series,DataFrame
    data_train = pd.read_csv("D:/material/titanic/train.csv")
    data_train
    

    Out:
    在这里插入图片描述
    这就是典型的dataframe格式,我们看到,总共有12列,其中Survived字段表示的是该乘客是否获救,其余都是乘客的个人信息,包括:

    PassengerId => 乘客ID
    Pclass => 乘客等级(1/2/3等舱位)
    Name => 乘客姓名
    Sex => 性别
    Age => 年龄
    SibSp => 堂兄弟/妹个数
    Parch => 父母与小孩个数
    Ticket => 船票信息
    Fare => 票价
    Cabin => 客舱
    Embarked => 登船港口

    之后,我们让dataframe自己告诉我们一些信息,如下所示:

    data_train.info()
    

    Out:
    在这里插入图片描述
    从结果中可以看出训练数据中总共有891名乘客,但是很不幸,我们有些属性的数据不全,比如说:
    Age(年龄)属性只有714名乘客有记录
    Cabin(客舱)更是只有204名乘客是已知的
    我们用下列的方法,得到数值型数据的一些分布(因为有些属性,比如姓名,是文本型;而另外一些属性,比如登船港口,是类目型。这些我们用下面的函数是看不到的):

    data_train.describe()
    

    Out:
    在这里插入图片描述
    我们从上面看到更进一步的什么信息呢? mean字段告诉我们,大概0.383838的人最后获救了,2/3等舱的人数比1等舱要多,平均乘客年龄大概是29.7岁(计算这个时候会略掉无记录的)等等…

    在大概了解数据信息之后我们开始对这些数据进行更深入的了解,通过可视化数据来更加清晰的分析数据。
    代码如下:

    #数据可视化分析
    %matplotlib inline 
    import matplotlib.pyplot as plt
    
    #指定默认字体
    plt.rcParams['font.sans-serif'] = ['SimHei'] 
    plt.rcParams['font.family']='sans-serif'
    #解决负号'-'显示为方块的问题
    plt.rcParams['axes.unicode_minus'] = False 
    
    
    fig = plt.figure()
    fig.set(alpha=0.2)  # 设定图表颜色alpha参数
    
    plt.subplot2grid((2,3),(0,0))             # 在一张大图里分列几个小图
    data_train.Survived.value_counts().plot(kind='bar')# 柱状图 
    plt.title(u"获救情况 (1为获救)") # 标题
    plt.ylabel(u"人数")  
    
    plt.subplot2grid((2,3),(0,1))
    data_train.Pclass.value_counts().plot(kind="bar")
    plt.ylabel(u"人数")
    plt.title(u"乘客等级分布")
    
    plt.subplot2grid((2,3),(0,2))
    plt.scatter(data_train.Survived, data_train.Age)
    plt.ylabel(u"年龄")                         # 设定纵坐标名称
    plt.grid(b=True, which='major', axis='y') 
    plt.title(u"按年龄看获救分布 (1为获救)")
    
    
    plt.subplot2grid((2,3),(1,0), colspan=2)
    data_train.Age[data_train.Pclass == 1].plot(kind='kde')   
    data_train.Age[data_train.Pclass == 2].plot(kind='kde')
    data_train.Age[data_train.Pclass == 3].plot(kind='kde')
    plt.xlabel(u"年龄")# plots an axis lable
    plt.ylabel(u"密度") 
    plt.title(u"各等级的乘客年龄分布")
    plt.legend((u'头等舱', u'2等舱',u'3等舱'),loc='best') # sets our legend for our graph.
    
    
    plt.subplot2grid((2,3),(1,2))
    data_train.Embarked.value_counts().plot(kind='bar')
    plt.title(u"各登船口岸上船人数")
    plt.ylabel(u"人数")  
    plt.show()
    

    Out:
    在这里插入图片描述
    我们在图上可以看出来,被救的人300多点,不到半数;3等舱乘客非常多;遇难和获救的人年龄似乎跨度都很广;3个不同的舱年龄总体趋势似乎也一致,2/3等舱乘客20岁多点的人最多,1等舱40岁左右的最多;登船港口人数按照S、C、Q递减,而且S远多于另外俩港口。
    通过这些数据我们可以看出来一些信息了,心里也会有一定的思考,放上原作者的想法:
    1)不同舱位/乘客等级可能和财富/地位有关系,最后获救概率可能会不一样
    2)年龄对获救概率也一定是有影响的,毕竟前面说了,副船长还说『小孩和女士先走』呢
    3)和登船港口是不是有关系呢?也许登船港口不同,人的出身地位不同?
    口说无凭,空想无益。老老实实再来统计统计,看看这些属性值的统计分布吧。

    接下来先看看乘客获救与乘客等级Pclass的关系
    代码如下:

    #看看各乘客等级的获救情况
    fig = plt.figure()
    fig.set(alpha=0.2)  # 设定图表颜色alpha参数
    
    Survived_0 = data_train.Pclass[data_train.Survived == 0].value_counts()
    Survived_1 = data_train.Pclass[data_train.Survived == 1].value_counts()
    df=pd.DataFrame({u'未获救':Survived_0,u'获救':Survived_1})
    df.plot(kind='bar', stacked=True)
    plt.title(u"各乘客等级的获救情况")
    plt.xlabel(u"乘客等级") 
    plt.ylabel(u"人数") 
    plt.show()
    

    Out:
    在这里插入图片描述
    再来看看乘客获救情况与性别Sex的关系
    代码如下:

    #看看各性别的获救情况
    fig = plt.figure()
    fig.set(alpha=0.2)  # 设定图表颜色alpha参数
    
    Survived_m = data_train.Survived[data_train.Sex == 'male'].value_counts()
    Survived_f = data_train.Survived[data_train.Sex == 'female'].value_counts()
    print(Survived_m)#这里我将这些数据输出,以便于我的理解
    print(Survived_f)
    df=pd.DataFrame({u'男性':Survived_m, u'女性':Survived_f})
    df.plot(kind='bar', stacked=True)
    plt.title(u"按性别看获救情况")
    plt.xlabel(u"获救") 
    plt.ylabel(u"人数")
    plt.show()
    

    Out:
    在这里插入图片描述
    然后我们再来看看各种舱级别情况下各性别的获救情况
    代码如下:

    #然后我们再来看看各种舱级别情况下各性别的获救情况
    fig=plt.figure()
    fig.set(alpha=0.65) # 设置图像透明度,无所谓
    plt.title(u"根据舱等级和性别的获救情况")
    
    ax1=fig.add_subplot(141)
    data_train.Survived[data_train.Sex == 'female'][data_train.Pclass != 3].value_counts().sort_index().plot(kind='bar', label="female highclass", color='#FA2479')
    ax1.set_xticks([0,1])
    print(ax1)
    ax1.set_xticklabels([u"未获救", u"获救"], rotation=0)
    ax1.legend([u"女性/高级舱"], loc='best')
    
    ax2=fig.add_subplot(142, sharey=ax1)
    data_train.Survived[data_train.Sex == 'female'][data_train.Pclass == 3].value_counts().sort_index().plot(kind='bar', label='female, low class', color='pink')
    ax2.set_xticklabels([u"未获救", u"获救"], rotation=0)
    plt.legend([u"女性/低级舱"], loc='best')
    
    ax3=fig.add_subplot(143, sharey=ax1)
    data_train.Survived[data_train.Sex == 'male'][data_train.Pclass != 3].value_counts().sort_index().plot(kind='bar', label='male, high class',color='lightblue')
    ax3.set_xticklabels([u"未获救", u"获救"], rotation=0)
    plt.legend([u"男性/高级舱"], loc='best')
    
    ax4=fig.add_subplot(144, sharey=ax1)
    data_train.Survived[data_train.Sex == 'male'][data_train.Pclass == 3].value_counts().sort_index().plot(kind='bar', label='male low class', color='steelblue')
    ax4.set_xticklabels([u"未获救", u"获救"], rotation=0)
    plt.legend([u"男性/低级舱"], loc='best')
    
    plt.show()
    

    Out:
    在这里插入图片描述
    再看看各登船港口的获救情况
    代码如下:

    fig = plt.figure()
    fig.set(alpha=0.2)  # 设定图表颜色alpha参数
    
    Survived_0 = data_train.Embarked[data_train.Survived == 0].value_counts()
    Survived_1 = data_train.Embarked[data_train.Survived == 1].value_counts()
    df=pd.DataFrame({u'未获救':Survived_0,u'获救':Survived_1})
    df.plot(kind='bar', stacked=True)
    plt.title(u"各登船港口乘客的获救情况")
    plt.xlabel(u"登船港口") 
    plt.ylabel(u"人数") 
    
    plt.show()
    

    Out:
    在这里插入图片描述
    看看 堂兄弟/妹,孩子/父母有几人,对是否获救的影响
    代码如下:

    #看看 堂兄弟/妹,孩子/父母有几人,对是否获救的影响
    gg = data_train.groupby(['SibSp','Survived'])
    df = pd.DataFrame(gg.count()['PassengerId'])
    print(df)
    
    gp = data_train.groupby(['Parch','Survived'])
    df = pd.DataFrame(gp.count()['PassengerId'])
    print(df)
    

    Out:
    在这里插入图片描述
    tickets cabin的分析
    ticket是船票编号,应该是unique的,和最后的结果没有太大的关系,先不纳入考虑的特征范畴
    cabin只有204个乘客有值,我们先看看它的一个分布

    data_train.Cabin.value_counts()
    

    Out:
    在这里插入图片描述
    关键是Cabin这鬼属性,应该算作类目型的,本来缺失值就多,还如此不集中,注定是个棘手货…第一感觉,这玩意儿如果直接按照类目特征处理的话,太散了,估计每个因子化后的特征都拿不到什么权重。加上有那么多缺失值,要不我们先把Cabin缺失与否作为条件(虽然这部分信息缺失可能并非未登记,maybe只是丢失了而已,所以这样做未必妥当),先在有无Cabin信息这个粗粒度上看看Survived的情况好了。
    代码如下:

    fig = plt.figure()
    fig.set(alpha=0.2)  # 设定图表颜色alpha参数
    
    Survived_cabin = data_train.Survived[pd.notnull(data_train.Cabin)].value_counts()
    Survived_nocabin = data_train.Survived[pd.isnull(data_train.Cabin)].value_counts()
    df=pd.DataFrame({u'有':Survived_cabin, u'无':Survived_nocabin}).transpose()
    df.plot(kind='bar', stacked=True)
    plt.title(u"按Cabin有无看获救情况")
    plt.xlabel(u"Cabin有无") 
    plt.ylabel(u"人数")
    plt.show()
    

    Out:
    在这里插入图片描述
    看了这么多数据的可视化关联分析,下面我们开始进入数据预处理,为逻辑回归建模做准备。。

    3、数据预处理

    这里还是直接放作者原话,毕竟讲得好:
    先从最突出的数据属性开始吧,对,Cabin和Age,有丢失数据实在是对下一步工作影响太大。

    先说Cabin,暂时我们就按照刚才说的,按Cabin有无数据,将这个属性处理成Yes和No两种类型吧。

    再说Age:通常遇到缺值的情况,我们会有几种常见的处理方式

    如果缺值的样本占总数比例极高,我们可能就直接舍弃了,作为特征加入的话,可能反倒带入noise,影响最后的结果了 如果缺值的样本适中,而该属性非连续值特征属性(比如说类目属性),那就把NaN作为一个新类别,加到类别特征中 如果缺值的样本适中,而该属性为连续值特征属性,有时候我们会考虑给定一个step(比如这里的age,我们可以考虑每隔2/3岁为一个步长),然后把它离散化,之后把NaN作为一个type加到属性类目中。 有些情况下,缺失的值个数并不是特别多,那我们也可以试着根据已有的值,拟合一下数据,补充上。 本例中,后两种处理方式应该都是可行的,我们先试试拟合补全吧(虽然说没有特别多的背景可供我们拟合,这不一定是一个多么好的选择)

    我们这里用scikit-learn中的RandomForest来拟合一下缺失的年龄数据(注:RandomForest是一个用在原始数据中做不同采样,建立多颗DecisionTree,再进行average等等来降低过拟合现象,提高结果的机器学习算法)
    代码如下:

    from sklearn.ensemble import RandomForestRegressor
    
    ### 使用 RandomForestClassifier 填补缺失的年龄属性
    def set_missing_ages(df):
    
        # 把已有的数值型特征取出来丢进Random Forest Regressor中
        age_df = df[['Age','Fare', 'Parch', 'SibSp', 'Pclass']]
    
        # 乘客分成已知年龄和未知年龄两部分
        known_age = age_df[age_df.Age.notnull()].values
        unknown_age = age_df[age_df.Age.isnull()].values
    
        # y即目标年龄
        y = known_age[:, 0]
    
        # X即特征属性值
        X = known_age[:, 1:]
    
        # fit到RandomForestRegressor之中
        rfr = RandomForestRegressor(random_state=0, n_estimators=2000, n_jobs=-1)
        rfr.fit(X, y)
    
        # 用得到的模型进行未知年龄结果预测
        predictedAges = rfr.predict(unknown_age[:, 1::])
    
        # 用得到的预测结果填补原缺失数据
        df.loc[ (df.Age.isnull()), 'Age' ] = predictedAges 
    
        return df, rfr
    
    def set_Cabin_type(df):
        df.loc[ (df.Cabin.notnull()), 'Cabin' ] = "Yes"
        df.loc[ (df.Cabin.isnull()), 'Cabin' ] = "No"
        return df
    
    data_train, rfr = set_missing_ages(data_train)
    data_train = set_Cabin_type(data_train)
    

    之后输出一波数据来看看

    data_train.head(10)
    

    Out:
    在这里插入图片描述
    因为逻辑回归建模时,需要输入的特征都是数值型特征,我们通常会先对类目型的特征因子化。 什么叫做因子化呢?举个例子:

    以Cabin为例,原本一个属性维度,因为其取值可以是[‘yes’,’no’],而将其平展开为’Cabin_yes’,’Cabin_no’两个属性

    原本Cabin取值为yes的,在此处的”Cabin_yes”下取值为1,在”Cabin_no”下取值为0 原本Cabin取值为no的,在此处的”Cabin_yes”下取值为0,在”Cabin_no”下取值为1 我们使用pandas的”get_dummies”来完成这个工作,并拼接在原来的”data_train”之上,如下所示。

    #将类目型特征因子化,通过pandas的”get_dummies”来完成这个工作
    dummies_Cabin = pd.get_dummies(data_train['Cabin'], prefix= 'Cabin')
    
    dummies_Embarked = pd.get_dummies(data_train['Embarked'], prefix= 'Embarked')
    
    dummies_Sex = pd.get_dummies(data_train['Sex'], prefix= 'Sex')
    
    dummies_Pclass = pd.get_dummies(data_train['Pclass'], prefix= 'Pclass')
    
    df = pd.concat([data_train, dummies_Cabin, dummies_Embarked, dummies_Sex, dummies_Pclass], axis=1)
    df.drop(['Pclass', 'Name', 'Sex', 'Ticket', 'Cabin', 'Embarked'], axis=1, inplace=True)
    df.head()
    

    Out:
    在这里插入图片描述
    我们还得做一些处理,仔细看看Age和Fare两个属性,乘客的数值幅度变化,也忒大了吧!!如果大家了解逻辑回归与梯度下降的话,会知道,各属性值之间scale差距太大,将对收敛速度造成几万点伤害值!甚至不收敛! (╬▔皿▔)…所以我们先用scikit-learn里面的preprocessing模块对这俩货做一个scaling,所谓scaling,其实就是将一些变化幅度较大的特征化到[-1,1]之内。

    #我们先用scikit-learn里面的preprocessing模块对这俩货做一个scaling,所谓scaling,其实就是将一些变化幅度较大的特征化到[-1,1]之内。
    import sklearn.preprocessing as preprocessing
    scaler = preprocessing.StandardScaler()
    age_scale_param = scaler.fit(df['Age'].values.reshape(-1,1))
    df['Age_scaled'] = scaler.fit_transform(df['Age'].values.reshape(-1,1), age_scale_param)
    fare_scale_param = scaler.fit(df['Fare'].values.reshape(-1,1))
    df['Fare_scaled'] = scaler.fit_transform(df['Fare'].values.reshape(-1,1), fare_scale_param)
    df.head()
    

    Out:
    在这里插入图片描述
    现在基本上就把训练数据处理好了,可以开始进行建模了。

    4、逻辑回归建模

    我们把需要的feature字段取出来,转成numpy格式,使用scikit-learn中的LogisticRegression建模。
    代码如下:

    from sklearn import linear_model
    
    # 用正则取出我们要的属性值
    train_df = df.filter(regex='Survived|Age_.*|SibSp|Parch|Fare_.*|Cabin_.*|Embarked_.*|Sex_.*|Pclass_.*')
    train_np = train_df.values
    
    # y即第0列:Survival结果
    y = train_np[:, 0]
    
    # X即第1列及以后:特征属性值
    X = train_np[:, 1:]
    
    # fit到LogisticRegression之中
    clf = linear_model.LogisticRegression(solver='liblinear',C=1.0, penalty='l1', tol=1e-6)
    clf.fit(X, y)
    
    clf
    

    Out:
    在这里插入图片描述
    就这样,一个逻辑回归模型已经训练出来了,可以看出来机器学习的关键还是在于对数据的分析与处理上(初学机器学习,仅个人观点),但是现在还不能对test数据进行预测,我们需要对test数据做相同格式的处理,也简单了,直接按照上面的来就行了。
    代码如下:

    #现在将test文件做同样的变化
    data_test = pd.read_csv("D:/material/titanic/test.csv")
    data_test.loc[ (data_test.Fare.isnull()), 'Fare' ] = 0
    # 接着我们对test_data做和train_data中一致的特征变换
    # 首先用同样的RandomForestRegressor模型填上丢失的年龄
    tmp_df = data_test[['Age','Fare', 'Parch', 'SibSp', 'Pclass']]
    null_age = tmp_df[data_test.Age.isnull()].values
    # 根据特征属性X预测年龄并补上
    X = null_age[:, 1:]
    predictedAges = rfr.predict(X)
    data_test.loc[ (data_test.Age.isnull()), 'Age' ] = predictedAges
    
    data_test = set_Cabin_type(data_test)
    dummies_Cabin = pd.get_dummies(data_test['Cabin'], prefix= 'Cabin')
    dummies_Embarked = pd.get_dummies(data_test['Embarked'], prefix= 'Embarked')
    dummies_Sex = pd.get_dummies(data_test['Sex'], prefix= 'Sex')
    dummies_Pclass = pd.get_dummies(data_test['Pclass'], prefix= 'Pclass')
    
    
    df_test = pd.concat([data_test, dummies_Cabin, dummies_Embarked, dummies_Sex, dummies_Pclass], axis=1)
    df_test.drop(['Pclass', 'Name', 'Sex', 'Ticket', 'Cabin', 'Embarked'], axis=1, inplace=True)
    df_test['Age_scaled'] = scaler.fit_transform(df_test['Age'].values.reshape(-1,1), age_scale_param)
    df_test['Fare_scaled'] = scaler.fit_transform(df_test['Fare'].values.reshape(-1,1), fare_scale_param)
    df_test.head()
    

    Out:
    在这里插入图片描述
    下面就可以进行数据预测了
    代码如下:

    test = df_test.filter(regex='Age_.*|SibSp|Parch|Fare_.*|Cabin_.*|Embarked_.*|Sex_.*|Pclass_.*')
    predictions = clf.predict(test)
    result = pd.DataFrame({'PassengerId':data_test['PassengerId'].values, 'Survived':predictions.astype(np.int32)})
    result.head()
    

    Out:
    在这里插入图片描述

    5、总结

    这样的话就完成了一个最基本的逻辑回归算法应用,按照原作者的话,这只是万里长征的第一步…
    原作者后面还有一些逻辑回归系统的优化,用来提高它的准确率,这里我就不做记录了,如果读者有需要可以直接去原作博客:https://blog.csdn.net/han_xiaoyang/article/details/49797143
    后面写的也真的很好的,很建议去学习学习。
    这是我的第一篇博客呢,虽然大部分都是复制粘贴的,但也算是学习着写了一篇博客,之后会努力写更多文章,给自己留笔记,也给大家分享知识,挺好。

    展开全文
  • KNN算法及其应用案例

    千次阅读 2018-08-20 22:27:01
    简单、易实现、易理解,无需参数估计及训练 (2).适用于多分类问题 (3).总的思想是:"物以类聚" KNN算法模块: #KNN算法模块: def knn(k,testdata,traindata,labels): #k代表分类数,测试数据,训练数据,所得到...
  • 1.GLM参数估计——极大似然法 ...事实上,实际应用中使用最多的分布就是指数分布族,所以这样的简化可以节省很多理论上的冗长论述,也不会限制实际应用。 如前文如述,指数分布族的概率密度函
  • 从总体中抽取一个样本(batchsize=n),得到样本均值u’,样本标准差σ‘,(推荐系统中)样本点击率ctr等,这些样本参数都是对总体的一个点估计。 标注误差SE 抽取n个样本,分别计算其均值u’1,u’2,… 这些值的...
  • 在尝试用脚本实现这一功能的过程中发现一些新的东西,记录一下。 搜索“EstimateModelParameters”发现了...给定一个初始值和评估范围,与参数的处理方法相似。选中后,在参数评估过程中,初始状态也会被评估。 ...
  • H无穷控制理论与应用案例分析

    千次阅读 2020-10-30 21:45:54
    其中,主要包括受控对象模型和参数的不确定性、外干扰的多样性和复杂性、系统结构和参数的未知变化等。解决这类系统的稳定性和有效控制问题属于鲁棒控制问题。 状态反馈:状态反馈,就是将系统的每一个状态变量乘以...
  • 进行非参数估计 首先,让我们尝试使用传统的普通最小二乘回归。 reg perf2 income grant Source | SS df MS Number of obs = 10,000 -------------+---------------------------------- F(2, 9997) = 5734.77 Model...
  • 极大似然估计及其应用

    千次阅读 2020-10-23 09:57:23
    极大似然估计及其应用欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、...
  • 10.2.3对向传播网络的实际应用 第11章NARMAL2控制算法分析与实现 11.1反馈线性化控制系统原理 11.2反馈线性控制的MATLAB实现 11.3NARMAL2控制器原理及实例分析 11.3.1NARMAL2控制器原理 11.3.2NARMAL2...
  • 概率图模型是人工智能领域内一大主要研究方向。...文章从基础的概念开始谈起,并加入了基础的应用示例来帮助初学者理解概率图模型的实用价值。机器之心对该文章进行了编译介绍。 第一部分:基本术语和问题设定
  • ML之NB:朴素贝叶斯Naive Bayesian算法的简介、应用、经典案例之详细攻略 目录 朴素贝叶斯Naive Bayesian算法的简介 1、朴素贝叶斯计算流程表述 2、朴素贝叶斯的优缺点 2.1、优点 2.2、缺点 3、分类模型...
  • 本文转自机器之心,作者Prasoon Goyal原文链接如下:http://www.sohu.com/a/207319466_465975概率图模型是人工智能领域...文章从基础的概念开始谈起,并加入了基础的应用示例来帮助初学者理解概率图模型的实用价值。...
  • 1. 随机变量的数字特征 0x1:为什么我们需要统计随机变量的数字特征 随机变量的分布函数(或概率函数...在很多实际问题中(特别是一些具体的非物理的问题域),从实际问题场景中采样得到的样本集,一般时候都不会...
  • #apply方法表示对xdata应用后面的转换形式 x = xdata.apply(lambda x:pd.Series(time_format(x)),axis=1) print("======处理后的时间格式=======") print(x.head()) #划分测试集和训练集,random_state是随机数发生...
  • 1.2、kNN求最近距离案例解释原理—通过实际案例,探究kNN思路过程 2、K 近邻算法的三要素 k最近邻kNN算法的应用 k最近邻kNN算法的经典案例 1、基础案例 kNN算法的简介 邻近算法,或者说K最近...
  • ML之GB:GB算法相关论文、相关思路、关键步骤、代码实现、配图集合、案例应用之详细攻略 目录 GB算法相关文献、论文 GB算法关键步骤 GB算法代码实现 GB案例应用 1、GB用于回归 2、GB用于分类 GB算法...
  • 诸如核密度估计(KDE)的平滑方法被用于控制用于计算每种疾病率的空间支持的群体基础。平滑程度由用户定义的参数(带宽或阈值)控制,该参数影响疾病图的分辨率和计算的速率的可靠性。 方法 内核,带宽的大小,是...
  • 它是在大量实际应用中实现的计算机视觉的一个分支,例如监视、机器人导航、人机交互等。它的主要目标是自动化任何给定的操作,并通过取代工作人员来减少人力用计算机处理和分析数字图像或视频以收集(或使用“收集”...
  • Q-Q图可以用来可在分布的位置-尺度范畴上可视化的评估参数。  从图上可以看出,回归效果比较理想,但不是最理想的  4)以下代码可以同样实现上述图示: import numpy as np import scipy....
  • 秦凯新的技术社区-大数据商业实战系列全集目录 Spark商业应用实战-Spark聚合开窗与自定义累加器的高级应用 ...Spark商业应用实战-Spark资源申请确定内存和Cpu数量案例实战 1 Spark基于Yarn模式进行资源申...
  • viterbi算法求解案例 viterbi算法代码实现 HMM模型应用 中文分词 股市分析 历史简述 对于马尔可夫链,比较多的说法是:由俄国数学家安德雷·马尔可夫(Андрей Андреевич Марков)在1906-1907年...
  • ML与math:机器学习与高等数学基础概念、代码实现、案例应用之详细攻略——基础篇 目录 一、ML与高等数学 0、基础数学 1、导数、方向导数、梯度 1.1、概念简介 1.2、代码实现 2、Taylor展开 3、凸函数 ...
  • 机器学习、深度学习算法原理与案例实现暨Python大数据综合应用高级研修班一、课程简介课程强调动手操作;内容以代码落地为主,以理论讲解为根,以公式推导为辅。共4天8节,讲解机器学习和深度学习的模型理论和代码...
  • GMM算法应用实例介绍及参数详解

    千次阅读 2020-03-10 15:50:57
    高斯混合模型(CMMs)是统计学习理论的基本模型,在可视媒体领域应用广泛。近些年来,随着可视媒体信息的增长和分析技术的深入,GMMs在(纹理)图像分割、视频分析、图像配准、聚类等领域有了进一步的发展。从GMMs的基本...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 14,447
精华内容 5,778
关键字:

参数估计的实际应用案例