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()