機器學習之多變數線性回歸(五)框架整合

2021-09-25 04:14:05 字數 3881 閱讀 4808

機器學習,就是讓機器通過在大量資料中進行學習,獲得乙個**相同資料的能力,主要作用是用來對新資料的**。

線性回歸是機器學習中最經典的演算法之一,通過優化每個特徵的權重值,獲得最好的訓練模型,用來**後續資料的結果。

線性回歸屬於機器學習中的有監督學習,意思就是說每個已知的真實樣本,都擁有確定的結果,**的結果是連續性的一組值。

在讓機器學習之前,對要餵給機器的資料進行處理,是很重要的一環。資料的好壞,很大程度上決定了模型能夠訓練到什麼程度。

對資料的處理,一般包括將資料讀取到編輯器中;提取有效資料;對資料特徵進行縮放;對資料進行初始化。參考**如下:

# 首先要匯入一系列庫,包括用於矩陣計算的科學計算包-numpy

# 以及在後續資料展示時要用到的畫圖工具matplotlib

import numpy as np

from matplotlib import pyplot as plt

# 讀取資料

data_train = np.loadtxt(r'ccpp_train.txt',delimiter=',') # 利用科學計算工具進行資料讀取,讀取txt資料

data_test = np.loadtxt(r'ccpp_test.txt',delimiter=',')

# 定義資料預處理函式

def preprocess(data):

# 資料提取

x = data[:,:-1]

y = data[:,-1]

# 特徵縮放

x -= np.mean(x,axis=0)

x /= np.std(x,axis=0,ddof=1) # 這裡使用的特徵縮放中的經典縮放方法-標準化 就是資料減去資料的平均值再除以資料的標準差

# 資料初始化

x = np.c_[np.ones(len(x)),x] # 對資料拼接一列1,有利於後續資料計算的進行

y = np.c_[y] # 行轉列

return x,y

# 呼叫資料處理函式 獲得處理好的資料

x_train,y_train = preprocess(data_train)

x_test,y_test = preprocess(data_test)

線性回歸演算法的模型是固定的,其實就是一條直線y=kx+b,用**矩陣表達就是h=dot(x,theta)

**如下:

# 定義模型函式

def model(x,theta):

h = np.dot(x,theta)

return h

代價函式用來評價乙個模型的效能,這裡採用的是誤差均方和,值是**值和真實值之間差距的平方

,採用平方是為了消除減法得到的正負值相互抵消,帶價值越大,表示**值和真實值之間差距越大,代表了模型就越差,我們需要尋找的就是帶價值最小的那個模型,可以**的最好。

**如下:

# 定義代價函式

def costfunction(h,y):

m = len(h)

j = (1.0/(2*m))*np.sum(np.square(h-y)) # 均方誤差和的**表達

return j

梯度下降方法,是更新theta引數的最重要的一步,因為我們所使用的模型是h=x*theta,x是常量,模型的變化通過theta的變化決定。

梯度下降就是讓當前模型的代價函式值變小,帶價值越小,模型越好。使帶價值變小的最快的方向就是其導數的方向,就是當前一點的斜率的方向,沿著斜率的方向下降,速度最快。

所以我們決定對代價函式進行求導,獲得乙個下降的值。

deltatheta = (1/m)*np.dot(x.t,h-y)
然後對theta進行更新,

theta -= deltheta
再次將更新後的theta和資料傳入模型中,獲得**值,把**值傳入代價函式,進行效能評價,直到找到最好的那一組theta,就找到了最好的模型

**如下:

# 定義梯度下降函式

def gradedesc(x,y,alpha=0.01,iter_num=2000):

# 獲取資料維度

m,n = x.shape

# 初始化代價值

j_history = np.zeros(iter_num)

# 初始化theta

theta = np.zeros((n,1))

# 執行梯度下降

for i in range(iter_num):

h = model(x,theta)

j_history[i] = costfunction(h,y)

# 4.要求輸出迭代過程中的代價函式值(10分)

print(j_history[i])

# 求取deltatheta

deltatheta = (1.0/m)*np.dot(x.t,h-y)

# 更新theta

theta -= alpha * deltatheta

return j_history,theta

經過多次迭代,獲得了最好的模型,最好的模型的評價標準是:達到期望的代價值或者達到一定的迭代次數,或者達到期望的精度。

精度表達的是,一組**值和實際值的相似程度。

**如下:

# 呼叫梯度下降函式獲取訓練好的theta

j_history,theta = gradedesc(x_train,y_train,alpha=0.01,iter_num=2000)

# 呼叫模型,獲取**的y值

y_test_h = model(x_test,theta)

# 5.完成測試集的資料**,並計算在測試集上的代價函式值(15分)

j_test = costfunction(y_test_h,y_test)

print('測試集上的代價函式值')

print(j_test)

# 求取精度

def score(h,y):

u = np.sum(np.square(h-y))

v = np.sum(np.square(y-np.mean(y)))

return 1 - u/v

# 呼叫精度函式求取精度

s = score(y_test_h,y_test)

print('精度是:')

print(s)

這裡主要的是畫圖展示的工作,比如說可以畫出代價函式的變化曲線,也可以畫出真實值和**值的對比圖。通過影象的方式,更直觀的看出模型的擬合程度如何。

**如下:

# 畫代價函式曲線

plt.title('代價函式曲線')

plt.plot(j_history)

plt.show()

# 6.以橫軸為真實值,縱軸為**值,畫出散點圖(25分)

plt.title('真實值與**值對比圖')

plt.scatter(y_test,y_test,label='真實值')

plt.scatter(y_test,y_test_h,label='**值')

plt.show()

通過上述六個步驟,可以完成線性回歸演算法的機器學習,當框架寫好以後,可以通過代價函式的曲線圖看出模型是否收斂,並且可以通過調整學習率alpha和迭代次數iter_num來使模型更好的收斂。

機器學習 多變數線性回歸

注 本系列部落格是博主學習stanford大學 andrew ng 教授的 機器學習 課程筆記。博主深感學過課程後,不進行總結非常easy遺忘,依據課程加上自己對不明確問題的補充遂有此系列部落格。本系列部落格包含線性回歸 邏輯回歸 神經網路 機器學習的應用和系統設計 支援向量機 聚類 將維 異常檢測...

機器學習 多變數線性回歸

1 說明 需要 房屋的 除了房屋面積還有其他的特徵量,比如層數,年齡,臥室數目等等,如下圖。因為有多個特徵值,所以稱為多變數線性回歸。2 假設函式 單變數只有乙個特徵值,所以之前的假設函式將不再適用,下面是多變數的假設函式。其中x0設定為1 3 特徵縮放 在所有特徵值中,size的範圍大概在0 20...

機器學習(三) 多變數線性回歸

目錄 一 前言 二 模型描述 1.hypothesis 2.cost function 三 多元梯度下降法 1.特徵放縮 2.學習率 的選擇 四 特徵與多項式回歸 五 正規方程 區別於梯度下降法 六 梯度下降法與正規方程法的比較 在所有公式中,n為特徵個數,m為樣本數量 與前面單變數線性回歸類似,只...