太厲害了!Seaborn也能做多種迴歸分析,統統只需一行程式碼
2022-03-20由 CDA資料分析師 發表于 農業
我們為什麼要進行迴歸分析
作者:雲朵君
導讀: Seaborn就是讓困難的東西更加簡單。它是針對統計繪圖的,一般來說,能滿足資料分析90%的繪圖需求。Seaborn其實是在matplotlib的基礎上進行了更高階的API封裝,從而使得作圖更加容易,同時它能高度相容numpy與pandas資料結構以及scipy與statsmodels等統計模式。
本文主要介紹迴歸模型圖lmplot、線性迴歸圖regplot,這兩個函式的核心功能很相似,都會繪製資料散點圖,並且擬合關於變數x,y之間的迴歸曲線,同時顯示迴歸的95%置信區間。
另一個是線性迴歸殘差圖residplot,該函式繪製觀察點與迴歸曲線上的預測點之間的殘差圖。
資料準備
所有圖形將使用股市資料——中國平安sh。601318歷史k線資料。
使用模組及資料預處理
import numpy as npimport matplotlib。pyplot as pltimport pandas as pdimport seaborn as snsimport baostock as bsbs。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()
一、迴歸模型圖lmplot
lmplot
是一種集合基礎繪圖與基於資料建立迴歸模型的繪圖方法。透過
lmplot
我們可以直觀地總覽資料的內在關係。顯示每個資料集的線性迴歸結果,xy變數,利用‘hue’、‘col’、‘row’引數來控制繪圖變數。可以把它看作分類繪圖依據。
同時可以使用模型引數來調節需要擬合的模型:order、logistic、lowess、robust、logx。
1、線性迴歸
lmplot
繪製散點圖及線性迴歸擬合線非常簡單,只需要指定自變數和因變數即可,
lmplot
會自動完成線性迴歸擬合。迴歸模型的置信區間用迴歸線周圍的半透明帶繪製。
lmplot
支援引入第三維度進行對比,例如我們設定 hue=“species”。
sns。lmplot(x=“open”, y=“close”, hue=“Up_Down”, data=dataset)
2、區域性加權線性迴歸
區域性加權迴歸散點平滑法(locally weighted scatterplot smoothing,LOWESS),是一種非引數迴歸擬合的方式,其主要思想是選取一定比例的區域性資料,擬合多項式迴歸曲線,以便觀察到資料的區域性規律和趨勢。透過設定引數lowess=True 。
區域性加權線性迴歸是機器學習裡的一種經典的方法,彌補了普通線性迴歸模型欠擬合或者過擬合的問題。其原理是給待預測點附近的每個點都賦予一定的權重,然後基於最小均方誤差進行普通的線性迴歸。區域性加權中的權重,是根據要預測的點與資料集中的點的距離來為資料集中的點賦權值。當某點離要預測的點越遠,其權重越小,否則越大。
區域性加權線性迴歸的優勢就在於處理非線性關係的異方差問題。
lowess bool, 可選
如果為True,使用統計模型來估計非引數低成本模型(區域性加權線性迴歸)。這種方法具有最少的假設,儘管它是計算密集型的,因此目前根本不計算置信區間。
sns。lmplot(x=“open”, y=“close”, hue=“Up_Down”, lowess=True, data=dataset)
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)
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)
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 # 多項式最高次冪 )
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)# 邏輯迴歸模型
二、線性迴歸圖regplot
Lmplot()與regplot()與兩個函式之間的主要區別是regplot()接受變數的型別可以是
numpy陣列、pandas序列(Series)
。或者直接對
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)
除了可以接受連續型資料,也可接受離散型資料。將連續變數離散化,並在每個獨立的資料分組中對觀察結果進行摺疊,以繪製中心趨勢的估計以及置信區間。
x_estimator callable映射向量->標量,可選
將此函式應用於的每個唯一值,x並繪製得出的估計值。當x是離散變數時,這很有用。如果x_ci給出,該估計將被引導,並得出一個置信區間。
x_bins int或vector,可選
將x變數分為離散的bin,然後估計中心趨勢和置信區間。這種裝箱僅影響散點圖的繪製方式;迴歸仍然適合原始資料。該引數可以解釋為均勻大小(不必要間隔)的垃圾箱數或垃圾箱中心的位置。使用此引數時,表示預設 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])
2、多項式迴歸
order : int, 可選
多項式迴歸,設定指數
sns。regplot(x=“open”, y=“close”, data=dataset。loc[dataset。Up_Down == “Up”], scatter_kws={“s”: 80}, order=5, ci=None)
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,)
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)
5、穩健線性迴歸
robust 布林值,可選
擬合穩健的線性迴歸。
sns。regplot(x=“open”, y=“Returns”, data=dataset。loc[dataset。Up_Down == “Up”], scatter_kws={“s”: 80}, robust=True, ci=None)
三、線性迴歸殘差圖residplot
residplot()用於檢查簡單的迴歸模型是否擬合數據集。它擬合併移除一個簡單的線性迴歸,然後繪製每個觀察值的殘差值。透過觀察資料的殘差分佈是否具有結構性,若有則這意味著我們當前選擇的模型不是很適合。
1、線性迴歸的殘差
此函式將對
x
進行
y
迴歸(可能作為穩健或多項式迴歸),然後繪製殘差的散點圖。可以選擇將最低平滑度擬合到殘差圖,這可以幫助確定殘差是否存在結構
lowess 布林值,可選
在殘留散點圖上安裝最低平滑度的平滑器。
# 擬合線性模型後繪製殘差,lowess平滑x=dataset。openy=dataset。Returnssns。residplot(x=x, y=y, lowess=True, color=“g”)
2、穩健迴歸殘差圖
robust bool,可選
計算殘差時,擬合穩健的線性迴歸。
sns。residplot(x=“open”, y=“Returns”, data=dataset。loc[dataset。Up_Down == “Up”], robust=True, lowess=True)
3、多項式迴歸殘差圖
order int,可選
計算殘差時要擬合的多項式的階數。
sns。residplot(x=“open”, y=“close”, data=dataset。loc[dataset。Up_Down == “Up”], order=3, lowess=True)
四、其他背景中添加回歸
1、jointplot
jointplot()函式在其他更大、更復雜的圖形背景中使用regplot()。jointplot()可以透過kind=“reg”來呼叫regplot()繪製線性關係。
sns。jointplot(“open”, “Returns”, data=dataset, kind=‘reg’)# 設定kind=“reg”為新增線性迴歸擬合#(使用regplot())和單變數KDE曲線
jointplot()可以透過kind=“resid”來呼叫residplot()繪製具有單變數邊際分佈。
sns。jointplot(x=“open”, y=“close”, data=dataset, kind=“resid”)
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”);