python+sklearn,機器學習-線性迴歸實現-以披薩尺寸預測價格

實例:

在這裏插入圖片描述

思路:

簡單而直觀的方式是通過數據的可視化直接觀察成交價格與尺寸間是否存在線性關係。

對於本實驗的數據來說,散點圖就可以很好的將其在二維平面中進行可視化表示。

代碼

# **用matplotlib畫出圖形**
import matplotlib.pyplot as plt
%matplotlib inline
from matplotlib.font_manager import FontProperties
font = FontProperties(r"c:\windows\fonts\msyh.ttc", size=10)

in

def runplt(size = None):
    plt.figure(figsize= size)

    plt.axis([0, 25, 0, 25])
    plt.grid(True)
    return plt
plt = runplt()
x = [[6], [8], [10], [14], [18]] # 直徑
y = [[7], [9], [13], [17.5], [18]] # 價格

plt.plot(x, y, 'k.') 
plt.show()

out
能夠看出,匹薩價格與其直徑正相關,這與我們的 日常經驗也比較吻合,自然是越大越貴
能夠看出,匹薩價格與其直徑正相關,這與我們的 日常經驗也比較吻合,自然是越大越貴
in:

# **用scikit-learn來構建模型。**
from sklearn import linear_model
import numpy as np
# sklearn中的訓練數據要求二維
# 列表不能轉化爲二維數組
x_train = np.array([6, 8, 10, 14, 18]).reshape(-1, 1)
y_ = np.array([7, 9, 13, 17.5, 18]).reshape(-1, 1)
# x_train = x_train.reshape(-1, 1)

model = linear_model.LinearRegression()
model.fit(x_train, y_)
display(model.intercept_) #截距
display(model.coef_) # 線性模型係數
a_ = np.array([12]).reshape(-1, 1)
a = model.predict(a_)

print("預測一張12英寸的披薩:{:.2f}".format(a[0][0]))

out

array([1.96551724])
array([[0.9762931]])
預測一張12英寸的披薩:13.68
# **畫出匹薩直徑與價格的線性關係。**
plt = runplt()
plt.plot(x, y, 'k.') # 'k.'黑色
X2 = [[0], [10], [14], [25]]
y2 = model.predict(X2)
# print(y2)
plt.plot(X2, y2, 'g-') # 'g_' 綠色
# x.y的點不能連成線,畫出的是散點圖
# x2,y2的點可以連城線,畫出的是直線圖

#  **模型評估**
# 李航老師的統計學習方法中:將訓練誤差稱爲近似誤差,將預測誤差稱爲估計誤差 
# 殘差預測值
yr = model.predict(x_train)
#  enumerate 函數可以把一個 list 變成索引-元素對
for idx, x in enumerate(x_train):
    plt.plot([x, x], [y[idx], yr[idx]], 'r_') # 'r_'紅色

plt.show()

在這裏插入圖片描述
對模型的擬合度進行評估的函數稱爲殘差平方和(residual sum of squares)
通過殘差之和最小化實現最佳擬合

print('殘差平方和:{:.2f}'.format(np.mean((model.predict(x_train)-y)** 2)))

out

殘差平方和:1.75

調用sklearn.linear_model.LinearRegression()所需參數:

fit_intercept : 布爾型參數,表示是否計算該模型截距。可選參數。
normalize : 布爾型參數,若爲True,則X在迴歸前進行歸一化。可選參數。默認值爲False。
copy_X : 布爾型參數,若爲True,則X將被複制;否則將被覆蓋。 可選參數。默認值爲True。
n_jobs : 整型參數,表示用於計算的作業數量;若爲-1,則用所有的CPU。可選參數。默認值爲1。 線性迴歸fit函數用於擬合輸入輸出數據,調用形式爲model.fit(X,y, sample_weight=None): • X : X爲訓練向量; • y : y爲相對於X的目標向量; • sample_weight : 分配給各個樣本的權重數組,一般不需要使用,可省略。 注意:X,y 以及model.fit()返回的值都是2-D數組,如:a= [[0]]
一元線性迴歸假設解釋變量和響應變量之間存在線性關係;這個線性模型所構成的空間是一個超平面(hyperplane)。超平面是n維歐氏空間中餘維度等於一的線性子空間,如平面中的直線、空間中的 平面等,總比包含它的空間少一維。在一元線性迴歸中,一個維度是響應變量,另一個維度是解釋變量,總共兩維。因此,其超平面只有一維,就是一條線。

上述代碼中sklearn.linear_model.LinearRegression類是一個估計器(estimator)。估計 器依據觀測值來預測結果。在scikit-learn裏面,所有的估計器都帶有fit()和predict()方 法。fit()用來分析模型參數,predict()是通過fit()算出的模型參數構成的模型,對解釋變量 進行預測獲得的值。因爲所有的估計器都有這兩種方法,所有scikit-learn很容易實驗不同的模型。 截距α和係數β 是線性迴歸模型最關心的事情。

參考

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章