1. 程式人生 > >python資料分析:迴歸分析

python資料分析:迴歸分析

何為迴歸分析:

迴歸分析(regression analysis)指的是確定兩種或兩種以上變數間相互依賴的定量關係的一種統計分析方法。迴歸分析按照涉及的變數的多少,分為一元迴歸和多元迴歸分析;按照因變數的多少,可分為簡單迴歸分析和多重回歸分析;按照自變數和因變數之間的關係型別,可分為線性迴歸分析和非線性迴歸分析。

在大資料分析中,迴歸分析是一種預測性的建模技術,它研究的是因變數(目標)和自變數(預測器)之間的關係。這種技術通常用於預測分析,時間序列模型以及發現變數之間的因果關係。例如,司機的魯莽駕駛與道路交通事故數量之間的關係,最好的研究方法就是迴歸。

迴歸分析的主要應用場景是進行預測和控制,例如計劃制定、KPI制定、目標制定等方面;也可以基於預測的資料與實際資料進行比對和分析,確定事件發展程度並給未來行動提供方向性指導。

常用的迴歸演算法包括線性迴歸、二項式迴歸、對數迴歸、指數迴歸、核SVM、嶺迴歸、Lasso等。

迴歸分析相關係數

迴歸方程一般為y=ax+b的形式,其中a為變數x的迴歸係數,相關係數為R,判定係數為即R2

  • 迴歸係數:其絕對值大小能說明自變數與因變數之間的變化比例
  • 判定係數:自變數對因變數的方差解釋,為迴歸平方和與總離差平方和之比值
  • 相關係數:也稱解釋係數,衡量變數間的相關程度,其本質是線性相關性的判斷

ps:

  • 如果有多個自變數的話R2代表的這兩個自變數共同影響的結果。假如線上性迴歸中只有一個自變數,那麼判定係數等於相關係數的平方。
  • 迴歸係數和相關係數大於0,正相關;小於0,負相關。

使用迴歸模型應該注意自變數的變化,如果新增了自變數,或者訓練模型時遺漏了重要變數,這樣會導致模型引數有偏差,預測不準確;如果自變數的範圍超出了之前訓練時的範圍,那麼原來的模型也不適用。

判定係數經常作為擬合好壞的主要參照指標,當一個新的指標加入模型後發現模型不變,此時無法根據判定係數來反推該指標的重要性程度,例如該指標無效(或有效)。

迴歸分析演算法選擇:

  • 最普通的,最基礎的,基於為最小二乘法的普通線性迴歸最合適;適合規律明顯,資料結構簡單的資料。
  • 如果資料變數少可以通過散點圖發現自變數和因變數之間規律,然後確定使用何種迴歸方法
  • 自變數之間存在較強的共線性,使用對多重共線性處理的演算法,如嶺迴歸演算法。
  • 如果資料集噪音較多,使用主成分迴歸
  • 高緯度變數下,使用正則化迴歸方法效果較好,例如Lasso,Ridge和ElasticNet,或者使用逐步迴歸從中挑選出影響顯著的自變數來建立迴歸模型。
  • 同時驗證多個演算法,並想從中選擇一個來做做好的你和,使用交叉驗證做多個模型效果對比,並通過R-square、Adjusted R-square、AIC、BIC以及各種殘差、誤差項指標做綜合評估。
  • 注重模型的解釋性,線性迴歸、指數迴歸、對數迴歸、二項或多項式迴歸要優於核迴歸、支援向量迴歸機等
  • 整合方法,可以使用整合演算法對確認的演算法做組合使用。

python 程式碼實現

import numpy as np
import pandas as pd
from sklearn.linear_model import BayesianRidge, LinearRegression, ElasticNet
from sklearn.svm import SVR
from sklearn.ensemble.gradient_boosting import GradientBoostingRegressor   # 整合演算法
from sklearn.model_selection import cross_val_score    # 交叉驗證
from sklearn.metrics import explained_variance_score, mean_absolute_error, mean_squared_error, r2_score  
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline

# 資料匯入
df = pd.read_csv('https://raw.githubusercontent.com/ffzs/dataset/master/boston/train.csv', 
                 usecols=['lstat', 'indus', 'nox', 'rm', 'medv'])

# 視覺化資料關係
sns.set(style='whitegrid', context='notebook')   #style控制預設樣式,context控制著預設的畫幅大小
sns.pairplot(df, size=2)
plt.savefig('x.png')

在這裡插入圖片描述

# 相關度
corr = df.corr()
# 相關度熱力圖
sns.heatmap(corr, cmap='GnBu_r', square=True, annot=True)
plt.savefig('xx.png')

在這裡插入圖片描述

可見自變數lstat與因變數medv強負相關,自變數rm與因變數medv強正相關

# 自變數
X = df[['lstat', 'rm']].values
# 因變數
y = df[df.columns[-1]].values

# 設定交叉驗證次數
n_folds = 5

# 建立貝葉斯嶺迴歸模型
br_model = BayesianRidge()

# 普通線性迴歸
lr_model = LinearRegression()

# 彈性網路迴歸模型
etc_model = ElasticNet()

# 支援向量機迴歸
svr_model = SVR()

# 梯度增強迴歸模型物件
gbr_model = GradientBoostingRegressor()

# 不同模型的名稱列表
model_names = ['BayesianRidge', 'LinearRegression', 'ElasticNet', 'SVR', 'GBR']
# 不同迴歸模型
model_dic = [br_model, lr_model, etc_model, svr_model, gbr_model]
# 交叉驗證結果
cv_score_list = []
# 各個迴歸模型預測的y值列表
pre_y_list = []

# 讀出每個迴歸模型物件
for model in model_dic:
    # 將每個迴歸模型匯入交叉檢驗
    scores = cross_val_score(model, X, y, cv=n_folds)
    # 將交叉檢驗結果存入結果列表
    cv_score_list.append(scores)
    # 將回歸訓練中得到的預測y存入列表
    pre_y_list.append(model.fit(X, y).predict(X))
### 模型效果指標評估 ###
# 獲取樣本量,特徵數
n_sample, n_feature = X.shape
# 迴歸評估指標物件列表
model_metrics_name = [explained_variance_score, mean_absolute_error, mean_squared_error, r2_score]
# 迴歸評估指標列表
model_metrics_list = []
# 迴圈每個模型的預測結果
for pre_y in pre_y_list:
    # 臨時結果列表
    tmp_list = []
    # 迴圈每個指標物件
    for mdl in model_metrics_name:
        # 計算每個迴歸指標結果
        tmp_score = mdl(y, pre_y)
        # 將結果存入臨時列表
        tmp_list.append(tmp_score)
    # 將結果存入迴歸評估列表
    model_metrics_list.append(tmp_list)
df_score = pd.DataFrame(cv_score_list, index=model_names)
df_met = pd.DataFrame(model_metrics_list, index=model_names, columns=['ev', 'mae', 'mse', 'r2'])

# 各個交叉驗證的結果
df_score

在這裡插入圖片描述

# 各種評估結果
df_met

在這裡插入圖片描述

### 視覺化 ###
# 建立畫布
plt.figure(figsize=(9, 6))
# 顏色列表
color_list = ['r', 'g', 'b', 'y', 'c']
# 迴圈結果畫圖
for i, pre_y in enumerate(pre_y_list):
    # 子網路
    plt.subplot(2, 3, i+1)
    # 畫出原始值的曲線
    plt.plot(np.arange(X.shape[0]), y, color='k', label='y')
    # 畫出各個模型的預測線
    plt.plot(np.arange(X.shape[0]), pre_y, color_list[i], label=model_names[i])
    plt.title(model_names[i])
    plt.legend(loc='lower left')
plt.savefig('xxx.png')
plt.show()

在這裡插入圖片描述

以上可見梯度增強迴歸(GBR)是所有模型中擬合效果最好的

參考:
《python資料分析與資料化運營》 宋天龍
https://blog.csdn.net/cymy001/article/details/78556968