數據挖掘-diabetes數據集分析-糖尿病病情預測_線性回歸_最小平方回歸


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


免責聲明!

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



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