sklearn的波士頓房價數據是經典的迴歸數據集。在MOOC的課程《用Python玩轉數據》最終的實踐課程中就用它來進行簡單的數據分析,以及模型擬合。html
文章將主要分爲2部分:python
一、使用sklearn的linear_model進行多元線性迴歸擬合;同時使用非線性迴歸模型來擬合(暫時還沒想好用哪一個?xgboost,仍是SVM?)。app
二、使用tensorflow創建迴歸模型擬合。dom
1、使用sklearn linear_regression 模型擬合boston房價datasets函數
from sklearn import datasets from sklearn import linear_model from sklearn.cross_validation import train_test_split from sklearn import metrics import os import matplotlib.pyplot as plt import pandas as pd import numpy as np '''----------load 數據集-----------''' dataset = datasets.load_boston() # x 訓練特徵:['CRIM', 'ZN', 'INDUS', 'CHAS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD', 'TAX', 'PTRATIO', 'B', 'LSTAT'] x = dataset.data target = dataset.target #把label變爲(?, 1)維度,爲了使用下面的數據集合分割 y = np.reshape(target,(len(target), 1)) #講數據集1:3比例分割爲 測試集:訓練集 x_train, x_verify, y_train, y_verify = train_test_split(x, y, random_state=1) ''' x_train的shape:(379, 13) y_train的shape:(379, 1) x_verify的shape:(127, 13) y_verify 的shape:(127, 1) ''' '''----------定義線性迴歸模型,進行訓練、預測-----------''' lr = linear_model.LinearRegression() lr.fit(x_train,y_train) y_pred = lr.predict(x_verify) '''----------圖形化預測結果-----------''' #只顯示前50個預測結果,太多的話看起來不直觀 plt.xlim([0,50]) plt.plot( range(len(y_verify)), y_verify, 'r', label='y_verify') plt.plot( range(len(y_pred)), y_pred, 'g--', label='y_predict' ) plt.title('sklearn: Linear Regression') plt.legend() plt.savefig('lr/lr-13.png') plt.show() '''----------輸出模型參數、評價模型-----------''' print(lr.coef_) print(lr.intercept_) print("MSE:",metrics.mean_squared_error(y_verify,y_pred)) print("RMSE:",np.sqrt(metrics.mean_squared_error(y_verify,y_pred))) #輸出模型對應R-Square print(lr.score(x_train,y_train)) print(lr.score(x_verify,y_verify))
結果以下:學習
[[-1.13256952e-01 5.70869807e-02 3.87621062e-02 2.43279795e+00
-2.12706290e+01 2.86930027e+00 7.02105327e-03 -1.47118312e+00
3.05187368e-01 -1.06649888e-02 -9.97404179e-01 6.39833822e-03
-5.58425480e-01]]測試
-----------權重參數Wspa
[45.23641585].net
----------偏置biascode
MSE: 21.88936943247483
RMSE: 4.678607638226872
----------MSE和RMSE都是表示衡量觀測值同真值之間的誤差
0.7167286808673383
----------訓練集的R-Square
0.7790257749137334
-----------測試集的R-Square
從圖看,部分數據結果誤差不大,部分預測結果還有必定差距,從r-square來看擬合效果湊合。
R2 也叫肯定係數(coefficient of determination),表示模 型對現實數據擬合的程度,它是皮爾遜相關係數的平方,從數值上說,R2介於 0~1 之間,越 接近 1 表示擬合效果越好,0.7以上 這個數字說明測試集中有 7 成多的數據可經過模型解釋, 擬合效果較好,但還有必定的空間,通常認爲超過 0.8 的模型擬合優度比較高,能夠嘗試使用非線性模型進行預測。
初學者能夠先關注調整 R2 和 T 檢驗的 p 值,後續能夠繼續理解利 用 F 檢驗檢查方程的總體顯著性以及進行殘差分析等,有興趣的學習者可進行深刻研究。
----(摘自MOOC《用Python玩轉數據》)
特徵選擇:
sklearn中特徵選擇有不少種方法:
去除方差較小的特徵:VarianceThreshold
單變量特徵選擇:SelectKBest、SelectPercentile、GenericUnivariateSelect
咱們這裏使用sklearn中SelectKBest函數進行特徵選擇,參數中的score_func選擇:
分類:chi2----卡方檢驗
f_classif----方差分析,計算方差分析(ANOVA)的F值 (組間均方 / 組內均方)
mutual_info_classif----互信息,互信息方法能夠捕捉任何一種統計依賴,可是做爲非參數方法,須要更多的樣本進行準確的估計
迴歸:f_regression----相關係數,計算每一個變量與目標變量的相關係數,而後計算出F值和P值
mutual_info_regression----互信息,互信息度量 X 和 Y 共享的信息:它度量知道這兩個變量其中一個,對另外一個不肯定度減小的程度
https://scikit-learn.org/stable/modules/generated/sklearn.feature_selection.SelectKBest.html
https://scikit-learn.org/stable/modules/generated/sklearn.feature_selection.f_regression.html
關於f_regression更具體解釋,具體也可看文章:https://blog.csdn.net/jetFlow/article/details/78884619
咱們的是迴歸問題,在這使用f_regression做爲score_func進行篩選條件,在樣本特徵選選出 k 個的得分高的特徵,默認 k = 10。波士頓房價問題中特徵是13個,咱們使用循環,看k值取多少合適。
MSE_list=[] score_train=[] score_verify=[] for i in range(2,14): x_new = SelectKBest(f_regression, k=i).fit_transform(x, target) x_train, x_verify, y_train, y_verify = train_test_split(x_new, y, random_state=1) y_train = y_train.reshape(-1) train_data = np.insert(x_train, 0, values=y_train, axis=1) y_t = train_data[:, 0].reshape(-1,1) lr = linear_model.LinearRegression() lr.fit(x_train,y_train) y_pred = lr.predict(x_verify) score_train.append(lr.score(x_train, y_train)) score_verify.append(lr.score(x_verify, y_verify)) MSE_list.append(metrics.mean_squared_error(y_verify,y_pred)) print('MSE_list:',MSE_list) print('train_score:',score_train) print('verify_score:',score_verify)
plt.subplot(2,1,1)
plt.plot(range(2,14),MSE_list)
plt.title('MSE')
plt.subplot(2,1,2)
plt.plot(range(2,14),score_train,label='score_train')
plt.plot(range(2,14),score_verify,label='score_verify')
plt.legend()
plt.title('R2 score')
plt.savefig('feature_selection.png')
plt.show()
結果輸出以下:
MSE_list: [30.97014521755215, 27.65412935105601, 27.651260247704577, 27.28301263897541, 28.13859216347999, 28.409333535357277, 26.719218376293934, 26.486798709462853, 26.493273792132474, 25.117759564415888, 22.228430426663383, 21.897765396049444]
train_score: [0.6124282780222445, 0.6552443540161836, 0.6552474484272307, 0.6557456371776518, 0.6585732416001857, 0.6616656815463774, 0.6720552272075447, 0.6772752178717331, 0.6775049108616567, 0.6816762497813345, 0.7116255502702171, 0.7168057552393374]
verify_score: [0.6873549116447073, 0.7208302494671684, 0.7208592132019043, 0.7245766903192703, 0.7159395743433946, 0.7132064273226943, 0.7302682202049733, 0.7326145077913399, 0.7325491415239512, 0.7464350230475125, 0.775602938057746, 0.7789410172622863]
可見仍是 k=13 時,訓練集和測試集上R2得分都是最高的。(這裏的R2得分與上面完整模型的分數略有誤差,我認爲是由於sklearn的版本的差別致使,不過度數差異不大,不影響咱們對模型的評估)
因此,綜上就是使用sklearn的線性迴歸模型對波士頓房價預測的擬合狀況。