随笔 - 384  文章 - 0  评论 - 35  阅读 - 142万

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
"""

#导入需要的模块\n
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变换后数据是否同时满足了以上假定,仍需要考察验证,虽然图片看着比之前好很多,但是仍然不能不满足正态分布

 

 

 

posted on   小小喽啰  阅读(2847)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示