簡單線性回歸
線性回歸筆記
機器學習最主要的任務是分類,怎麼把一些無序的數據轉換成有用的信息。機器學習主要有以下步驟:
什麼是特徵,什麼是標籤?
特徵:反映事件或對象在某方面的表現或性質,比如,橘子的大小,顏色,紋理等,物理屬性。
標籤:通過給出的特徵,得出的結果,比如對一個橘子標記為甜,或不甜,這個甜與不甜就是一個標籤。
下面介紹及其學習中的三種相關性關係:
簡單線性回歸演算法,是一種機器學習中研究不同變數之間相關關係的演算法。該演算法的大體步驟如下:
- 往往大量從大量的數據中並不能給人以直觀的感覺,可以利用matplotlib 對數據進行可視化操;利用python中的corr()函數求出一個相關係數矩陣,該矩陣表示每個變數之間的相關性。
import matplotlib.pyplot as plt#畫散點圖方法1%matplotlib inlinefig=plt.figure()ax=fig.add_subplot(1,1,1)ax.scatter(examdf.loc[:,"學習時間"],examdf.loc[:,"分數"],color="r",label="exam data")plt.xlabel("Hours")plt.ylabel("Score")Text(0,0.5,Score)
方法2
-- coding: utf-8 --
%matplotlib inline
plt.title("關係")
plt.title("relationship of time tostudy and score")
examX=examdf.loc[:,"學習時間"]#表示特徵examY=examdf.loc[:,"分數"]#表示標籤plt.scatter(examX,examY,color="b",label="exam data")plt.xlabel("Hours")plt.ylabel("Score")
plt.show()examdf.corr()#相關係數矩陣,可以求出任意兩個變數的相關係數
學習時間 分數
學習時間 1.000000 0.921538xiamian 分數 0.921538 1.000000
#先在對就這些數據對之進行線性擬合
#擬合個需要訓練數據和測試數據,測試數據可能是用來驗證模型的正確性把下面構建訓練數據和測試數據,利用sklearn機器學習包來導入from sklearn.cross_validation import train_test_split#利用train_test_split來抽取訓練數據和測試數據
train_size是訓練數據在總樣本的佔比,可以根據自己定義的值來抽取相應比列係數的訓練樣本,train_size一般在2/3~4/5之間訓練數據,測試數據:對構造的模型或設計的演算法,往往需要測試它的泛化能力來選擇哪個演算法或模型更好,這時候就需要測試集來測試學習器對新樣本的判別能力。測試數據盡量要與訓練集互斥,好比考試是老師如果把平時上課經常講的課後習題做為考試題來評判學生對知識掌握程度一樣,這是不可靠度。
X_train, X_test,Y_train,Y_test=train_test_split(exam_X,exam_Y,train_size=0.8)print("原始數據特徵",exam_X.shape, "訓練數據特徵",X_train.shape, "測試數據特徵",X_test.shape, "原始數據便簽",exam_Y.shape, "訓練數據標籤",Y_train.shape,"測試數據便簽",Y_test.shape)
原始數據特徵 (20,) 訓練數據特徵 (16,) 測試數據特徵 (4,) 原始數據便簽 (20,) 訓練數據標籤 (16,) 測試數據便簽 (4,)#根據訓練數據建立擬合曲線#首先利用sklearn導入線性擬合的包from sklearn.linear_model import LinearRegression#建立擬合模型model=LinearRegression()#從上面觀察,只有一個特徵,不是二維數據,sklearn要求特徵數據是二維數組的形式,所以利用reshape函數對之進行重塑X_train=X_train.values.reshape(-1,1)X_test=X_test.values.reshape(-1,1)#訓練模型model.fit(X_train,Y_train)LinearRegression(copy_X=True, fit_intercept=True, n_jobs=1, normalize=False)#求回歸係數,和截距a=model.intercept_b=model.coef_print("最佳擬合曲線 截距=",a,"回歸係數=",b)最佳擬合曲線 截距= 11.9224056356 回歸係數= [ 15.34854379]import matplotlib.pyplot as plt#訓練數據散點圖plt.scatter(X_train,Y_train,color="blue",label="train data")#訓練數據預測值Y_train_pred=model.predict(X_train)#繪製最佳擬合曲線plt.plot(X_train,Y_train_pred,color="black",linewidth_=3,label="best line")#添加圖標plt.legend(loc=0)plt.xlabel("Hours")plt.ylabel("score")#畫圖plt.show()
dict={"平均一周鍛煉時間":[1,2,0.5,7,10,3,4,2,1,6],"年看病次數":[10,12,15,5,2,7,10,20,22,5]}order_dict=OrderedDict(dict)go_Hdf=pd.DataFrame(order_dict)go_Hdf.head(10)
#觀看數據是看不出二者的有何關係,可以通過圖形來直觀感受import matplotlib.pyplot as pltimport pandas as pd#畫散點圖方法一go_X=go_Hdf.loc[:,"平均一周鍛煉時間"]go_Y=go_Hdf.loc[:,"年看病次數"]plt.scatter(go_X,go_Y,color="b",label="go data")plt.xlabel("Time")plt.ylabel("frequency")plt.show()
go_Hdf.corr() 平均一周鍛煉時間 年看病次數 平均一周鍛煉時間 1.000000 -0.785845 年看病次數 -0.785845 1.000000 #畫散點圖方法二,利用面向對象#1首先建立一個空白畫板%matplotlib inlinefig=plt.figure()#其次在畫板上添加坐標圖ax=fig.add_subplot(1,1,1)#在坐標抽上畫散點圖ax.scatter(go_X,go_Y,color="r",label="data")plt.legend(loc=0)plt.xlabel("Time")plt.ylabel("frequency")plt.show()
#找訓練數據和測試數據
from sklearn.cross_validation import train_test_splittrain_test_split是交叉驗證中常用的函數,功能是從樣本中隨機的按比例選取訓練數據(train)和測試數據(test)第一個參數:所要劃分的樣本特徵第2個參數:所要劃分的樣本標籤train_size:訓練數據佔比,如果是整數的話就是樣本的數量X_train , X_test , Y_train , Y_test =train_test_split(go_X,go_Y,train_size=0.4)print("原始數據特徵",go_X.shape, "訓練數據特徵",X_train.shape, "測試數據特徵",Y_test.shape)print("原始數據標籤",go_Y.shape, "訓練數據標籤",Y_train.shape, "測試數據標籤",Y_test.shape)原始數據特徵 (10,) 訓練數據特徵 (4,) 測試數據特徵 (6,)原始數據標籤 (10,) 訓練數據標籤 (4,) 測試數據標籤 (6,)#製作散點圖plt.scatter(X_train,Y_train,color="b",label="train data")#label表示類名plt.scatter(X_test,Y_test,color="r",label="test data")plt.legend(loc=1)#loc=0,表示找到最合適的位置,=1,表示右上角,2表示左上角plt.xlabel("Hours")plt.ylabel("score")plt.show()
訓練模型
#1從scikit-learn(sklearn)中導入線性回歸函數from sklearn.linear_model import LinearRegression#第2步,創建模型,線性回歸model=LinearRegression()#3訓練模型ntainedValueError: Expected 2D array, got 1D array instead:array=[ 7. 2. 0.5 2. ].Reshape your data either using array.reshape(-1, 1) if your data has a single feature or array.reshape(1, -1) if it contains a single sample.import numpy as nparr=np.array([[1,2,3,4,],[5,6,7,8]])arrarr.reshape(4,2)arr2=arr.reshape(-1,1)#arr2.shapearr.reshape(2,-1)X_train.index#導入線性回歸模型from sklearn.linear_model import LinearRegression#創建回歸模型model=LinearRegression()#訓練模型#1首先將訓練數據轉化成二維數據形式#X_train是一個類似於Series的形式,有索引,有valuesX_train=X_train.values.reshape(-1,1)#我們是要對特徵進行測試#同樣測試數據特徵也是一樣,要轉化為二維數組X_test=X_test.values.reshape(-1,1)#訓練模型model.fit(X_train,Y_train)
上述代碼出現報錯,是因為機器學習對特徵的要求是二維形式,我們得出的X_train是一維數組的形式,所以利用reshape函數對特徵數據進行重塑,包括測試數據特徵也要進行重塑。
繪製最佳擬合線y=ax+b
#利用model模型來求擬合的斜率(回歸係數),intercept(截距)b=model.intercept_a=model.coef_print("最佳擬合曲線 擬合截距=",b,"回歸係數=",a)最佳擬合曲線 擬合截距= 18.1111111111 回歸係數= [-1.77777778]#求Y_train的預測值Y_train_pred=model.predict(X_train)plt.scatter(X_train,Y_train,color="blue",label="train data")plt.plot(X_train,Y_train_pred,color="black",linewidth=3,label="best line")plt.legend(loc=0)plt.xlabel("excersive Hours")plt.ylabel("Times of sick")plt.show()
確定,利用最小二乘法,波動比決定係數R^2model.score(X_test,Y_test)# 最佳擬合線表示到該直線上的點到每個點距離最短的直線#已經把擬合曲線放下了 model中#決定係數R^2大於0.5,所以二者還是有線性相關性,且呈現負線性相關性0.51800268234808611plt.scatter(X_train,Y_train,color="blue",label="train data")plt.scatter(X_test,Y_test,color="red",label="test data")plt.plot(X_train,Y_train_pred,color="black",linewidth_=2,label="best line")plt.legend(loc=0)plt.xlabel("excesive Hours")plt.ylabel("Times of sick")plt.show()
如何評價線性回歸演算法的準確度?
所以可以利用決定係數R平方來評價模型的準確性,決定係數R平方越大,簡單線性回歸演算法模型建立越準確
推薦閱讀:
※Python 中列表和元組有哪些區別?
※使用Python抓取婚戀網用戶數據並用決策樹生成自己擇偶觀
※三峽發電量估算系統在葛洲壩中的應用可行性分析
※強烈推薦 | 數據分析師的必讀書單
※如何看待將Python代碼轉換成Go代碼並進一步編譯的 Grumpy 項目?