Scikit-learn筆記02_監督式學習(迴歸及分類)_線性迴歸(Linear Regression)
監督式學習(Supervised Learning)
特點:
- 屬於機器學習算法中較常用的、也是較為成功的模式。
- 監督式學習的核心概念(輸入 → 輸出)非常直觀,容易理解和實施。
- 常應用於分類、迴歸問題分析以及時間序列預測等情境。
- 具有較高的可解釋性,便於商業應用中說明模型的預測邏輯。
- 可量化的評估,透過標準化的指標(如準確率、均方誤差)進行量化評估和優化。
- 模型建構於輸入跟輸出配對之訓練資料,對尚未見過的資料做預測。
限制及困難:
- 標籤數據的獲取可能耗時且昂貴。依賴於帶標籤的數據集(每個輸入樣本都有相應的目標輸出),使得模型可以清楚地學到輸入與輸出的映射關係。
- 無法處理未見過的類別或樣本
- 訓練資料通常要耗時人工建立。
常見監督式學習演算法:
線性模型/線性迴歸 (Lineaer Models)
決策樹(Decision Trees)、隨機森林(Random Forests)
最近鄰居法(K-Nearest Neighbors)
支持向量機(SVM)
類神經網路(Neural Networks)
監督式學習任務
1.分類(Classification):
在已定義的離散標籤中預測資料屬於何種標籤(類比數值)
- 僅兩種標籤的問題又俗稱二元分類,yes/no。比方:信件是否屬於垃圾郵件?
- 多種標籤問題則稱為多元(類別)分類,比方某筆鳶尾花資料屬於何種品種?
2.迴歸(Regression):預測連續數值(浮點數、實數) =>預測的是數據
比方:房價趨勢預測、農產收成量預測
線性迴歸(Linear Regression)
- 屬於常見統計方法,也是機器學習起初接觸時優先探討的問題。
- 目的在於藉由過去資料找出已經存在的關係,並且利用X來預測Y可能的結果。
- 線性迴歸模型指的是X(自變數)跟Y(應變數)之線性關係。
- 依照自變數多寡可分成簡單線性迴歸和多(複)元迴歸。
- 迴歸分析又依照函數型態,細分為線性、非線性。
- 模型中每一項的權重系數都為這一項對應的特征的重要性提供了直觀的解釋:某一項權重系數的絕對值越大,對應的屬性的影響就越大。
- 為了不讓問題變得覆雜,不要輕易嘗試非線性模型。
輸出與輸入參數成線性關系的這一假設可以表示為:
多(複)元迴歸 -> 像鳶尾花有四個變數維度(花瓣長寬2個自變數、花萼長寬2個自變數),就屬於此類迴歸。
簡單線性迴歸
->像是單價、銷數量關係
- X數據愈大Y也愈大就稱為正相關。
- X數據愈小Y則愈小就稱為負相關。
(簡單)線性迴歸模型: y = ax + b,a跟b稱作迴歸係數(regression coefficients)。
為了找出迴歸係數,常用方法為最小平方法(Ordinary Least Squares,OLS),找出跟各點殘差(Residual)最小的公式。
尋找一個權重向量w,使得線性函數盡可能逼近實驗數據。
可以通過尋找使平方誤差和最小的w* 來達到(最小二乘逼近,least squares approximation)
sklearn本身提供一種api : make_regression
常使用到的就是這幾種參數
n_samples
n_features
n_targets
noise
from sklearn import datasets import matplotlib.pyplot as plt X,y = datasets.make_regression(n_samples=200, n_features=1, n_targets=1, noise=7) plt.scatter(X, y) plt.show()
也可透過數學式方式來產生迴歸線段資料
測試程式,如下是斜率3,截距-5的直線方程式。
輸出是一張散點圖,其中 x 是隨機生成的數據點。
而 y 是通過線性關係 y = 3*x - 5 加上隨機噪聲後的結果。
from sklearn import datasets import numpy as np import matplotlib.pyplot as plt rng = np.random.RandomState(2) x = 10 * rng.rand(50) print(x) y=3*x-5+rng.randn(50) print(y) plt.scatter(x, y) plt.show()
10 * rng.rand(50):
將隨機數擴展到 [0, 10) 的範圍,作為自變數 x。
rng.randn(50):
生成 50 個服從標準正態分佈的隨機數(平均值為 0,標準差為 1),用於引入噪聲。
y = 3*x - 5 + rng.randn(50):
將線性函數的值加上噪聲,生成帶有隨機誤差的應變數 y。
plt.scatter(x, y):
繪製自變數 x 和應變數 y 的散點圖。
多元線性迴歸_腰圍身高來預測體重
import numpy as np import pandas as pd from sklearn.linear_model import LinearRegression #多元線性迴歸->自變數:腰圍,身高 waist_heights = np.array([[67,160],[68,165],[70,167],[65,170],[80,165],[85,167],[78,178],[79,182],[95,175],[89,172]]) #使用腰圍跟身高預測體重是多少, weights = np.array([50,60,65,65,70,75,80,85,90,81]) #建立一個二維Numpy陣列,y是單獨一個體重欄位。 X = pd.DataFrame(waist_heights,columns=["Waist","Height"]) y = pd.DataFrame(weights,columns=["Weight"]) #建立模型 lm = LinearRegression() lm.fit(X,y) print("迴歸係數",lm.coef_) print("截距",lm.intercept_) #預測兩組腰圍跟身高各自為[66,164],[82,172]分別體重為多少 new_waist_heights = pd.DataFrame(np.array([[66,164],[82,172]])) predicted_weights = lm.predict(new_waist_heights) print(predicted_weights)
import numpy as np import pandas as pd from sklearn.linear_model import LinearRegression #打算要在某火車站附近準備再新開設一間新飲料店分店,已有現存各分店的面積(坪數)、 #離火車站距離(公尺)跟分店單月營業額(幾萬元) #面積10坪離火車站距離80公尺,9坪離車站30公尺..... area_dists = np.array([[10,80],[9,30],[8,200],[5,200],[7,300],[8,230],[7,50],[9,20],[6,330],[9,180]]) revenues = np.array([46,36,37,20,24,29,36,43,20,36]) #任務1.假設又有兩間新店面要開設,各自坪數10坪且距離車站100公尺,跟坪數15坪且距離車站80公尺,預測各自月營業額會多少。 #建立一個二維Numpy陣列X,y是單獨一個月營業額。 X = pd.DataFrame(area_dists,columns=["Area","Dist"]) y = pd.DataFrame(revenues,columns=["Revenue"]) lm = LinearRegression() lm.fit(X,y) print("迴歸係數",lm.coef_) print("截距",lm.intercept_) new_area_dists = pd.DataFrame(np.array([[10,100],[15,80]])) predicted_revenues = lm.predict(new_area_dists) print(predicted_revenues)
多元線性迴歸_飲料店分店開設(透過坪數、單月平均營收)預測距離
import numpy as np import pandas as pd from sklearn.linear_model import LinearRegression #已知面積坪數、月營收 #[10,46],[8,36],[8,37],[5,20],[7,24],[8,29],[7,36],[9,43],[6,20],[9,36] #任務2.最近有兩間新分店加盟,集團要配送原物料要估算離車站距離是多少。 #各自坪數8坪且月營業額40萬,跟坪數6坪且月營業額22萬,預期各自離車站距離為多少。 area_revenues = np.array([[10,46],[8,36],[8,37],[5,20],[7,24],[8,29],[7,36],[9,43],[6,20],[9,36]]) dists = np.array([80,30,200,200,300,230,50,20,330,180]) X1 = pd.DataFrame(area_revenues,columns=["Area","Revenue"]) y1 = pd.DataFrame(dists,columns=["Dist"]) lm1 = LinearRegression() lm1.fit(X1,y1) print("迴歸係數",lm1.coef_) print("截距",lm1.intercept_) new_area_revenues = pd.DataFrame(np.array([[8,40],[6,22]])) predicted_dists = lm1.predict(new_area_revenues) print(predicted_dists)
Ref:
留言
張貼留言