zoukankan      html  css  js  c++  java
  • Box-Cox转换

    1.适用变量

    连续的变量不满足正态分布的情况,一般是对因变量y进行转换,但是其实连续的自变量也是可以转换的

     

    2.如何判断变量是否满足正态分布

    #使用ks检验:
    #导入scipy模块
    from scipy import stats
    
    """
    kstest方法:KS检验,参数分别是:待检验的数据,检验方法(这里设置成norm正态分布),均值与标准差
    结果返回两个值:statistic → D值,pvalue → P值
    p值大于0.05,为正态分布
    H0:样本符合  
    H1:样本不符合 
    如何p>0.05接受H0 ,反之 
    """
    u = s['value'].mean()  # 计算均值
    std = s['value'].std()  # 计算标准差
    stats.kstest(s['value'], 'norm', (u, std))

     

    3.Box-Cox转换的优势

    Box-Cox变换的目的是为了让数据满足线性模型的基本假定,即线性、正态性及方差齐性

     

    4.什么时候用Box-Cox

    对于非正太数据的转换方法有:

    在一些情况下(P值<0.003)上述方法很难实现正态化处理,所以优先使用Box-Cox转换,但是当P值>0.003时两种方法均可,优先考虑普通的平方变换

    至于为什么是0.003??

     5.知道什么时候使用了,但是参数值怎么选择

    y_boxcox = special.boxcox1p(y, lam_best) 利用llf获得优化后的lambda或boxcox_normmax(x) 得到优化后的lambda

    # -*- coding: utf-8 -*-
    """
    Created on Tue Apr 13 09:55:46 2021
    
    @author: Administrator
    """
    
    #导入需要的模块
    
    import numpy as np
    import pandas as pd
    import matplotlib.pyplot as plt
    import seaborn as sns
    import pycard as pc
    
    train_data =pd.read_csv('D:/迅雷下载/used_car_train_20200313.csv',sep=' ')
    
    #%%计算p值
    #使用ks检验:
    #导入scipy模块
    from scipy import stats
    
    """
    kstest方法:KS检验,参数分别是:待检验的数据,检验方法(这里设置成norm正态分布),均值与标准差
    结果返回两个值:statistic → D值,pvalue → P值
    p值大于0.05,为正态分布
    H0:样本符合  
    H1:样本不符合 
    如何p>0.05接受H0 ,反之 
    """
    u = train_data['price'].mean()  # 计算均值
    std =train_data['price'].std()  # 计算标准差
    s,p = stats.kstest(train_data['price'], 'norm', (u, std))  #(0.21608994799012532, 0.0)
    
    
    #%%计算最佳的lambda
    
    from scipy import stats,special
    
     
    lam_range = np.linspace(-2,5,100)  # default nums=50
    llf = np.zeros(lam_range.shape, dtype=float)
    
    y = train_data['price']
     
    # lambda estimate:
    for i,lam in enumerate(lam_range):
        llf[i] = stats.boxcox_llf(lam, y)        # y 必须>0
     
    # find the max lgo-likelihood(llf) index and decide the lambda
    lam_best = lam_range[llf.argmax()]
    print('Suitable lam is: ',round(lam_best,2))
    print('Max llf is: ', round(llf.max(),2))
     
    
    y_boxcox = special.boxcox1p(y, lam_best)
    
    # 逆转换:
    y_invboxcox = special.inv_boxcox1p(y_boxcox, lam_best)
    
    #%%画图
    plt.figure(1)
    sns.distplot(train_data['price'])
    plt.figure(2)
    sns.distplot(y_boxcox)
    
    #%%计算转换之后的p值
    u = y_boxcox.mean()  # 计算均值
    std =y_boxcox.std()  # 计算标准差
    s,p = stats.kstest(y_boxcox, 'norm', (u, std))  #(0.02719269319870718, 8.643971208421137e-97)

    然而经Box-Cox变换后数据是否同时满足了以上假定,仍需要考察验证,虽然图片看着比之前好很多,但是仍然不能不满足正态分布

     

  • 相关阅读:
    用GDB调试程序(一)
    关于“鸡脚神”的看法
    Oracle 经典SQL 专为笔试准备
    怎样设计接口?
    myeclipse6.0下载及注冊码
    VB连接Mysql数据库
    开源html5_kiwijs_helloworld
    server宕机监控、检測、报警程序(139绑定手机短信报警)monitor_down.sh
    js实现自己定义鼠标右键-------Day45
    C/C++程序猿必须熟练应用的开源项目
  • 原文地址:https://www.cnblogs.com/cgmcoding/p/14652350.html
Copyright © 2011-2022 走看看