熱線電話:13121318867

登錄
首頁精彩閱讀太厲害了!Seaborn也能做多種回歸分析,統統只需一行代碼
太厲害了!Seaborn也能做多種回歸分析,統統只需一行代碼
2021-07-07
收藏

來源:數據STUDIO

作者:云朵君

導讀: Seaborn就是讓困難的東西更加簡單。它是針對統計繪圖的,一般來說,能滿足數據分析90%的繪圖需求。Seaborn其實是在matplotlib的基礎上進行了更高級的API封裝,從而使得作圖更加容易,同時它能高度兼容numpypandas數據結構以及scipy與statsmodels等統計模式。

本文主要介紹回歸模型圖lmplot、線性回歸圖regplot,這兩個函數的核心功能很相似,都會繪制數據散點圖,并且擬合關于變量x,y之間的回歸曲線,同時顯示回歸的95%置信區間。

另一個是線性回歸殘差圖residplot,該函數繪制觀察點與回歸曲線上的預測點之間的殘差圖。

太厲害了!Seaborn也能做多種<a href='/map/huiguifenxi/' style='color:#000;font-size:inherit;'>回歸分析</a>,統統只需一行代碼

數據準備

所有圖形將使用股市數據--中國平安sh.601318歷史k線數據。

使用模塊及數據預處理

import numpy as np import matplotlib.pyplot as plt import pandas as pd import seaborn as sns import baostock as bs
bs.login()
result = bs.query_history_k_data('sh.601318', 
                                 fields = 'date,open,high, low,close,volume',
                                 start_date = '2020-01-01',
                                 end_date = '2021-05-01',
                                 frequency='d')
dataset = result.get_data().set_index('date').applymap(lambda x: float(x))
bs.logout()
dataset['Open_Close'] = (dataset['open'] - dataset['close'])/dataset['open']
dataset['High_Low'] = (dataset['high'] - dataset['low'])/dataset['low']
dataset['Increase_Decrease'] = np.where(dataset['volume'].shift(-1) > dataset['volume'],1,0)
dataset['Buy_Sell_on_Open'] = np.where(dataset['open'].shift(-1) > dataset['open'],1,0)
dataset['Buy_Sell'] = np.where(dataset['close'].shift(-1) > dataset['close'],1,0)
dataset['Returns'] = dataset['close'].pct_change()
dataset = dataset.dropna()
dataset['Up_Down'] = np.where(dataset['Returns'].shift(-1) > dataset['Returns'],'Up','Down')
dataset = dataset.dropna()
dataset.head()
太厲害了!Seaborn也能做多種<a href='/map/huiguifenxi/' style='color:#000;font-size:inherit;'>回歸分析</a>,統統只需一行代碼

一、回歸模型圖lmplot

lmplot是一種集合基礎繪圖與基于數據建立回歸模型的繪圖方法。通過lmplot我們可以直觀地總覽數據的內在關系。顯示每個數據集的線性回歸結果,xy變量,利用'hue'、'col'、'row'參數來控制繪圖變量??梢园阉醋鞣诸惱L圖依據。

同時可以使用模型參數來調節需要擬合的模型:order、logistic、lowess、robust、logx。

1、線性回歸

lmplot繪制散點圖線性回歸擬合線非常簡單,只需要指定自變量和因變量即可,lmplot會自動完成線性回歸擬合?;貧w模型的置信區間用回歸線周圍的半透明帶繪制。

lmplot 支持引入第三維度進行對比,例如我們設置 hue="species"。

sns.lmplot(x="open",
           y="close",
           hue="Up_Down",
           data=dataset)
太厲害了!Seaborn也能做多種<a href='/map/huiguifenxi/' style='color:#000;font-size:inherit;'>回歸分析</a>,統統只需一行代碼

2、局部加權線性回歸

局部加權回歸散點平滑法(locally weighted scatterplot smoothing,LOWESS),是一種非參數回歸擬合的方式,其主要思想是選取一定比例的局部數據,擬合多項式回歸曲線,以便觀察到數據的局部規律和趨勢。通過設置參數lowess=True 。

局部加權線性回歸機器學習里的一種經典的方法,彌補了普通線性回歸模型欠擬合或者過擬合的問題。其原理是給待預測點附近的每個點都賦予一定的權重,然后基于最小均方誤差進行普通的線性回歸。局部加權中的權重,是根據要預測的點與數據集中的點的距離來為數據集中的點賦權值。當某點離要預測的點越遠,其權重越小,否則越大。

局部加權線性回歸的優勢就在于處理非線性關系的異方差問題。

lowess bool, 可選
如果為True,使用統計模型來估計非參數低成本模型(局部加權線性回歸)。這種方法具有最少的假設,盡管它是計算密集型的,因此目前根本不計算置信區間。

sns.lmplot(x="open",
           y="close",
           hue="Up_Down",
           lowess=True,
           data=dataset)
太厲害了!Seaborn也能做多種<a href='/map/huiguifenxi/' style='color:#000;font-size:inherit;'>回歸分析</a>,統統只需一行代碼

3、對數線性回歸模型

通過設置參數logx 完成線性回歸轉換對數線性回歸,其實質上是完成了輸入空間x到輸出空間y非線性映射。

對數據做一些變換的目的是它能夠讓它符合我們所做的假設,使我們能夠在已有理論上對其分析。對數變換(log transformation)是特殊的一種數據變換方式,它可以將一類我們理論上未解決的模型問題轉化為已經解決的問題。

logx : bool, 可選
如果為True,則估計y ~ log(x)形式的線性回歸,在輸入空間中繪制散點圖和回歸模型。注意x必須是正的。

sns.lmplot(x="open",
           y="close",
           hue="Up_Down",
           data=dataset,
           logx=True)
太厲害了!Seaborn也能做多種<a href='/map/huiguifenxi/' style='color:#000;font-size:inherit;'>回歸分析</a>,統統只需一行代碼

4、穩健線性回歸

在有異常值的情況下,它可以使用不同的損失函數來減小相對較大的殘差,擬合一個健壯的回歸模型,傳入robust=True。

穩健回歸是將穩健估計方法用于回歸模型,以擬合大部分數據存在的結構,同時可識別出潛在可能的離群點、強影響點或與模型假設相偏離的結構。

穩健回歸是統計學穩健估計中的一種方法,其主要思路是將對異常值十分敏感的經典最小二乘回歸中的目標函數進行修改。經典最小二乘回歸以使誤差平方和達到最小為其目標函數。因為方差為一不穩健統計量,故最小二乘回歸是一種不穩健的方法。

不同的目標函數定義了不同的穩健回歸方法。常見的穩健回歸方法有:最小中位平方法、M估計法等。

hue, col, row : strings
定義數據子集的變量,并在不同的圖像子集中繪制

height : scalar, 可選
定義子圖的高度

col_wrap : int, 可選
設置每行子圖數量

n_boot int, 可選
用于估計的重采樣次數ci。默認值試圖平衡時間和穩定性。

ci int in [ 0,100 ]或None, 可選
回歸估計的置信區間的大小。這將使用回歸線周圍的半透明帶繪制。置信區間是使用bootstrap估算的;

robust bool, 可選
如果為True,則用于statsmodels估計穩健的回歸。這將消除異常值的權重。并且由于使用引導程序計算回歸線周圍的置信區間,您可能希望將其關閉獲得更快的迭代速度(使用參數ci=None)或減少引導重新采樣的數量(n_boot)。

sns.lmplot(x="open",
           y="volume",
           data=dataset,
           hue="Increase_Decrease",
           col="Increase_Decrease", 
           # col|hue控制子圖不同的變量species            col_wrap=2,    
           height=4,      
           robust=True)
太厲害了!Seaborn也能做多種<a href='/map/huiguifenxi/' style='color:#000;font-size:inherit;'>回歸分析</a>,統統只需一行代碼

5、多項式回歸

在存在高階關系的情況下,可以擬合多項式回歸模型來擬合數據集中的簡單類型的非線性趨勢。通過傳入參數order大于1,此時使用numpy.Polyfit估計多項式回歸的方法。

多項式回歸是回歸分析的一種形式,其中自變量 x 和因變量 y 之間的關系被建模為關于 x 的 次多項式。多項式回歸擬合x的值與 y 的相應條件均值之間的非線性關系,表示為 ,被用于描述非線性現象。

雖然多項式回歸是擬合數據的非線性模型,但作為統計估計問題,它是線性的。在某種意義上,回歸函數 在從數據估計到的未知參數中是線性的。因此,多項式回歸被認為是多元線性回歸的特例。

order : int, 可選
多項式回歸,設定指數

sns.lmplot(x="close",
           y="volume",
           data=dataset,
           hue="Increase_Decrease",
           col="Up_Down"# col|hue控制子圖不同的變量species            col_wrap=2,    # col_wrap控制每行子圖數量            height=4,      # height控制子圖高度            order=3        # 多項式最高次冪           )
太厲害了!Seaborn也能做多種<a href='/map/huiguifenxi/' style='color:#000;font-size:inherit;'>回歸分析</a>,統統只需一行代碼

6、邏輯回歸

Logistic回歸是一種廣義線性回歸,logistic回歸的因變量可以是二分類的,也可以是多分類的,但是二分類的更為常用,也更加容易解釋,多類可以使用softmax方法進行處理。

實際中最為常用的就是二分類logistic回歸。

{x,y}_jitter floats, 可選
在x或y變量中加入這個大小的均勻隨機噪聲。對回歸擬合后的數據副本添加噪聲,只影響散點圖的外觀。這在繪制取離散值的變量時很有用。

logistic bool, 可選
如果為True,則假定y是一個二元變量,并使用統計模型來估計logistic回歸模型。并且由于使用引導程序計算回歸線周圍的置信區間,您可能希望將其關閉獲得更快的迭代速度(使用參數ci=None)或減少引導重新采樣的數量(n_boot)。

# 制作具有性別色彩的自定義調色板 pal = dict(Up= "#6495ED", Down= "#F08080") # 買賣隨開盤價與漲跌變化 g = sns.lmplot(x= "open", y= "Buy_Sell", col= "Up_Down", hue= "Up_Down", 
               data=dataset,
               palette=pal, 
               y_jitter= .02, # 回歸噪聲                logistic= True)邏輯回歸模型 
太厲害了!Seaborn也能做多種<a href='/map/huiguifenxi/' style='color:#000;font-size:inherit;'>回歸分析</a>,統統只需一行代碼

二、線性回歸圖regplot

Lmplot()regplot()與兩個函數之間的主要區別是regplot()接受變量的類型可以是numpy數組、pandas序列(Series)?;蛘咧苯訉?span style="font-weight:700;">data傳入pandas DataFrame對象數據。而lmplot()data參數是必須的,且變量必須為字符串。

1、線性回歸

繪制連續型數據并擬合線性回歸模型。

fit_reg bool,可選
如果為True,則估計并繪制與x 和y變量相關的回歸模型。

ci int in [ 0,100 ]或None,可選
回歸估計的置信區間的大小。這將使用回歸線周圍的半透明帶繪制。置信區間是使用自舉估算的;對于大型數據集,建議將此參數設置為"None",以避免該計算。

scatter bool,可選
如果為True,則繪制一個散點圖,其中包含基礎觀察值(或x_estimator值)。

# 繪制線性回歸擬合曲線 f, ax = plt.subplots(figsize=(8,6))
sns.regplot(x="Returns",
            y="volume",
            data=dataset,
            fit_reg=True,
            ci = 95,
            scatter=True, 
            ax=ax)
太厲害了!Seaborn也能做多種<a href='/map/huiguifenxi/' style='color:#000;font-size:inherit;'>回歸分析</a>,統統只需一行代碼

除了可以接受連續型數據,也可接受離散型數據。將連續變量離散化,并在每個獨立的數據分組中對觀察結果進行折疊,以繪制中心趨勢的估計以及置信區間。

x_estimator callable映射向量->標量,可選
將此函數應用于的每個唯一值,x并繪制得出的估計值。當x是離散變量時,這很有用。如果x_ci給出,該估計將被引導,并得出一個置信區間。

x_bins int或vector,可選
將x變量分為離散的bin,然后估計中心趨勢和置信區間。這種裝箱僅影響散點圖的繪制方式;回歸仍然適合原始數據。該參數可以解釋為均勻大?。ú槐匾g隔)的垃圾箱數或垃圾箱中心的位置。使用此參數時,表示默認 x_estimator為numpy.mean。

x_ci “ ci”,“ sd”,[ 0,100 ]中的int或None,可選
繪制離散值的集中趨勢時使用的置信區間的大小x。如果為"ci",則遵循ci參數的值 。如果為"sd",則跳過引導程序,并在每個箱中顯示觀測值的標準偏差。

f, ax = plt.subplots(1,2,figsize=(15,6))
sns.regplot(x="Returns",
            y="volume",
            data=dataset,
            x_bins=10,
            x_ci="ci",
            ax=ax[0])
# 帶有離散x變量的圖,顯示了唯一值的方差和置信區間:
sns.regplot(x="Returns",
            y="volume",
            data=dataset,
            x_bins=10,
            x_ci='sd',
            ax=ax[1])
太厲害了!Seaborn也能做多種<a href='/map/huiguifenxi/' style='color:#000;font-size:inherit;'>回歸分析</a>,統統只需一行代碼

2、多項式回歸

order : int, 可選
多項式回歸,設定指數

sns.regplot(x="open",
            y="close",
            data=dataset.loc[dataset.Up_Down == "Up"],
            scatter_kws={"s": 80},
            order=5, ci=None)
太厲害了!Seaborn也能做多種<a href='/map/huiguifenxi/' style='color:#000;font-size:inherit;'>回歸分析</a>,統統只需一行代碼

3、邏輯回歸

{x,y}_jitter floats, 可選
將相同大小的均勻隨機噪聲添加到x或y 變量中。擬合回歸后,噪聲會添加到數據副本中,并且只會影響散點圖的外觀。在繪制采用離散值的變量時,這可能會有所幫助。

n_boot int, 可選
用于估計ci的bootstrap重樣本數。默認值試圖平衡時間和穩定性。

sns.regplot(x= "volume", 
            y= "Increase_Decrease",
            data=dataset,
            logistic=True, 
            n_boot=500, 
            y_jitter=.03,)
太厲害了!Seaborn也能做多種<a href='/map/huiguifenxi/' style='color:#000;font-size:inherit;'>回歸分析</a>,統統只需一行代碼

4、對數線性回歸

logx bool, 可選
如果為True,則估計y ~ log(x)形式的線性回歸,但在輸入空間中繪制散點圖和回歸模型。注意x必須是正的,這個才能成立。

sns.regplot(x="open",
            y="volume",
            data=dataset.loc[dataset.Up_Down == "Up"],
            x_estimator=np.mean, 
            logx=True)
太厲害了!Seaborn也能做多種<a href='/map/huiguifenxi/' style='color:#000;font-size:inherit;'>回歸分析</a>,統統只需一行代碼

5、穩健線性回歸

robust 布爾值,可選
擬合穩健的線性回歸。

sns.regplot(x="open",
            y="Returns",
            data=dataset.loc[dataset.Up_Down == "Up"],
            scatter_kws={"s"80},
            robust=True, ci=None)
太厲害了!Seaborn也能做多種<a href='/map/huiguifenxi/' style='color:#000;font-size:inherit;'>回歸分析</a>,統統只需一行代碼

三、線性回歸殘差圖residplot

residplot()用于檢查簡單的回歸模型是否擬合數據集。它擬合并移除一個簡單的線性回歸,然后繪制每個觀察值的殘差值。通過觀察數據的殘差分布是否具有結構性,若有則這意味著我們當前選擇的模型不是很適合。

1、線性回歸的殘差

此函數將對x進行y回歸(可能作為穩健或多項式回歸),然后繪制殘差的散點圖??梢赃x擇將最低平滑度擬合到殘差圖,這可以幫助確定殘差是否存在結構

lowess 布爾值,可選
在殘留散點圖上安裝最低平滑度的平滑器。

# 擬合線性模型后繪制殘差,lowess平滑 x=dataset.open
y=dataset.Returns
sns.residplot(x=x, y=y, 
              lowess=True, 
              color="g")
太厲害了!Seaborn也能做多種<a href='/map/huiguifenxi/' style='color:#000;font-size:inherit;'>回歸分析</a>,統統只需一行代碼

2、穩健回歸殘差圖

robust bool,可選
計算殘差時,擬合穩健的線性回歸。

sns.residplot(x="open",
              y="Returns",
              data=dataset.loc[dataset.Up_Down == "Up"],
              robust=True,
              lowess=True)
太厲害了!Seaborn也能做多種<a href='/map/huiguifenxi/' style='color:#000;font-size:inherit;'>回歸分析</a>,統統只需一行代碼

3、多項式回歸殘差圖

order int,可選
計算殘差時要擬合的多項式的階數。

sns.residplot(x="open",
              y="close",
              data=dataset.loc[dataset.Up_Down == "Up"],
              order=3,
              lowess=True)
太厲害了!Seaborn也能做多種<a href='/map/huiguifenxi/' style='color:#000;font-size:inherit;'>回歸分析</a>,統統只需一行代碼

四、其他背景中添加回歸

1、jointplot

jointplot()函數在其他更大、更復雜的圖形背景中使用regplot()。jointplot()可以通過kind="reg"來調用regplot()繪制線性關系。

sns.jointplot("open",
              "Returns",
              data=dataset, 
              kind='reg') # 設置kind="reg"為添加線性回歸擬合 #(使用regplot())和單變量KDE曲線 
太厲害了!Seaborn也能做多種<a href='/map/huiguifenxi/' style='color:#000;font-size:inherit;'>回歸分析</a>,統統只需一行代碼

jointplot()可以通過kind="resid"來調用residplot()繪制具有單變量邊際分布。

sns.jointplot(x="open", 
              y="close", 
              data=dataset, 
              kind="resid")
太厲害了!Seaborn也能做多種<a href='/map/huiguifenxi/' style='color:#000;font-size:inherit;'>回歸分析</a>,統統只需一行代碼

2、pairplot

pairplot()傳入kind="reg"參數則會融合regplot()PairGrid來展示變量間的線性關系。注意這里和lmplot()的區別,lmplot()繪制的行(或列)是將一個變量的多個水平(分類、取值)展開,而在這里,PairGrid則是繪制了不同變量之間的線性關系。

sns.pairplot(dataset, 
             x_vars=["open""close"], 
             y_vars=["Returns"],
             height=5, 
             aspect=.8,
             kind="reg");
太厲害了!Seaborn也能做多種<a href='/map/huiguifenxi/' style='color:#000;font-size:inherit;'>回歸分析</a>,統統只需一行代碼

數據分析咨詢請掃描二維碼

若不方便掃碼,搜微信號:CDAshujufenxi

數據分析師資訊
更多

OK
客服在線
立即咨詢
日韩人妻系列无码专区视频,先锋高清无码,无码免费视欧非,国精产品一区一区三区无码
客服在線
立即咨詢