close

Python很吃版本,我使用的版本如下:

Python 3.10

sklearn 1.2.1

以下介紹使用scikit-learn使用線性回歸(linear regression)進行訓練與預測的方式,總共分成四大步驟:

  1. 建立資料
  2. 進行訓練
  3. 進行驗證
  4. 進行預測

最後提供完整程式碼

線性回歸就是在一堆資料中,找出一條可以代表這些資料的線,可以找出自變數(x)與應變數(y)的關係,sklearn有給套件了,所以我們就使用sklearn就好。

 

步驟一: 建立資料

#我們透過numpyrandomstate產生10筆二維的座標,給定x的情況下, 預測y的值
import numpy as np
#隨機數產生器, 可經過rand函數產生對應的隨機數個數, 其值介於[0,1]之間, 用法同 np.random.seed()
randomNummberGenerator = np.random.RandomState(1);
#先產生10筆資料
x=10*randomNummberGenerator.rand(10);
print("transform before x: ",x)

 

隨機產生的10筆結果如下:

1.png

 

Sklearn 只能輸入2D的矩陣,所以我們需要將資料轉換成sklearn可以接受的型式,它只吃

[[1]

[2]

[3]]

這類的格式,所以資料要改成(3x1)

# sklearn訓練的資料都需要是二維, 所以這邊透過numpy進行型態轉換, -1是特殊用法, 原始資料必須是矩陣或是數組, -1會依資料自動計算列數
# for example, np.arrange(16).reshape(2,8): 自然生成16個數並且用2x8矩陣擺置(row x column)
x=np.array(x).reshape(-1,1);
print("transform after x: ",x)

 

-1就是會依資料數自動產生相對應的維度,結果如下:

1.png

 

我們也建立y的座標,我們直接給定公式,讓xy的關係直接建立,這代表使用線性回歸y=ax+b算出來的ab會跟我們給定的一模一樣,a是斜率,b是截距

y=2*x-1;
y=np.array(y).reshape(-
1,1);
print("y reshpe: ",y)
#我們把圖畫出來看看長什麼樣子
import matplotlib.pyplot as plt
plt.scatter(x,y);
#畫散布圖
plt.show(); #呈現出來

1.png

2.png

最後linear regression跑出來的線要通通串穿這些節點

 

步驟二: 進行訓練

#使用linear regression訓練出符合這些資料的線
from sklearn.linear_model import LinearRegression
#fit_intercept: 預設為True,表示有將y軸的截距加入 ,並自動計算出最佳的截距值 ,如果為False,迴歸模型線會直接通過原點
#n_jobs : 計算模型所使使用的CPU數量,預設為1,如果傳入-1,就會使用全部的CPU
model = LinearRegression(fit_intercept=True,n_jobs=-1);
model.fit(x,y);


#看一下斜率跟截距是不是跟我們設定的一樣
w_0 = model.intercept_ #截距
w_1 = model.coef_ #斜率

print('Interception : ', w_0)
print('Coefficient : ', w_1)

 

斜率與截距如下:

1.png

回顧一下我們產生y資料的公式y=2x-1,所以跟我們一開始設定的一模一樣

 

步驟三:進行驗證與進行預測

#產生驗證資料, 這邊使用numpylinspace函式,意思是產生1~5之間的3個點
testX = np.linspace(1,5,3);
testX = np.array(testX).reshape(-
1,1);
print("testX: ",testX);

predictedY = model.predict(testX);

print("預測的Y: ",predictedY);

 

驗證資料與預測結果如下:

1.png

 

由於我們直接使用y=2x-1的公式來產生預測值,所以這邊驗證也很簡單,把[1,3,5]帶入y=2x-1x,看看產出的y是不是就是[1,5,9],驗證起來答案一模一樣。

 

以上就是線性回歸的步驟,完整程式碼如下:

#=== 建立資料 ===
#
我們透過numpyrandomstate產生10筆二維的座標,給定x的情況下, 預測y的值

import numpy as np
randomNummberGenerator = np.random.RandomState(
1);
#先產生10筆資料
x=10*randomNummberGenerator.rand(10);
x=np.array(x).reshape(-
1,1);
y=
2*x-1;
y=np.array(y).reshape(-
1,1);

#===訓練===
from sklearn.linear_model import LinearRegression
model = LinearRegression(
fit_intercept=True,n_jobs=-1);
model.fit(x,y);


#===預測===
#
產生驗證資料, 產生1~5之間3個點

testX = np.linspace(1,5,3);
testX = np.array(testX).reshape(-
1,1);

predictedY = model.predict(testX);

print("預測的Y: ",predictedY);

再請各位看官試試看,如果有任何問題歡迎留言交流。

arrow
arrow
    全站熱搜

    葛瑞斯肯 發表在 痞客邦 留言(0) 人氣()