- # coding: utf-8
- # 利用 diabetes數據集來學習線性回歸
- # diabetes 是一個關於糖尿病的數據集, 該數據集包括442個病人的生理數據及一年以后的病情發展情況。
- # 數據集中的特征值總共10項, 如下:
- # 年齡
- # 性別
- #體質指數
- #血壓
- #s1,s2,s3,s4,s4,s6 (六種血清的化驗數據)
- #但請注意,以上的數據是經過特殊處理, 10個數據中的每個都做了均值中心化處理,然后又用標准差乘以個體數量調整了數值范圍。驗證就會發現任何一列的所有數值平方和為1.
- #關於數據集更多的信息: http://scikit-learn.org/stable/modules/generated/sklearn.datasets.load_diabetes.html
- # http://scikit-learn.org/stable/datasets/index.html#datasets
- import numpy as np
- from sklearn import datasets
- diabetes=datasets.load_diabetes()
- #查看第一列年齡的數據
- diabetes.data[0]
- #求證: 每一列的數值的平方和為1
- np.sum( diabetes.data[:,0]**2) #求年齡列
- #糖尿病進展的數據
- diabetes.target #數值介於 25到346之間
- #切分訓練集與測試集
- #自動切分訓練集太小了
- #from sklearn.cross_validation import train_test_split
- #x_train,x_test,y_train,y_test=train_test_split( diabetes.data,diabetes.target,random_state=14)
- #所以換成手工切分
- x_train=diabetes.data[:-20]
- y_train=diabetes.target[:-20]
- x_test=diabetes.data[-20:]
- y_test=diabetes.target[-20:]
- #什么是回歸呢? 回歸的目的是預測數值型的目標值。最直接的辦法是根據訓練數據計算出一個求目標值的計算公式。假如你想預測一個地區的餐館數量,可能會這么計算:
- # num = 0.002 * people + 0.001 * gpd
- # 以上就是所謂的回歸方程,其中的0.002, 0.001稱作回歸系數,求這些回歸系數的過程就是回歸。一旦求出了這些回歸系數,再給定輸入,做預測就簡單了.
- # 回歸分為線性回歸和非線性回歸。 上面的公式描述的就是線性回歸.
- #線性回歸通過擬合線性模型的回歸系數W =(w_1,…,w_p)來減少數據中觀察到的結果和實際結果之間的殘差平方和,並通過線性逼近進行預測。
- #scikit-learn庫的線性回歸預測模型通過fit(x,y)方法來訓xaisaj型,其中x為數據的屬性,y為所屬的類型.線性模型的回歸系數W會保存在它的coef_方法中.
- from sklearn import linear_model
- linreg=linear_model.LinearRegression() #創建線性回歸
- #用訓練集訓練模型
- linreg.fit( x_train,y_train)
- #調用預測模型的coef_屬性,求出每種生理數據的回歸系數b, 一共10個結果,分別對應10個生理特征.
- linreg.coef_
- #在模型上調用predict()函數,傳入測試集,得到預測值,
- linreg.predict( x_test )
- #結果:array([ 197.61846908, 155.43979328, 172.88665147, 111.53537279,
- # 164.80054784, 131.06954875, 259.12237761, 100.47935157,
- # 117.0601052 , 124.30503555, 218.36632793, 61.19831284,
- # 132.25046751, 120.3332925 , 52.54458691, 194.03798088,
- # 102.57139702, 123.56604987, 211.0346317 , 52.60335674])
- #查看實際目標值
- y_test
- #array([ 233., 91., 111., 152., 120., 67., 310., 94., 183.,
- # 66., 173., 72., 49., 64., 48., 178., 104., 132.,
- # 220., 57.])
- #如何評價以上的模型優劣呢?我們可以引入方差,方差越接近於1,模型越好.
- # 方差: 統計中的方差(樣本方差)是各個數據分別與其平均數之差的平方的和的平均數
- linreg.score( x_test,y_test)
- #對每個特征繪制一個線性回歸圖表
- import matplotlib.pyplot as plt
- #matplot顯示圖例中的中文問題 : https://www.zhihu.com/question/25404709/answer/67672003
- import matplotlib.font_manager as fm
- #mac中的字體問題請看: https://zhidao.baidu.com/question/161361596.html
- myfont = fm.FontProperties(fname='/Library/Fonts/Xingkai.ttc')
- plt.figure( figsize=(8,12))
- #循環10個特征
- for f in range(0,10):
- #取出測試集中第f特征列的值, 這樣取出來的數組變成一維的了,
- xi_test=x_test[:,f]
- #取出訓練集中第f特征列的值
- xi_train=x_train[:,f]
- #將一維數組轉為二維的
- xi_test=xi_test[:,np.newaxis]
- xi_train=xi_train[:,np.newaxis]
- plt.ylabel(u'病情數值',fontproperties=myfont)
- linreg.fit( xi_train,y_train) #根據第f特征列進行訓練
- y=linreg.predict( xi_test ) #根據上面訓練的模型進行預測,得到預測結果y
- #加入子圖
- plt.subplot(5,2,f+1) # 5表示10個圖分為5行, 2表示每行2個圖, f+1表示圖的編號,可以使用這個編號控制這個圖
- #繪制點 代表測試集的數據分布情況
- plt.scatter( xi_test,y_test,color='k' )
- #繪制線
- plt.plot(xi_test,y,color='b',linewidth=3)
- plt.savefig('python_糖尿病數據集_預測病情_線性回歸_最小平方回歸.png')
- plt.show()