
今天主要講述的內容是關于一元線性回歸的知識,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
CDA數據分析師證書考試體系(更新于2025年05月22日)
2025-05-26解碼數據基因:從數字敏感度到邏輯思維 每當看到超市貨架上商品的排列變化,你是否會聯想到背后的銷售數據波動?三年前在零售行 ...
2025-05-23在本文中,我們將探討 AI 為何能夠加速數據分析、如何在每個步驟中實現數據分析自動化以及使用哪些工具。 數據分析中的AI是什么 ...
2025-05-20當數據遇見人生:我的第一個分析項目 記得三年前接手第一個數據分析項目時,我面對Excel里密密麻麻的銷售數據手足無措。那些跳動 ...
2025-05-20在數字化運營的時代,企業每天都在產生海量數據:用戶點擊行為、商品銷售記錄、廣告投放反饋…… 這些數據就像散落的拼圖,而相 ...
2025-05-19在當今數字化營銷時代,小紅書作為國內領先的社交電商平臺,其銷售數據蘊含著巨大的商業價值。通過對小紅書銷售數據的深入分析, ...
2025-05-16Excel作為最常用的數據分析工具,有沒有什么工具可以幫助我們快速地使用excel表格,只要輕松幾步甚至輸入幾項指令就能搞定呢? ...
2025-05-15數據,如同無形的燃料,驅動著現代社會的運轉。從全球互聯網用戶每天產生的2.5億TB數據,到制造業的傳感器、金融交易 ...
2025-05-15大數據是什么_數據分析師培訓 其實,現在的大數據指的并不僅僅是海量數據,更準確而言是對大數據分析的方法。傳統的數 ...
2025-05-14CDA持證人簡介: 萬木,CDA L1持證人,某電商中廠BI工程師 ,5年數據經驗1年BI內訓師,高級數據分析師,擁有豐富的行業經驗。 ...
2025-05-13CDA持證人簡介: 王明月 ,CDA 數據分析師二級持證人,2年數據產品工作經驗,管理學博士在讀。 學習入口:https://edu.cda.cn/g ...
2025-05-12CDA持證人簡介: 楊貞璽 ,CDA一級持證人,鄭州大學情報學碩士研究生,某上市公司數據分析師。 學習入口:https://edu.cda.cn/g ...
2025-05-09CDA持證人簡介 程靖 CDA會員大咖,暢銷書《小白學產品》作者,13年頂級互聯網公司產品經理相關經驗,曾在百度、美團、阿里等 ...
2025-05-07相信很多做數據分析的小伙伴,都接到過一些高階的數據分析需求,實現的過程需要用到一些數據獲取,數據清洗轉換,建模方法等,這 ...
2025-05-06以下的文章內容來源于劉靜老師的專欄,如果您想閱讀專欄《10大業務分析模型突破業務瓶頸》,點擊下方鏈接 https://edu.cda.cn/g ...
2025-04-30CDA持證人簡介: 邱立峰 CDA 數據分析師二級持證人,數字化轉型專家,數據治理專家,高級數據分析師,擁有豐富的行業經驗。 ...
2025-04-29CDA持證人簡介: 程靖 CDA會員大咖,暢銷書《小白學產品》作者,13年頂級互聯網公司產品經理相關經驗,曾在百度,美團,阿里等 ...
2025-04-28CDA持證人簡介: 居瑜 ,CDA一級持證人國企財務經理,13年財務管理運營經驗,在數據分析就業和實踐經驗方面有著豐富的積累和經 ...
2025-04-27數據分析在當今信息時代發揮著重要作用。單因素方差分析(One-Way ANOVA)是一種關鍵的統計方法,用于比較三個或更多獨立樣本組 ...
2025-04-25CDA持證人簡介: 居瑜 ,CDA一級持證人國企財務經理,13年財務管理運營經驗,在數據分析就業和實踐經驗方面有著豐富的積累和經 ...
2025-04-25