熱線電話:13121318867

登錄
首頁精彩閱讀Python數據挖掘之線性回歸知識及預測糖尿病實例
Python數據挖掘之線性回歸知識及預測糖尿病實例
2017-01-15
收藏

Python數據挖掘線性回歸知識及預測糖尿病實例

今天主要講述的內容是關于一元線性回歸的知識,Python實現,包括以下內容:
        1.機器學習常用數據集介紹
        2.什么是線性回顧
        3.LinearRegression使用方法
        4.線性回歸判斷糖尿病
        希望這篇文章對你有所幫助,尤其是剛剛接觸數據挖掘以及大數據的同學,同時準備嘗試以案例為主的方式進行講解。如果文章中存在不足或錯誤的地方,還請海涵~
        同時這篇文章是我上課的內容,所以參考了一些知識,強烈推薦大家學習斯坦福的機器學習Ng教授課程和Scikit-Learn中的內容。由于自己數學不是很好,自己也還在學習中,所以文章以代碼和一元線性回歸為主,數學方面的當自己學到一定的程度,才能進行深入的分享及介紹。抱歉~
一. 數據集介紹
        1.diabetes dataset數據集
        數據集參考:http://scikit-learn.org/stable/datasets/
        這是一個糖尿病的數據集,主要包括442行數據,10個屬性值,分別是:Age(年齡)、性別(Sex)、Body mass index(體質指數)、Average Blood Pressure(平均血壓)、S1~S6一年后疾病級數指標。Target為一年后患疾病的定量指標。

        輸出如下所示:
# -*- coding: utf-8 -*-
"""
Created on Thu Oct 27 02:37:05 2016

@author: yxz15
"""

from sklearn import datasets
diabetes = datasets.load_diabetes()                         #載入數據
print diabetes.data                                         #數據
print diabetes.target                                       #類標
print u'總行數: ', len(diabetes.data), len(diabetes.target) #數據總行數
print u'特征數: ', len(diabetes.data[0])                    #每行數據集維數
print u'數據類型: ', diabetes.data.shape                    #類型
print type(diabetes.data), type(diabetes.target)            #數據集類型

"""
[[ 0.03807591  0.05068012  0.06169621 ..., -0.00259226  0.01990842
  -0.01764613]
 [-0.00188202 -0.04464164 -0.05147406 ..., -0.03949338 -0.06832974
  -0.09220405]
  ...
 [-0.04547248 -0.04464164 -0.0730303  ..., -0.03949338 -0.00421986
   0.00306441]]

[ 151.   75.  141.  206.  135.   97.  138.   63.  110.  310.  101.
  ...
64.   48.  178.  104.  132.  220.   57.]

總行數:  442 442
特征數:  10
數據類型:  (442L, 10L)
<type 'numpy.ndarray'> <type 'numpy.ndarray'>
"""
        2.sklearn常見數據集
        常見的sklearn數據集包括,強烈推薦下面這篇文章:
        sklearn包含一些不許要下載的toy數據集,見下表,包括波士頓房屋數據集、鳶尾花數據集、糖尿病數據集、手寫字數據集和健身數據集等。

        3.UCI數據集
 

二. 什么是線性回歸
        1.機器學習簡述
        機器學習(Machine Learning )包括:
        a.監督學習(Supervised Learning):回歸(Regression)、分類(Classification)
        例:訓練過程中知道結果。小孩給水果分類,給他蘋果告訴他是蘋果,反復訓練學習。在給他說過,問他是什么?他回答準確,如果是桃子,他不能回答為蘋果。
        b.無監督學習(Unsupervised Learning):聚類(Clustering)
        例:訓練過程中不知道結果。給小孩一堆水果,如蘋果、橘子、桃子,小孩開始不知道需要分類的水果是什么,讓小孩對水果進行分類。分類完成后,給他一個蘋果,小孩應該把它放到蘋果堆中。
        c.增強學習(Reinforcement Learning)
        例:ML過程中,對行為做出評價,評價有正面的和負面兩種。通過學習評價,程序應做出更好評價的行為。
        d.推薦系統(Recommender System)
        
        2.斯坦福公開課:第二課 單變量線性回歸
        這是NG教授的很著名的課程,這里主要引用52nlp的文章,真的太完美了。推薦閱讀該作者的更多文章:
        Coursera公開課筆記: 斯坦福大學機器學習第二課"單變量線性回歸(Linear regression with one variable)"
        <1>模型表示(Model Representation)
        房屋價格預測問題,有監督學習問題。每個樣本的輸入都有正確輸出或答案,它也是一個回歸問題,預測一個真實值的出書。
        訓練集表示如下:

        對于房價預測問題,訊息過程如下所示:

        其中x代表房屋的大小,y代表預測的價格,h(hypothesis)將輸入變量映射到輸出變量y中,如何表示h呢?可以表示如下公式,簡寫為h(x),即帶一個變量的線性回歸或單變量線性回歸問題。

       <2>成本函數(Cost Function)
        對于上面的公式函數h(x),如何求theta0和theta1參數呢?

        構想: 對于訓練集(x, y),選取參數θ0, θ1使得hθ(x)盡可能的接近y。如何做呢?一種做法就是求訓練集的平方誤差函數(squared error function)。
        Cost Function可表示為:


        并且選取合適的參數使其最小化,數學表示如下:

        總的來說,線性回歸主要包括一下四個部分,分別是Hypothesis、Parameters、Cost Function、Goal。右圖位簡化版,theta0賦值為0。
 
        然后令θ1分別取1、0.5、-0.5等值,同步對比hθ(x)和J(θ0,θ1)在二維坐標系中的變化情況,具體可參考原PPT中的對比圖,很直觀。
 
        <3>梯度下降(Gradient descent)
        應用的場景之一最小值問題:
        對于一些函數,例如J(θ0,θ1)
        目標:  minθ0,θ1J(θ0,θ1)
        方法的框架:
        a. 給θ0, θ1一個初始值,例如都等于0;
        b. 每次改變θ0, θ1的時候都保持J(θ0,θ1)遞減,直到達到一個我們滿意的最小值;
        對于任一J(θ0,θ1) , 初始位置不同,最終達到的極小值點也不同,例如以下例子:

        3.一元回歸模型
        <1>什么是線性回歸?
        回歸函數的具體解釋和定義,可查看任何一本“概率論與數理統計”的書。我看的是“陳希孺”的。
        這里我講幾點:
        1)統計回歸分析的任務,就在于根據 x1,x2,...,xp 線性回歸和Y的觀察值,去估計函數f,尋求變量之間近似的函數關系。
        2)我們常用的是,假定f函數的數學形式已知,其中若干個參數未知,要通過自變量和因變量的觀察值去估計未知的參數值。這叫“參數回歸”。其中應用最廣泛的是f為線性函數的假設:

         這種情況叫做“線性回歸”。
        3)自變量只有一個時,叫做一元線性回歸。
                                            f(x) = b0+b1x
               自變量有多個時,叫做多元線性回歸。  
                                            f(x1,x2,...,xp) = b0 + b1x1 + b2x2 + ... + bpxp
        4)分類(Classification)與回歸(Regression)都屬于監督學習,他們的區別在于:
               分類:用于預測有限的離散值,如是否得了癌癥(0,1),或手寫數字的判斷,是0,1,2,3,4,5,6,7,8還是9等。分類中,預測的可能的結果是有限的,且提前給定的。
               回歸:用于預測實數值,如給定了房子的面積,地段,和房間數,預測房子的價格。

        <2>一元線性回歸
        假設:我們要預測房價。當前自變量(輸入特征)是房子面積x,因變量是房價y.給定了一批訓練集數據。我們要做的是利用手上的訓練集數據,得出x與y之間的函數f關系,并用f函數來預測任意面積x對應的房價。
        假設x與y是線性關系,則我們可以接著假設一元線性回歸函數如下來代表y的預測值:

        我們有訓練集了,那么問題就成了如何利用現有的訓練集來判定未知參數 (θ0,θ1) 的值,使其讓h的值更接近實際值y? 訓練集指的是已知x,y值的數據集合!
        一種方法是計算它的成本函數(Cost function),即預測出來的h的值與實際值y之間的方差的大小來決定當前的(θ0,θ1)值是否是最優的!
        常用的成本函數是最小二乘法:

        <3>模型總結
        整個一元線性回歸通過下面這張圖總結即可:

        最后,梯度下降和多元回歸模型將繼續學習,當我學到一定程度,再進行分享。

三. LinearRegression使用方法
        LinearRegression模型在Sklearn.linear_model下,它主要是通過fit(x,y)的方法來訓練模型,其中x為數據的屬性,y為所屬類型。
        sklearn中引用回歸模型的代碼如下:
from sklearn import linear_model       #導入線性模型
regr = linear_model.LinearRegression() #使用線性回歸
print regr
        輸出的函數原型如下所示:
LinearRegression(copy_X=True,
                 fit_intercept=True,
                 n_jobs=1,
                 normalize=False)
        fit(x, y): 訓練。分析模型參數,填充數據集。其中x為特征,y位標記或類屬性。
        predict(): 預測。它通過fit()算出的模型參數構成的模型,對解釋變量進行預測其類屬性。預測方法將返回預測值y_pred。

        這里推薦"搬磚小工053"大神的文章,非常不錯,強烈推薦。
        引用他文章的例子,參考:scikit-learn : 線性回歸,多元回歸,多項式回歸
# -*- coding: utf-8 -*-
"""
Created on Fri Oct 28 00:44:55 2016

@author: yxz15
"""

from sklearn import linear_model       #導入線性模型
import matplotlib.pyplot as plt        #繪圖
import numpy as np

#X表示匹薩尺寸 Y表示匹薩價格
X = [[6], [8], [10], [14], [18]]
Y = [[7], [9], [13], [17.5], [18]]

print u'數據集X: ', X
print u'數據集Y: ', Y

#回歸訓練
clf = linear_model.LinearRegression() #使用線性回歸
clf.fit(X, Y)                         #導入數據集
res = clf.predict(np.array([12]).reshape(-1, 1))[0] #預測結果
print(u'預測一張12英寸匹薩價格:$%.2f' % res)

#預測結果
X2 = [[0], [10], [14], [25]]
Y2 = clf.predict(X2)

#繪制線性回歸圖形
plt.figure()
plt.title(u'diameter-cost curver')   #標題
plt.xlabel(u'diameter')              #x軸坐標
plt.ylabel(u'cost')                  #y軸坐標
plt.axis([0, 25, 0, 25])             #區間
plt.grid(True)                       #顯示網格
plt.plot(X, Y, 'k.')                 #繪制訓練數據集散點圖
plt.plot(X2, Y2, 'g-')               #繪制預測數據集直線
plt.show()

        運行結果如下所示,首先輸出數據集,同時調用sklearn包中的LinearRegression()回歸函數,fit(X, Y)載入數據集進行訓練,然后通過predict()預測數據12尺寸的匹薩價格,最后定義X2數組,預測它的價格。
數據集X:  [[6], [8], [10], [14], [18]]
數據集Y:  [[7], [9], [13], [17.5], [18]]
預測一張12英寸匹薩價格:$13.68
        輸出的圖形如下所示:

        線性模型的回歸系數W會保存在他的coef_方法中,截距保存在intercept_中。score(X,y,sample_weight=None) 評分函數,返回一個小于1的得分,可能會小于0。
print u'系數', clf.coef_
print u'截距', clf.intercept_
print u'評分函數', clf.score(X, Y)
'''
系數 [[ 0.9762931]]
截距 [ 1.96551743]
評分函數 0.910001596424
'''

其中具體的系數介紹推薦如下資料:sklearn學習筆記之簡單線性回歸 - Magle

四. 線性回歸判斷糖尿病

        1.Diabetes數據集(糖尿病數據集)
        糖尿病數據集包含442個患者的10個生理特征(年齡,性別、體重、血壓)和一年以后疾病級數指標。
        然后載入數據,同時將diabetes糖尿病數據集分為測試數據和訓練數據,其中測試數據為最后20行,訓練數據從0到-20行(不包含最后20行),即diabetes.data[:-20]。
from sklearn import datasets

#數據集
diabetes = datasets.load_diabetes() #載入數據

diabetes_x = diabetes.data[:, np.newaxis]  #獲取一個特征
diabetes_x_temp = diabetes_x[:, :, 2]

diabetes_x_train = diabetes_x_temp[:-20]   #訓練樣本
diabetes_x_test = diabetes_x_temp[-20:]    #測試樣本 后20行
diabetes_y_train = diabetes.target[:-20]   #訓練標記
diabetes_y_test = diabetes.target[-20:]    #預測對比標記

print u'劃分行數:', len(diabetes_x_temp), len(diabetes_x_train), len(diabetes_x_test)
print diabetes_x_test
        輸出結果如下所示,可以看到442個數據劃分為422行進行訓練回歸模型,20行數據用于預測。輸出的diabetes_x_test共20行數據,每行僅一個特征。
劃分行數: 442 422 20
[[ 0.07786339]
 [-0.03961813]
 [ 0.01103904]
 [-0.04069594]
 [-0.03422907]
 [ 0.00564998]
 [ 0.08864151]
 [-0.03315126]
 [-0.05686312]
 [-0.03099563]
 [ 0.05522933]
 [-0.06009656]
 [ 0.00133873]
 [-0.02345095]
 [-0.07410811]
 [ 0.01966154]
 [-0.01590626]
 [-0.01590626]
 [ 0.03906215]
 [-0.0730303 ]]

        2.完整代碼
        改代碼的任務是從生理特征預測疾病級數,但僅獲取了一維特征,即一元線性回歸?!?a href="http://www.ruiqisteel.com/view/19879.html" target="_blank">線性回歸】的最簡單形式給數據集擬合一個線性模型,主要是通過調整一系列的參以使得模型的殘差平方和盡量小。
        線性模型:y = βX+b
        X:數據 y:目標變量 β:回歸系數 b:觀測噪聲(bias,偏差
        參考文章:Linear Regression Example - Scikit-Learn
# -*- coding: utf-8 -*-
"""
Created on Fri Oct 28 01:21:30 2016

@author: yxz15
"""

from sklearn import datasets
import matplotlib.pyplot as plt
import numpy as np

#數據集
diabetes = datasets.load_diabetes() #載入數據

#獲取一個特征
diabetes_x_temp = diabetes.data[:, np.newaxis, 2]

diabetes_x_train = diabetes_x_temp[:-20]   #訓練樣本
diabetes_x_test = diabetes_x_temp[-20:]    #測試樣本 后20行
diabetes_y_train = diabetes.target[:-20]   #訓練標記
diabetes_y_test = diabetes.target[-20:]    #預測對比標記

#回歸訓練及預測
clf = linear_model.LinearRegression()
clf.fit(diabetes_x_train, diabetes_y_train)  #注: 訓練數據集

#系數 殘差平法和 方差得分
print 'Coefficients :\n', clf.coef_
print ("Residual sum of square: %.2f" %np.mean((clf.predict(diabetes_x_test) - diabetes_y_test) ** 2))
print ("variance score: %.2f" % clf.score(diabetes_x_test, diabetes_y_test))

#繪圖
plt.title(u'LinearRegression Diabetes')   #標題
plt.xlabel(u'Attributes')                 #x軸坐標
plt.ylabel(u'Measure of disease')         #y軸坐標
#點的準確位置
plt.scatter(diabetes_x_test, diabetes_y_test, color = 'black')
#預測結果 直線表示
plt.plot(diabetes_x_test, clf.predict(diabetes_x_test), color='blue', linewidth = 3)
plt.show()
        運行結果如下所示,包括系數、殘差平方和、方差分數。
Coefficients :[ 938.23786125]
Residual sum of square: 2548.07
variance score: 0.47

繪制圖形如下所示,每個點表示真實的值,而直線表示預測的結果,比較接近吧。

        同時繪制圖形時,想去掉坐標具體的值,可增加如下代碼:
plt.xticks(())
plt.yticks(())

數據分析咨詢請掃描二維碼

若不方便掃碼,搜微信號:CDAshujufenxi

數據分析師資訊
更多

OK
客服在線
立即咨詢
日韩人妻系列无码专区视频,先锋高清无码,无码免费视欧非,国精产品一区一区三区无码
客服在線
立即咨詢