python數據分析:回歸分析(regression analysis)


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')
# 自變量
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()

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM