作者????♂?:讓機(jī)器理解語言か
?
專欄??:機(jī)器學(xué)習(xí)sklearn
描述??:本專欄主要分享博主學(xué)習(xí)機(jī)器學(xué)習(xí)的筆記和一些心得體會。
寄語??:??沒有白走的路,每一步都算數(shù)!???
0、介紹??
????????監(jiān)督學(xué)習(xí)(英語:Supervised learning)是機(jī)器學(xué)習(xí)中最為常見、應(yīng)用最為廣泛的分支之一。本次實(shí)驗(yàn)將帶你了解監(jiān)督學(xué)習(xí)中較為基礎(chǔ)的線性模型,并學(xué)會使用 scikit-learn 來構(gòu)建預(yù)測模型,用于解決實(shí)際問題。
知識點(diǎn)
- 線性回歸模型
- 感知機(jī)分類模型
1、線性回歸模型
?
????????scikit-learn 中包含的線性模型有最小二乘回歸、感知機(jī)、邏輯回歸、嶺回歸,貝葉斯回歸等,由?sklearn.linear_model
?模塊導(dǎo)入。對于線性模型而言,即通過擬合線性函數(shù)(下式)去完成樣本分類或回歸預(yù)測。
?
其中,最小二乘回歸、嶺回歸、貝葉斯回歸等是用于解決回歸問題。而感知機(jī)、邏輯回歸被用于解決分類問題。
這里,我們從比較基礎(chǔ)的??最小二乘法?回歸說起。最小二乘法是線性回歸中最經(jīng)典的方法之一,最小二乘的取名即來自于其選擇了平方損失函數(shù)。在 scikit-learn 中,最小二乘法的實(shí)現(xiàn)方法如下:
名稱 | 方法 |
---|---|
最小二乘回歸 | sklearn.linear_model.LinearRegression( ) |
使用 scikit-learn 去解決一個機(jī)器學(xué)習(xí)相關(guān)的問題時,我們的代碼都大同小異,主要是由三步走組成:
- 調(diào)用一個機(jī)器學(xué)習(xí)方法構(gòu)建相應(yīng)的模型?
model
,并設(shè)置模型參數(shù)。- 使用該機(jī)器學(xué)習(xí)模型提供的?
model.fit()
?方法訓(xùn)練模型。- 使用該機(jī)器學(xué)習(xí)模型提供的?
model.predict()
?方法用于預(yù)測。
????????請注意,上面的 3 個步驟大家多讀幾遍增強(qiáng)印象,后續(xù)我們就可以遵循這 3 步走的套路使用 scikit-learn 完成各類算法的建模了。
????????下面,我們嘗試通過最小二乘回歸去擬合二維平面上的一些點(diǎn)。首先,執(zhí)行上面的第一步,載入方法并構(gòu)建模型。
import warnings
from sklearn.linear_model import LinearRegression
# 忽略代碼警告,僅供教學(xué)方便,自行書寫代碼時警告也很重要,不建議忽略
warnings.filterwarnings('ignore')
model = LinearRegression() # 調(diào)用最小二乘法線性回歸(第 1 步)
model
# 輸出結(jié)果
# LinearRegression(copy_X=True, fit_intercept=True, n_jobs=1, normalize=False)
??model
?模型輸出的參數(shù),即為相應(yīng)算法類的默認(rèn)參數(shù)。當(dāng)然,你可以參考??官方文檔?中的說明來自定義參數(shù)。
接下來,使用模型帶有的?fit()
?方法去擬合 3 個點(diǎn)。三個點(diǎn)的特征向量分別為?[0,0],?[1,1],?[2,2],對應(yīng)的目標(biāo)值為?[1,2,3]。
model.fit([[0, 0], [1, 1], [2, 2]], [1, 2, 3]) # 模型訓(xùn)練(第 2 步)
# 輸出結(jié)果:
# LinearRegression(copy_X=True, fit_intercept=True, n_jobs=None, normalize=False)
當(dāng)然,我們也可以從這一步看到模型返回的參數(shù)。
訓(xùn)練時,選擇的?[0,0],?[1,1],?[2,2]?這三個點(diǎn)恰好在一條直線上,再結(jié)合目標(biāo)值想象一下它們的空間位置關(guān)系。我們可以使用下面的方法,輸出擬合直線?w?項(xiàng)和常數(shù)項(xiàng)值。
model.coef_, model.intercept_
# (array([0.5, 0.5]), 1.0000000000000002)
如上所示,即實(shí)驗(yàn)擬合的函數(shù)應(yīng)該為:
?
當(dāng)我們輸入新的數(shù)值,例如?[3,3]?時,根據(jù)上面的函數(shù),因變量的值為?4。那么,我們使用模型來預(yù)測,看一看結(jié)果是否為?4。
model.predict([[3, 3]]) # 模型預(yù)測(第 3 步)
# array([4.])
結(jié)果的確和我們預(yù)想的一致,也標(biāo)志著我們通過 scikit-learn 完成了一個基礎(chǔ)的線性回歸問題,而建模的過程僅僅需要簡單的 3 步。
上面的例子比較簡單,下面我們導(dǎo)入 scikit-learn 內(nèi)置的?diabetes
?糖尿病數(shù)據(jù)集來訓(xùn)練一個復(fù)雜一點(diǎn)的最小二乘回歸模型。
第一步:導(dǎo)入數(shù)據(jù),并將其劃分為 70% 的訓(xùn)練集和 30% 的測試集。機(jī)器學(xué)習(xí)中,我們習(xí)慣采用這樣的比例來劃分訓(xùn)練集和測試集。其中訓(xùn)練集用來訓(xùn)練模型,而測試集則用來評估模型的質(zhì)量。測試集的數(shù)據(jù)不會出現(xiàn)在訓(xùn)練數(shù)據(jù)中,這也就類似我們使用了新的數(shù)據(jù)對訓(xùn)練好的模型進(jìn)行預(yù)測和評估,以保證模型質(zhì)量真實(shí)可靠。
?
下面,我們會使用到 scikit-learn 提供的數(shù)據(jù)集切分函數(shù)??train_test_split。
from sklearn import datasets # 導(dǎo)入內(nèi)置數(shù)據(jù)集模塊
from sklearn.model_selection import train_test_split # 導(dǎo)入數(shù)據(jù)集切分模塊
import numpy as np # 導(dǎo)入數(shù)值計(jì)算模塊
diabetes = datasets.load_diabetes() # 載入糖尿病數(shù)據(jù)集
diabetes_feature = diabetes.data[:, np.newaxis, 2] # 該數(shù)據(jù)集的特征較多,這里只選取其中一個
diabetes_target = diabetes.target # 設(shè)定目標(biāo)值
# 切分?jǐn)?shù)據(jù)集為 70% 的訓(xùn)練集和 30% 的預(yù)測集
# random_state 隨機(jī)數(shù)種子用于保證每次執(zhí)行結(jié)果一致
train_feature, test_feature, train_target, test_target = train_test_split(
diabetes_feature, diabetes_target, test_size=0.3, random_state=56)
?第二步:載入最小二乘回歸模型,并訓(xùn)練數(shù)據(jù)。這一步想必通過上面的例子已經(jīng)清楚了,注意這里傳入的是訓(xùn)練數(shù)據(jù)。
model = LinearRegression() # 構(gòu)建最小二乘線性回歸模型
model.fit(train_feature, train_target) # 使用訓(xùn)練集數(shù)據(jù)訓(xùn)練模型
# LinearRegression(copy_X=True, fit_intercept=True, n_jobs=None, normalize=False)
第三步:使用測試集進(jìn)行預(yù)測,并將結(jié)果繪圖。
import matplotlib.pyplot as plt # 導(dǎo)入 matplotlib 繪圖模塊
%matplotlib inline
# 繪圖
plt.scatter(train_feature, train_target, color='black') # 繪制訓(xùn)練集散點(diǎn)圖
plt.scatter(test_feature, test_target, color='red') # 繪制測試集散點(diǎn)圖
plt.plot(test_feature, model.predict(test_feature),
color='blue', linewidth=3) # 繪制擬合直線
# 繪制圖例
plt.legend(('Fit line', 'Train Set', 'Test Set'), loc='lower right')
plt.title('LinearRegression Example')
# Text(0.5, 1.0, 'LinearRegression Example')
最后,我們可以通過繪制的圖像,更加直觀地看出采用最小二乘回歸模型進(jìn)行線性擬合的結(jié)果。
?
對于其他常見的線性回歸模型,它們和最小二乘線性回歸模型非常相似,只是采用了不同的損失函數(shù)。
例如,嶺回歸采用了帶 L2 懲罰項(xiàng)的平方和損失函數(shù)。
?
而另一種常見的 Lasso 回歸,同樣采用了帶 L1 懲罰項(xiàng)的平方損失函數(shù)。
?
下面列舉了一些常見的廣義線性回歸模型,及它們在 scikit-learn 中對應(yīng)的方法。
名稱 | 方法 |
---|---|
貝葉斯嶺回歸 | sklearn.linear_model.BayesianRidge() |
Lasso 回歸 | sklearn.linear_model.Lasso() |
嶺回歸 | sklearn.linear_model.Ridge() |
隨機(jī)梯度下降回歸 | sklearn.linear_model.SGDRegressor() |
魯棒回歸 | sklearn.linear_model.HuberRegressor() |
這些方法相對于普通最小二乘回歸模型而言,均增加了一些懲罰項(xiàng)。這樣會提高模型的泛化能力,在實(shí)際應(yīng)用中效果可能會好一些。
2、線性分類模型
????????除了線性回歸,scikit-learn 還提供了一些解決線性分類的方法。其中,感知機(jī)就是非常有代表性的線性分類模型。
? ? ? ? 感知機(jī)?是一個經(jīng)典的二分類方法,由 Rosenblatt 于 1957 年時提出。它是神經(jīng)網(wǎng)絡(luò)和支持向量機(jī)的基礎(chǔ)。感知機(jī)模型非常簡單,輸入為一些特征向量,輸出則由正類和負(fù)類組成。而輸入和輸出之間,則是由符號函數(shù)連接。
?
感知機(jī)的損失函數(shù)是錯誤分類點(diǎn)到分離超平面之間的距離總和,其學(xué)習(xí)策略同樣也是損失函數(shù)最小化。
?
????????在 scikit-learn 中,實(shí)現(xiàn)感知機(jī)通過調(diào)用?sklearn.linear_model.Perceptron()
方法完成。下面,我們通過一個例子來展示感知機(jī)的分類過程。首先,使用 scikit-learn 提供的?make_classification?方法生成一組可被二分類的二維數(shù)組作為數(shù)據(jù)集。
from sklearn.datasets import make_classification # 導(dǎo)入分類數(shù)據(jù)生成模塊
# 隨機(jī)生成一組可以被二分類的數(shù)據(jù)
X, y = make_classification(n_features=2, n_redundant=0,
n_informative=1, n_clusters_per_class=1, random_state=1)
X.shape, y.shape # 查看數(shù)組形狀
# ((100, 2), (100,))
這里,我們可以使用 Matplotlib 將該數(shù)據(jù)集繪制出來。
plt.scatter(X[:, 0], X[:, 1], marker='o', c=y) # 繪制數(shù)據(jù)集散點(diǎn)圖
# <matplotlib.collections.PathCollection at 0x7fffc2c25c10>
?
?????????其中,y?即相當(dāng)于人為給數(shù)據(jù)添加的標(biāo)簽。
????????我們可以看到,數(shù)據(jù)集分為 2 種顏色的樣本點(diǎn),并呈現(xiàn)出明顯的線性界線。接下來,我們使用感知機(jī)對該數(shù)據(jù)集進(jìn)行分類訓(xùn)練。
from sklearn.linear_model import Perceptron
# 將數(shù)據(jù)集劃分為 70% 訓(xùn)練集和 30% 測試集
train_feature, test_feature, train_target, test_target = train_test_split(
X, y, test_size=0.3, random_state=56)
# 建立感知機(jī)模型,使用默認(rèn)參數(shù)
model = Perceptron()
# 使用訓(xùn)練集訓(xùn)練模型
model.fit(train_feature, train_target)
# Perceptron(alpha=0.0001, class_weight=None, early_stopping=False, eta0=1.0,
# fit_intercept=True, max_iter=1000, n_iter_no_change=5, n_jobs=None,
# penalty=None, random_state=0, shuffle=True, tol=0.001,
# validation_fraction=0.1, verbose=0, warm_start=False)
????????訓(xùn)練結(jié)束后,我們用測試數(shù)據(jù)進(jìn)行預(yù)測。請注意,由于測試數(shù)據(jù)與訓(xùn)練數(shù)據(jù)完全不同,也是算法之前完全沒有見過的數(shù)據(jù)。我們后續(xù)可以通過模型對測試數(shù)據(jù)的預(yù)測結(jié)果,然后與真實(shí)的結(jié)果進(jìn)行比較,從而得到模型的分類準(zhǔn)確度。
preds = model.predict(test_feature) # 使用測試集預(yù)測
????????準(zhǔn)確度表示正確預(yù)測的樣本占全部樣本的比例,是用于評估分類模型的常用指標(biāo)之一,我們得到的?preds
?是模型的預(yù)測結(jié)果,而真實(shí)結(jié)果為?test_target
。接下來,可以通過 scikit-learn 提供的??accuracy_score?計(jì)算出分類準(zhǔn)確度。
from sklearn.metrics import accuracy_score
accuracy_score(test_target, preds) # 先傳入真實(shí)值,再傳入預(yù)測值
# 1.0
????????返回的結(jié)果即是測試集預(yù)測分類準(zhǔn)確度,如果為?1.0
?則表示預(yù)測全部正確,分類準(zhǔn)確度為 100%。下面,我們使用 Matplotlib 將訓(xùn)練數(shù)據(jù)和測試數(shù)據(jù)繪制在原圖上,并繪制出感知機(jī)分類時的決策邊界。
# 創(chuàng)建一個繪圖矩陣方便顯示決策邊界線
x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1
xx, yy = np.meshgrid(np.arange(x_min, x_max, 0.02),
np.arange(y_min, y_max, 0.02))
fig, ax = plt.subplots()
# 繪制決策邊界
Z = model.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
ax.contourf(xx, yy, Z, cmap=plt.cm.Paired)
# 繪制訓(xùn)練和測試數(shù)據(jù)
ax.scatter(train_feature[:, 0], train_feature[:, 1])
ax.scatter(test_feature[:, 0], test_feature[:, 1])
# <matplotlib.collections.PathCollection at 0x7fffc2b9cc50>
?
??
????????現(xiàn)在,我們就完成了一個簡單的感知機(jī)分類實(shí)驗(yàn)??梢钥闯鰜?,對于二分類問題,感知機(jī)的預(yù)測效果還是很不錯的。
小練習(xí)
????????嘗試通過?make_classification()
?方法隨機(jī)生成 300 條可用于二分類的數(shù)據(jù),并通過?sklearn.linear_model.LogisticRegression()
?調(diào)用線性模型中的邏輯回歸方法完成分類。最后通過 Matplotlib 將訓(xùn)練集和測試集繪制出來。文章來源:http://www.zghlxwxcb.cn/news/detail-425291.html
3、實(shí)驗(yàn)總結(jié)
????????線性模型是機(jī)器學(xué)習(xí)中十分簡單基礎(chǔ)的模型。但是由于其本身的特點(diǎn),只能用于二分類問題。對于實(shí)際生活中經(jīng)常遇到的多分類及非線性分類問題,無法適用。但對于剛剛?cè)腴T機(jī)器學(xué)習(xí)的朋友來說,線性分類模型是不錯范例。希望大家能掌握本次試驗(yàn)的全部內(nèi)容。文章來源地址http://www.zghlxwxcb.cn/news/detail-425291.html
到了這里,關(guān)于【機(jī)器學(xué)習(xí)sklearn】第二節(jié):線性回歸和線性分類的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!