性(雙峰)數(shù)據(jù)正態(tài)化處理(sklearn))
Box-Cox變換是Box和Cox在1964年提出的一種廣義冪變換方法是統(tǒng)計建模中常用的一種數(shù)據(jù)變換用于連續(xù)的響應(yīng)變量不滿足正態(tài)分布的情況。Box-Cox變換之后可以一定程度上減小不可觀測的誤差和預(yù)測變量的相關(guān)性。Box-Cox變換的主要特點是引入一個參數(shù)通過數(shù)據(jù)本身估計該參數(shù)進而確定應(yīng)采取的數(shù)據(jù)變換形式Box-Cox變換可以明顯地改善數(shù)據(jù)的正態(tài)性、對稱性和方差相等性對許多實際數(shù)據(jù)都是行之有效的。但是當我們遇到雙峰性數(shù)據(jù)時使用box-cox方法進行處理處理出來的效果往往是不理想的因此我們需要換方法。通過數(shù)據(jù)處理發(fā)現(xiàn)sklearn.preprocessing.QuantileTransformer這個方法處理雙峰性數(shù)據(jù)的效果非常好因此我們接下來講講這種方法的具體使用以及對處理后的數(shù)據(jù)進行正態(tài)性檢驗以及查看峰度和偏度以及q-q圖。接下來我們先了解一下sklearn.preprocessing.QuantileTransformer這個方法。此方法將要素轉(zhuǎn)換為遵循均勻或正態(tài)分布。因此對于給定的特征此變換趨向于散布最頻繁的值。它還減少了邊際離群值的影響因此這是一個可靠的預(yù)處理方案。變換獨立應(yīng)用于每個功能。首先特征的累積分布函數(shù)的估計值用于將原始值映射到均勻分布。然后使用關(guān)聯(lián)的分位數(shù)函數(shù)將獲得的值映射到所需的輸出分布。低于或高于擬合范圍的新數(shù)據(jù)/看不見數(shù)據(jù)的特征值將映射到輸出分布的邊界。請注意此變換是非線性的。它可能會扭曲以相同比例尺測量的變量之間的線性相關(guān)性但會使以不同比例尺測量的變量更直接可比。好了接下來我們進入實戰(zhàn)我們以 2022 SAS中國高校數(shù)據(jù)分析大賽 復(fù)賽題目-農(nóng)產(chǎn)品期貨 數(shù)據(jù)為例子首先導(dǎo)入數(shù)據(jù)import pandas as pd import numpy as np from scipy import stats import matplotlib.pyplot as plt f pd.read_csv(rC:\Users\bai\Desktop\2022 SAS中國高校數(shù)據(jù)分析大賽 復(fù)賽題目-農(nóng)產(chǎn)品期貨\2022 SAS中國高校數(shù)據(jù)分析大賽 復(fù)賽題目-農(nóng)產(chǎn)品期貨\玉米期貨2005-2021日線數(shù)據(jù)\Corn_dat.csv) f.head() #查看數(shù)據(jù)導(dǎo)入畫圖庫查看原始數(shù)據(jù)的分布import seaborn as sns sns.set() #切換到sns的默認運行配置 sns.displot(f[High]) #畫直方圖畫q-q圖resstats.probplot(f[High],plotplt) #畫q-q圖參數(shù)檢驗p值偏度與峰度u f[High].mean() #求均值 std f[High].std() #求方差 result stats.kstest(f[High],norm,(u,std)) #正態(tài)分布檢驗 print(result) #輸出結(jié)果pvalue大于0.05才滿足正態(tài)分布print(fSkewness of saleprice: {f[High].skew()}) print(fKurtosis of saleprice: {f[High].kurt()})導(dǎo)入機器學習庫對數(shù)據(jù)進行處理from sklearn.preprocessing import QuantileTransformer #導(dǎo)入sklearn 分位數(shù)轉(zhuǎn)換器 將雙峰數(shù)據(jù)正態(tài)化 xQuantileTransformer(n_quantiles 300,output_distributionnormal, random_state0) #初始化參數(shù) #f[High].values.reshape(-1,1) 由于在sklearn中所有的數(shù)據(jù)都應(yīng)該是二維矩陣哪怕它只是單獨一行或一列 #比如前面做預(yù)測時僅僅只用了一個樣本數(shù)據(jù)所以需要使用.reshape(1,-1)進行轉(zhuǎn)換 high x.fit_transform(f[High].values.reshape(-1,1)) #調(diào)用分位數(shù)轉(zhuǎn)換器將數(shù)據(jù)進行轉(zhuǎn)換high.flatten() #將二維數(shù)據(jù)降維回來以便后面畫圖 f[high]high #將正態(tài)化的數(shù)據(jù)寫入表 f.head() #查看處理后的數(shù)據(jù)畫處理后的直方圖sns.displot(f[high]) #畫正態(tài)分布圖畫q-q圖resstats.probplot(f[high],plotplt) #畫q-q圖輸出檢驗參數(shù)u f[high].mean() #求均值 std f[high].std() #求方差 result stats.kstest(f[high],norm,(u,std)) #正態(tài)分布檢驗 print(result) #輸出結(jié)果pvalue大于0.05才滿足正態(tài)分布 print(fSkewness of saleprice: {f[High].skew()}) print(fKurtosis of saleprice: {f[High].kurt()})將原始數(shù)據(jù)還原回來方便數(shù)據(jù)分析fhigh x.inverse_transform(high) #將原始數(shù)據(jù)還原回來進行數(shù)據(jù)分析 print(fhigh)還原回來后和原數(shù)據(jù)相同。接下來就可以進行其他分析啦