精华内容
下载资源
问答
  • 广义线性回归

    2018-03-16 14:10:38
    广义线性回归一、线性回归二、逻辑斯特回归三、广义线性回归

    广义线性回归

    一、线性回归

    二、逻辑斯特回归

    三、广义线性回归

    展开全文
  • 广义线性回归.zip

    2019-10-28 15:35:00
    广义线性回归分析matlab程序,可以运行,代码中有详细调用方法和例子
  • 机器学习(三)线性回归模型、广义线性回归模型、非线性回归模型   线性回归(数据集要满足正态分布) 一元线性回归模型: 在这里会想到,如何确定方程中的系数呢?我们先来了解最小二乘法,简单来说就是这个点...

    机器学习(三)线性回归模型、广义线性回归模型、非线性回归模型

     

    线性回归(数据集要满足正态分布)

    一元线性回归模型:

    在这里会想到,如何确定方程中的系数呢?我们先来了解最小二乘法,简单来说就是这个点作y轴的平行线与直线相交,那一段y值的平方求和起来最小就是了

    那我们怎么求呢?在这之前大家先要了解一些偏导数的知识

    为了方便大家理解,举一个通俗易懂的例子

     

    多元线性回归模型

    也就是一元线性回归是一个因素的,多元的话有多个因素建模,当考虑的因素为2个的话,还可以用三维坐标查看,因素多的话就不太好画出来了

    使用的方法还是最小二乘法,还是偏导数,不过不像一元线性回归那样是二元一次方程组了,变为m+1元一次方程组

     

    虚拟变量

    在我们多元线性回归模型的时候,可能会遇到非连续性的变量,这下我们该怎么办??

    比如,性别男和女,不可能就用0,1来直接扔进去模拟(简单来说就是分情况,针对不同情况模拟当然模拟效果就会好一点)

    介绍一下哑变量(虚拟变量):

    为了简便,现在模型的维度就有因变量销售额,自变量性别,单价

    • 相加模型(只影响截距项)

    把性别的男女,新增两个变量

    性别,单价---->单价(h),isman,iswoman

    y=a+bh+c*isman+d*iswoman

    只影响截距的意思,分多种情况拟合出来的,得出来的不同情况模型永远是平行的

     

    • 乘法模型(只影响斜率)

    性别,单价---->单价(h),isman*单价,iswoman*单价

    y=a+c*isman*h+d*iswoman*h

     

    • 混合模型(都影响)

    性别,单价---->单价(h),isman*单价,iswoman*单价,isman,iswoman

    y=a+c*isman*h+d*iswoman*h+e*isman+f*iswoman

     

    线性回归会遇到以下的问题

    • 对于多元线性回归如何选取变量?

    逐步回归(这种方法不是很好,Lasso会比较好)

    里面的指标指的是什么指标呢?

     

    怎么评价我们模拟的模型好不好呢?需要回归诊断

     样本是否符合正态分布假设?

    R语言里面有专门的函数


     是否存在离群值导致模型产生较大误差?

    作图观察剔除


     线性模型是否合理?误差是否满足独立性、等方差、正态分布等假设条件?


     是否存在多重共线性?

     

    广义线性回归模型

    常见的广义线性回归

    逻辑回归

    上面的例题利用逻辑回归我们算得

     

    非线性回归模型

    • 对数法
    • 指数法
    • 幂函数法
    • 多项式回归模型

     

    展开全文
  • 主要为大家详细介绍了Python数据拟合与广义线性回归算法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • 考虑广义线性回归模型Y=X?+e,E(e)=O,Cov(e)=σ2∑;,当设计矩阵Xnxp呈现病态时,定义广义线性回归模型的Moore-Penrose逆阵岭估计为?(k)=(X`∑-1X+kI)+X+KI)+X`∑-ly,k>0,讨论了广义线性回归模型的...
  • 前言 在学习机器学习的过程中,我们最开始通常会接触各种类型的回归模型。例如线性回归用来模拟一条...本文通过参考多种资料,通过对广义线性回归的理解出发,来阐述其他回归模型的生成原理。所写纯属个人理解,如...

    前言

    在学习机器学习的过程中,我们最开始通常会接触各种类型的回归模型。例如线性回归用来模拟一条线性函数满足函数周围的数据到达该直线的误差最小;逻辑回归用来确定以某条线性函数为基础,其两边的数据可以分为两种类型。我们往往只知道模型可以处理什么样的逻辑,做什么样的事情,却对为什么是这个模型了解甚少。本文通过参考多种资料,通过对广义线性回归的理解出发,来阐述其他回归模型的生成原理。所写纯属个人理解,如果错误欢迎指正。

     


    1、指数分布族

    这里阐述指数族的目的是为了说明广义线性模型(Generalized Linear Models)GLM,因为广义线性模型的提出是由指数族而来。

    另外需要知道凡是符合指数族分布的随机变量,都可以用广义线性回归进行分析。

    下面是指数分布族的公式定义:

    p(y;\eta )=b(y))exp(\eta^{T}T(y)-a(\eta )))

    下面是公式中的参数:(可以通过后面具体例子的推导来理解)

    • η:分布的自然参数(也就是说跟分布有关)
    • T(y):充分统计量(对于我们考虑的分布情况,通常情况下 T(y)=y)
    • a(η):log partition function,\boldsymbol{e^{-a(\eta )}}  本质上起着规范化常数的作用,保证概率分布  \boldsymbol{\sum p(y;\eta )}  为1

    当 T(y) 被固定时,a(\eta ) 、b(y) 就定义了一个以 \eta 为参数的一个指数分布。我们变化 \eta 就得到这个分布的不同分布。

    而大多数的概率分布都属于指数分布族,如:

    • 伯努利分布(Bernoulli):对 0、1 问题进行建模;
    • 二项分布(Multinomial):对 K 个离散结果的事件建模;
    • 泊松分布(Poisson):对计数过程进行建模,比如网站访问量的计数问题,放射性衰变的数目,商店顾客数量等问题;
    • 伽马分布(gamma)与指数分布(exponential):对有间隔的正数进行建模,比如公交车的到站时间问题;
    • β 分布:对小数建模;
    • Dirichlet 分布:对概率分布进建模;
    • Wishart 分布:协方差矩阵的分布;
    • 高斯分布(Gaussian)

    而如何通过对应的分布情况获得相应的模型呢,那么下面就通过一些例子来推导出,不同的分布情况下所获得的模型是什么样的,当然在进行推倒之前我们需要了解下广义线性模型,以及指数族与广义线性模型的关系。

    2、广义线性模型

    要确定一组数据是否满足广义线性模型,需要满足其三个假设:

    1. 定义线性预测算子

    \eta =\theta ^{T}x

    2. 定义y的估计值

    h_{\theta }(x)=E[y|x;\theta ]

    3. 定义 y 的估值概率分布属于某种指数分布族:

    Pr(y|x;\theta)=b(y)exp(\eta ^{T}T(y)-a(\eta ))

    通过这三条假设,结合样本的分布情况,通过将样本的分布情况转化为指数族的形式,得到最终的T,a,b以及\eta,从而得到满足分布情况下的模型。

    2.1、GLM推导逻辑回归

    接下来按照上面GLM作出的假设条件来推导逻辑回归。

    对于二分类问题,其样本点在结果上非0即1,因此很容易想到其样本满足伯努利分布,因此:

    y|x;\theta \sim Bernoulli(h_{\theta }(x))))

    对于伯努利分布来说。假定通过决策函数处理之后,不同的自变量x通过决策函数得到结果等于1和等于0的概率分别为

    p(y=1|x;\theta )=h_{\theta }(x)

    p(y=0|x;\theta)=1-h_{\theta }(x)

    因而得到等式:

    p(y;h_{\theta }(x))=h_{\theta }(x)^{y}(1-h_{\theta })^{1-y}

                        =exp(ylog(h_{\theta }(x) + (1-y)log(1-h_{\theta })))

                        =exp(log(\frac{h_{\theta }(x)}{1-h_{\theta }(x)})y + log(1-h_{\theta }(x)))

    参照指数分布族的各位置参数,可以得到:

    b(y)=1

    T(y)=y

    \eta =log(\frac{h_{\theta }(x)}{1-h_{\theta }(x)})

    a(\eta )=-log(1-h_{\theta }(x))

    由第三个条件进行推倒

    \eta =log(\frac{h_{\theta }(x)}{1-h_{\theta }(x)})

    \eta =\theta ^{T}x

    最终可以得到决策函数

    h_{\theta }(x) = \frac{1}{1+e^{-\theta ^{T}x}}

    也就是sigmoid函数

    2.2、GLM推导线性回归

    接下来按照上面GLM作出的假设条件来推导线性回归。

    由于线性回归的损失值也就是噪音值符合高斯分布,即

    y|x;\theta \sim N(\mu ,\sigma ^{2})

    由于 \sigma ^{2} 的值与 \theta 和 h_{\theta }(x) 无关,因此为了简化证明,我们令\sigma ^{2}=1

    原因如下,通过极大似然估计估算参数为多少时满足误差最小

    \iota (\theta)=logL(\theta )

           =log\prod_{i=1}^{m}\frac{1}{\sqrt{2\pi }\sigma }exp\left ( -\frac{(y^{(i)} - \theta ^{T}x^{(i)})^{2}}{2\sigma ^{2}} \right )

           =\sum_{i=1}^{m}log\frac{1}{\sqrt{2\pi }\sigma }exp\left ( -\frac{(y^{(i)} - \theta ^{T}x^{(i)})^{2}}{2\sigma ^{2}} \right )

          =mlog\frac{1}{\sqrt{2\pi }\sigma }-\frac{1}{\sigma ^{2}}\cdot \frac{1}{2}\sum_{i=1}^{m}(y^{(i)}-\theta ^{T}x^{(i)})^{2}

    事实证明,找出最合适的参数使得误差最小,公式中最终关注的是下面部分最小,才可以让以上函数最大

    lostfunc=\frac{1}{2}\sum_{i=1}^{m}(y^{(i)}-\theta ^{T}x^{(i)})^{2}

    因此与 \sigma ^{2}  无关,因此为了推导简单,我们令\sigma ^{2}=1

    p(y;h_{\theta }(x))=\frac{1}{\sqrt{2\pi }}exp\left ( -\frac{1}{2}(y-h_{\theta }(x))^{2} \right )

                        =\frac{1}{\sqrt{2\pi }}exp\left ( -\frac{1}{2}y^{2} \right )exp\left ( h_{\theta }(x)y -\frac{1}{2}h_{\theta }(x)^{2} \right )

    因此得到

    b(y)=\frac{1}{\sqrt{2\pi }}exp\left ( -\frac{1}{2}y^{2} \right )

    T(y)=y

    \eta = h_{\theta }(x)

    a(\eta )=\frac{1}{2}h_{\theta }(x)^{2}

    由第三个条件进行推倒

    \eta = h_{\theta }(x)

    \eta =\theta ^{T}x

    最终得决策函数为

    h_{\theta }(x)=\theta ^{T}x

    也就是线性回归的决策函数

    3、总结

    对于一组模型,首先我们要确定我们最终的结果要满足什么样的分布,在确定了分布之后,如果模型符合指数族分布形式,那么我们可以根据分布条件和指数族的对应关系,推导出指数族的4个参数,在获得参数的过程中我们就可以获得对应的决策函数,因而获得我们需要的模型,在获得模型之后我们就可以根据不同的条件选择不同的优化策略,从而获取对应的参数值。

     

     

    内容参考:

    斯坦福大学机器学习课CS229

    该作者理解:https://fighterhit.oschina.io/2017/12/24/machine_learning_notes/%E4%BB%8E%E5%B9%BF%E4%B9%89%E7%BA%BF%E6%80%A7%E6%A8%A1%E5%9E%8B%E7%90%86%E8%A7%A3%E9%80%BB%E8%BE%91%E5%9B%9E%E5%BD%92/

    展开全文
  • 如何在r语言中求广义线性回归定义下的离差 似然比统计量 皮尔逊卡方统计量 以及怀尔德统计量 我用glm好像只能得到拟合
  • 在博文 多元线性回归和广义线性回归 (1)中我们有聊到多元线性回归模型的拟合思路以及模型求解的过程。但上一篇博文还未解答如何评估模型的好坏。在这篇博文中,我将通过一个简单的实例记录一下回归模型的建立流程...

    背景

    在上一篇博文 多元线性回归和广义线性回归 (1)中主要记录了多元线性回归模型的拟合思路以及模型求解的过程,但其还未解答如何评估模型的好坏。在这篇博文中,我将通过一个简单的实例记录一下回归模型的建立流程以及常用的模型评估方法。

    实例介绍

    市场需求

    如今许多广告运营的团队每年都会向公司申请定额的营销预算,这些预算一部分会分配给传统营销渠道,例如电视,商业广告等,也有一部分资金会流向社交媒体营销。传统营销渠道的花费基本都在团队可预见的范围内,但是社交媒体平台由于用户流动性大,喜好变化迅速等原因,无法让广告运营部门迅速提供一个合理且有前瞻性的预算,这导致许多品牌商一直在迫切地寻求一种简单易操作的Media Spend Estimator,希望它既能估算出自己未来新产品的营销预算,也能大致了解到竞争对手进入社交媒体这个战场时所投入的筹码。

    在这里插入图片描述

    Facebook, Twitter等作为全球社交媒体营销最高效的平台,现目前还未能向品牌商们提供相应的预估途径。但在了解了Facebook,Twitter等平台基本的广告投放规则后,一个简单粗糙的Media Spend Estimator的创建还是非常可行的。

    这些平台会让广告工作者事先设定好在该平台上想要触达的人群,人数以及触达的目的,平台会根据你的投入预算,利用推荐算法帮助你做个性化营销。倘若触达的目的是让被营销的用户点击博文并跳转进入自己的网站,那么用户每点击一次,该平台就会收取一次费用。不过如果投入的金额太少,平台在进行了预算评估后,推送效果可能会不尽人意,但如果投入的金额过多,又会浪费大量的流量资源,反而降低了营销效率。

    话句话说,一个实用的评估模型在社交媒体营销精准快的高需求下,是十分必要的。(以下的截图显示,某品牌商在2018年一年中,仅在Twitter这个平台就花费了1000万来做广告投放。)
    在这里插入图片描述

    建立模型的注意事项

    为了解决如何建立一个实用的预测模型,我们需要事先明白建立模型的意义。
    在实际工作中,建立机器学习模型是为了回答具体的问题,其本质是构建一个能理解数据背后模式和关系的模型,而不仅仅是分析数据本身。

    1. 理解问题 在搜集数据之前,我们需要确保我们能理解问题所指向的本质,例如用户的需求是什么,建立模型的目的是什么,我们能够调用的资源有哪些等等。
    2. 确定模型的复杂度 模型的复杂度与数据的复杂程度有关,如果是建立一个短期的预测模型,通常只需要少量关键的参数便可以实现,但如果要从长远考量,可能需要考虑到更加复杂的经济,社会因素,公司未来的盈利走势等等,模型就会因需要容纳更多的数据信息变得更加复杂。
    3. 数据的准备 高性能模型区别于低性能模型的一个重要原因就是训练数据的质量。为了保证模型泛化能力,首先我们需要清楚数据的需求量。通常来说,数据量是影响参数个数的十倍以上,建模就可以正常进行;或者我们可以通过学习曲线来确定是否数据量越多,模型的收益越好,通过该曲线我们可以找到一个最合适的数量区间。其次,我们要对数据进行一定程度的清洗。例如要确保因变量符合正态分布,如果有理缺失值异常值,需要及时对其进行处理,观察与调整连续型变量和分类变量的异常情况等。
    4. 误差容忍度 根据实际需解决的问题,我们需要建立一个合理的模型评判标准,例如预测准确率达到百分之多少是可以接受的。

    针对该实例,通过结合脸书广告投放的规则,我的猜测是:曝光率,触达人数,营销目的,持续天数以及用户互动情况等因素可能会影响到最终的Ads Spend。为了探讨我的假设,我从Facebook Ads Manager上下载了共三千多条广告营销记录,以Spend作为响应量,试图建立一个简单的回归预测模型。

    建模流程

    在这里插入图片描述

    数据探索

    1.导入必要的库与数据集

    ### 导入需要的库
    import pandas as pd
    import warnings
    import matplotlib.pyplot as plt
    import seaborn as sns
    import glob
    from datetime import datetime,timedelta
    %matplotlib inline
    warnings.filterwarnings('ignore')
    

    2.导入数据集
    这里为了不泄露所下载的广告数据的名字,广告名这一栏被我做了处理。

    ### 导入需要的库
    files = glob.glob('A*') #为了方便导入,我把下载好的数据文件名的首字母改为A
    Data = pd.DataFrame()
    for f in files:
        temp = pd.read_excel(f)
        Data=Data.append(temp)
    Data.head()
    

    数据预处理

    1.筛选数据集
    根据我的猜测,我筛选出了以下一些我认为对广告花销有影响的变量。

    1. Amount Spent (USD): 广告花销 (被预测的对象)
    2. Starts,Ends:广告起始时间(广告持续的时间会影响广告的曝光与转化率)
    3. Objective:投放广告的目的(不同的目的会触达不同类别的人群,例如我只想打造品牌,那么我只需要增加我的曝光量,但是如果我想提升销量,那么我会更加注重购物链接的点击率等指标,这需要广告主在了解自身客户画像的前提下做定向投放。故预测其会对模型产生影响)
    4. Platform:平台(脸书或IG,社交平台调性不同,其社交社区所对应的用户属性也不同)
    5. Impressions,Reach:曝光量必然是一个重要因素
    6. Post Engagement:广告博文的用户互动量,预测其会对模型产生影响
    #这里我粗暴地删除掉了没有花销数据的记录
    Data=Data.dropna(axis = 0, subset = ['Amount Spent (USD)'] )
    Data2=Data[['Starts','Ends','Objective','Amount Spent (USD)','Platform','Impressions','Reach','Post Engagement','Post Reactions','Post Comments','Post Shares']]
    

    2.处理时间数据

    # 将时间戳转换为日期
    Data2['Starts']=Data2['Starts'].apply(lambda x: str(x)[0:10])
    Data2['Ends']=Data2['Ends'].apply(lambda x: str(x)[0:10])
    
    # 计算出每个广告的持续时间(用结束日期减去开始日期)
    # from datetime import datetime,timedelta
    Data2['Starts']=Data2['Starts'].apply(lambda x:datetime.strptime(x,'%Y-%m-%d'))
    Data2['Ends']=Data2['Ends'].apply(lambda x:datetime.strptime(x,'%Y-%m-%d'))
    Data2['Period (days)']=Data2['Ends']-Data2['Starts']
    Data2['Period (days)']=Data2['Period (days)'].apply(lambda x: x.days)
    Data2=Data2.drop(['Starts','Ends'],axis=1)
    
    特征工程

    1.观察因变量‘Amount Spent (USD)’
    根据机器学习模型的运用规则,因变量通常需要符合正态分布或近似正态分布的特点,否则机器学习的结果便没有预期的泛化能力。峰度和偏度这两个指标可以帮助我们检测数据是否符合正态分布。
    (1)偏度(Skewness)
    偏度衡量随机变量概率分布的不对称性,通过它我们可以判断出数据分布不对称的程度与方向。正态分布的偏度为0,若偏度大于0,则为右偏(有一条长尾在右); 若偏度小于0,则为左偏(有一条长尾在左)。
    (2)峰度(Kurtosis)
    峰度是研究数据分布陡峭或平滑程度的统计量,正态分布的峰度为0,均匀分布的峰度为-1.2,指数分布的峰度为6。

    ### 查看因变量的峰度和偏度
    plt.figure(figsize = (8,4))
    print("skew: ",Data2['Amount Spent (USD)'].skew())
    sns.distplot(Data2['Amount Spent (USD)'])
    

    在这里插入图片描述
    从图中我们可以看出因变量并不符合正态分布。所以我们要将广告花费这一变量转换为正态分布。由于数据集里有部分广告的花销为0,将他们删除掉会造成结果的偏差,所以常规的log的变换在这里并不适用。但我们可以通过对因变量开N次方,来尽量解决数据分布非正态的问题。

    ### 解决数据分布非正态的问题
    ### Normalize Response variable
    import numpy as np
    target = pow(Data2['Amount Spent (USD)'], 1/6)
    plt.figure(figsize = (8,4))
    sns.distplot(target)
    print("skew: ",pow(Data2['Amount Spent (USD)'], 1/6).skew())
    print("skew: ",pow(Data2['Amount Spent (USD)'], 1/6).kurt())
    

    在这里插入图片描述
    从结果中我们可以看出变换后的数据在峰度和偏度上都更加接近正态分布了。那么我们可以进一步通过QQ图和箱线图来确认转换后的数据是否接近正态分布。

    ### 创建一个画图的函数
    def plotting_3_chart(df, feature):
        ## Importing seaborn, matplotlab and scipy modules. 
        import seaborn as sns
        import matplotlib.pyplot as plt
        import matplotlib.gridspec as gridspec
        from scipy import stats
        import matplotlib.style as style
        style.use('fivethirtyeight')
    
        ## Creating a customized chart. and giving in figsize and everything. 
        fig = plt.figure(constrained_layout=True, figsize=(8,5))
        ## creating a grid of 3 cols and 3 rows. 
        grid = gridspec.GridSpec(ncols=3, nrows=3, figure=fig)
        #gs = fig3.add_gridspec(3, 3)
    
        ## Customizing the histogram grid. 
        ax1 = fig.add_subplot(grid[0, :2])
        ## Set the title. 
        ax1.set_title('Histogram')
        ## plot the histogram. 
        sns.distplot(df.loc[:,feature], norm_hist=True, ax = ax1)
    
        # customizing the QQ_plot. 
        ax2 = fig.add_subplot(grid[1, :2])
        ## Set the title. 
        ax2.set_title('QQ_plot')
        ## Plotting the QQ_Plot. 
        stats.probplot(df.loc[:,feature], plot = ax2)
    
        ## Customizing the Box Plot. 
        ax3 = fig.add_subplot(grid[:, 2])
        ## Set title. 
        ax3.set_title('Box Plot')
        ## Plotting the box plot. 
        sns.boxplot(df.loc[:,feature], orient='v', ax = ax3 );
    
        ### 利用创建的函数得出结果
        plotting_3_chart(Data3, 'Amount Spent (USD)')
    

    在这里插入图片描述
    QQ图中的红色直线与蓝色直线基本吻合,证明因变量转换成功。接下来我们就可以进一步探究自变量的同质性了。
    2.观察分类变量‘Objective’
    下图中可以明显看出不同的平台其所对应的花销费用也有所不同,故将其考虑为建模的重要变量。

    ## 1. Objective
    plt.figure(figsize = (7,4))
    var='Platform'
    data=pd.concat([Data2['Amount Spent (USD)'],Data2[var]],axis=1)
    fig=sns.boxplot(x=var,y='Amount Spent (USD)',data=data)
    fig.axis(ymin=0,ymax=170000)
    

    在这里插入图片描述
    3.观察连续型变量 ‘Post Engagement, Period (days)’

    ## 2. Post Engagement
    ## 3. Period (days)
    ## 4. Reach
    
    ## Plot sizing. 
    fig, (ax1, ax2) = plt.subplots(figsize = (12,8), ncols=2,sharey=False)
    
    ## Scatter plotting for Amount Spent and Post Engagement. 
    sns.scatterplot( x = Data2['Post Engagement'], y = Data2['Amount Spent (USD)'],  ax=ax1)
    ## Putting a regression line. 
    sns.regplot(x = Data2['Post Engagement'], y = Data2['Amount Spent (USD)'], ax=ax1)
    
    ## Scatter plotting for Amount Spent and Reach. 
    sns.scatterplot( x = Data2['Reach'], y = Data2['Amount Spent (USD)'],  ax=ax2)
    ## Putting a regression line. 
    sns.regplot(x = Data2['Reach'], y = Data2['Amount Spent (USD)'], ax=ax2)
    
    #我这里就不展示Period (days)了
    

    在这里插入图片描述
    结果中我们可以看出,相较于互动量,曝光人数这一指标与广告花销的线性关系更强,这些数据点几乎是均匀地分布在斜线周围,随着曝光人数的增加,花销费用也逐渐增大。

    4.观察连续型变量的同质性
    在机器学习使用的规则中,我们还需要保证自变量自身拥有同质性,也就是说,在同样的广告额附近,该自变量数据间的差异值并不明显。

    ## 随着值的增加,差异值也增加,是异质性,按理说,同质性就是要几乎不变
    
    ## Plot sizing. 
    fig, (ax1, ax2) = plt.subplots(figsize = (12,8), ncols=2,sharey=False)
    ### 将转换后的花销额与没转换的花销额做一个对比
    ## Scatter plotting for SalePrice and GrLivArea. 
    sns.residplot(Data1['Reach'], Data1['Amount Spent (USD)'],ax=ax1)
    sns.residplot( x = Data2['Reach'], y = Data2['Amount Spent (USD)'],  ax=ax
    

    在这里插入图片描述
    转换后的花销费用比未转换后的同质性更强。进一步证明了因变量符合正态分布的重要性。

    5.观察自变量间的共线性
    在建模的过程中,我们需要尽量保证自变量与自变量之间相互独立,也就是说他们之间不会相互影响。好在从下图中我们可以看出,被选择的自变量间并没有很强的共线性。

    #### colinearity
    ## Plot fig sizing. 
    plt.style.use('ggplot')
    sns.set_style('whitegrid')
    plt.subplots(figsize = (8,5))
    ## Plotting heatmap. 
    
    # Generate a mask for the upper triangle (taken from seaborn example gallery)
    mask = np.zeros_like(Data3.corr(), dtype=np.bool)
    mask[np.triu_indices_from(mask)] = True
    
    
    sns.heatmap(Data3.corr(), 
                cmap=sns.diverging_palette(20, 220, n=200), 
                mask = mask, 
                annot=True, 
                center = 0, 
               );
    ## Give title. 
    plt.title("Heatmap of all the Features", fontsize = 20);
    

    在这里插入图片描述
    6.将分类变量转换为Dummy型变量

    Data3['Amount Spent (USD)']=pow(Data3['Amount Spent (USD)'], 1/6)
    #### convert categorical variables into dummies 
    Data3['Objective']=pd.get_dummies(Data3["Objective"])
    Data3['Platform']=pd.get_dummies(Data3["Platform"])
    

    7.选出最重要的6个自变量

    k=6
    plt.figure(figsize = (8,5))
    cols = corrmat.nlargest(k,'Amount Spent (USD)')['Amount Spent (USD)'].index
    cm = np.corrcoef(Data3[cols].values.T)
    sns.set(font_scale=1.25)
    hm=sns.heatmap(cm,cbar=True,annot=True,square=True,fmt='.2f',annot_kws={'size':10},yticklabels=cols.values,xticklabels=cols.values)
    plt.show()
    

    在这里插入图片描述

    训练集与测试集的创建

    我们将数据分为训练集与测试集。训练集的作用是,模型可以对其所提供的信息进行学习并模拟出一个预测模型,然后将测试集中的自变量输入到该预测模型中得到相应的预测值。而预测值与测试集中真实的花销费之间的差异可以反映出预测模型的准确度。

    from sklearn import preprocessing
    from sklearn import linear_model, svm, gaussian_process
    from sklearn.ensemble import RandomForestRegressor
    from sklearn.model_selection import train_test_split
    
    ### 训练集与测试集的创建
    cols = ['Reach','Platform','Impressions','Post Engagement','Impressions','Period (days)']
    x = Data3[cols].values
    y = Data3['Amount Spent (USD)'].values
    x_scaled = preprocessing.StandardScaler().fit_transform(x)
    y_scaled = preprocessing.StandardScaler().fit_transform(y.reshape(-1,1))
    x_train,x_test, y_train, y_test = train_test_split(x_scaled, y_scaled, test_size=0.33, random_state=42)
    
    print ('Original Training:',Data2.shape, 
           'Traning set:',x_train.shape ,
          'Testing set:',x_test.shape)
    
    print ('Original response:',Data2.shape, 
           'Traning response:',y_train.shape ,
          'Testing response:',y_test.shape)
    

    在这里插入图片描述

    建立模型

    我选取了SVM,随机森林,以及Ridge模型来模拟数据,并试图从中找到最好的模型。

    ### Try different models
    
    clfs = {
        'svm':svm.SVR(),
        'RandomForestRegressor':RandomForestRegressor(n_estimators=400),
        'BayesianRidge':linear_model.BayesianRidge(),
    }
    
    for clf in clfs:
        try:
            clfs[clf].fit(x_train,y_train)
            y_pred = clfs[clf].predict(x_test)
            print(clf + " cost:" + str(np.sum(y_pred-y_test)/len(y_pred)))
        except Exceptions as e:
            print(clf + 'Error:')
            print(str(e))
    

    在这里插入图片描述

    模型评估

    针对回归模型,通常有以下几种模型评估的方法

    1. RMSE (Root mean square error,平方根误差,越小越好)
      缺点:平均值是非鲁棒的,对于异常点敏感,如果某个异常点误差大,整个RMSE就会比较大。
    2. MSE (均方误差,越小越好)
    3. R^2 (代表模型的准确程度,越接近1模型越好)
    ### 计算MSE,R^2 Score
    from sklearn.metrics import mean_squared_error
    clfs = {
        'svm':svm.SVR(),
        'RandomForestRegressor':RandomForestRegressor(n_estimators=400),
        'BayesianRidge':linear_model.BayesianRidge(),
    }
    
    for clf in clfs:
    #         clfs[clf].fit(x_train,y_train)
    #         y_pred = clfs[clf].predict(x_test)
            lm = clfs[clf]
            model = lm.fit(x_train, y_train)
            y_pred = lm.predict(x_test)
            print(clf + " MSE:" , mean_squared_error(y_test, y_pred))
            print("Score:", lm.score(x_test, y_test))
    
    
    svm MSE: 0.22114082934602539
    Score: 0.7706987743336579
    R2 Score: 0.7706987743336579
    RandomForestRegressor MSE: 0.11762087138385889
    Score: 0.8780387590477001
    R2 Score: 0.8780387590477001
    BayesianRidge MSE: 0.48621319270963315
    Score: 0.4958448815030272
    R2 Score: 0.4958448815030272
    

    从结果中我们可以得出,随机森林的效果最好。

    实例总结

    本实例是一个非常简单的线性回归模型,训练集与测试集的分割方法也非常的基础,如果后续想继续提升模型的精准程度,我们可以尝试K-fold分割法,也可以将不同的模型进行整合,模拟出一个blend_model。当然,我们也可以继续尝试不同的算法,例如同样被频繁使用且效果甚好的Lasso, XGboost, Elastic等。

    Reference:
    1. https://www.kaggle.com/masumrumi/a-detailed-regression-guide-with-house-pricing
    2. https://blog.csdn.net/shine19930820/article/details/78335550
    展开全文
  • 广义线性回归在研究学生成绩相关性的应用,白春玲,樊顺厚,目前学风建设是高校管理中至关重要的一环。学风建设的好坏主要是由学生的学习来反映。本文从学生成绩角度出发,应用多元统计的广
  • 一、线性回归 y=ax+b 给出一个离散点,咱们想办法表示出a和b.(最小二乘法) 多个变量的情况: 考虑两个变量: 咱们的未知数是x1,x2,把Living area和price看成x1,x2.然后咱们只需要求出θ就可以完成拟合。 咱们的...
  • 系统总结线性回归模型、logistic回归模型、广义线性模型相关知识。 ...
  • 1、广义线性回归 广义线性模型有三个组成部分: (1) 随机部分, 即变量所属的指数族分布 族成员, 诸如正态分布, 二项分布, Poisson 分布等等. (2) 线性部分, 即 η = x⊤β. (3) 连接函数 g(µ) = η。 R 中的广义...
  • 广义线性回归和非线性模型——数据分析与R语言 Lecture 5回归诊断多重共线性广义线性回归模型(logistic)非线性模型 回归诊断 学习集可能有误差,输入错误,多输入0,离群值。 做线性的假设是否合理呢? 自变量正...
  • 线性回归1.线性回归1.1 线性模型(Linear Model)1.2 损失函数(Loss Function):Square Loss1.3 求解1.3.1 最小二乘法(Least Square Method)1.3.2 梯度下降法(Gradient Descent)1.4 正则化(Regularization) 1.线性回归 ...
  • 文章目录线性模型广义线性回归用法实际问题 线性模型 广义线性回归 广义线性模型(GLM)以两种方式扩展线性模型。 首先,预测值y^\hat{y}y^​ 通过逆链接函数hhh链接到输入变量XXX的线性组合: y^(w,X)=h(Xw) \hat{y...
  • 多元线性回归和广义线性回归 (1)

    千次阅读 2020-04-21 00:05:51
    目录背景多元线性回归常规公式拟合思路最小二乘法的推导将自变量系数与自变量整合为矩阵模拟过程存在误差项误差项符合高斯分布最大似然函数的引入自变量系数的估值求解评估β的估值是否合理 背景 线性回归模型的建立...
  • 幸运的是泊松分布是指数族分布,所以我们可以使用广义线性回归模型(GLM),本文将介绍广义线性模型来解决这个问题。 ​ 更一般的,在考虑回归和分类问题,我们需要考虑在特征\(x\)下\(y\)的值...
  • 逻辑斯谛回归概念可以认为是属于广义线性回归的范畴,但它是用来进行分类的。 线性模型的表达式为:f(x)=w0+w1x1+w2x2+...+wnxnf(x)=w_0+w_1x_1+w_2x_2+...+w_nx_nf(x)=w0​+w1​x1​+w2​x2​+...+wn​xn​——(1...
  •   在前面我们探讨了普通的线性回归,这次我们来讨论广义线性回归,通常也被称为 Logistic回归 ,我们先回忆一下线性回归的函数模型:   这个函数在表示的是一个直线,平面,或者超平面,不过它有致命的缺点,它...
  • 一些问题: 1. 什么时候我的问题可以用GLM,什么时候我的问题不能用GLM?...大部分分布都能看作是指数族分布,广义差不多是这个意思,我们常见的线性回归和logistic回归都是广义线性回归的特例,可以由它推...
  • 浅谈广义线性回归

    千次阅读 2017-08-22 11:06:12
     实际上线性最小二乘回归和Logistic回归都是广义线性模型的一个特例。当随机变量服从高斯分布,那么  得到的是线性最小二乘回归,当随机变量服从伯努利分布,则得到的是Logistic回归。  那么如
  • Poisson回归也是广义线性回归模型中的一中,详细介绍可见之前的博客: https://blog.csdn.net/qq_42871249/article/details/104339650 使用 Poisson回归模型时的两个问题 由于广义线性模型的假定很强, 所以当实际...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,815
精华内容 726
关键字:

广义线性回归