接續前兩篇起手式「跌入數據分析的坑 – 談談起手式 NumPy (一)」與「跌入數據分析的坑 – 談談起手式 Pandas (二)」後,接下來要談談機器學習,同時也是「成為python數據分析達人的第一課(自學課程)」 最後的第六、七週課程,內文大多也是依照課程上提到,並且加上自己的學習筆記。
前言
上述已經有提到課程來到了第六、第七週,花費了一個禮拜的時間要將這些內容吸收,並同時活用在數據分析之中,說實在話,似乎還有點距離,但基礎的知識、用法,該懂還是要懂,演算法原理之後再談,就如同課程內容,只是提供數據分析、機器學習入門的管道,將核心放在增加廣度。
基礎知識
所謂機器學習分類可以分成以下幾點。
- 監督式學習
假設要讓電腦辨別貓咪,就如同教育小孩子一樣,不斷的給他關於貓咪的影像、特徵,帶著這原理回到電腦上,就必須丟給電腦許多貓咪的照片,讓電腦自行識別出這些照片上的共通點,來辨別什麼是貓咪。 - 非監督式學習
非監督學習的方法在於,連人類都不知道該如何去辨別的時候,就可以藉由此學習方法,讓機器來找出不同特徵之間該如何去歸類。 - 半監督學習
半監督學習介於監督與非監督之間,其作法是先透過監督是學習後,在將環境轉換至陌生的環境進行自主學習。 - 強化學習
此學習方法比較特殊,不需要給予電腦過多的資訊,透過學習演算法找到最佳方法,借用莫煩Python給的例子,舉例要給機器手臂學習投籃,僅告訴機器手臂投進就會得分,機器便會不斷嘗試,直到找到投籃進球需要的力道與角度為止。
起手式
首先還是如同之前一樣,將起手式 import
標頭輸入進來。
%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
不過在第六週、第七週的課程中,並沒有使用到 pandas
套件,可以自行省略掉沒關係。
線性回歸預測(Linear regression)
簡單的說,線性回歸預測,是根據自變數和因變數的關係建立方程式,就接著直接使用吧,筆者我也是懵懵懂懂的從實做中學習,發現好像沒有想像中的難,但要解釋還是不容易。
建立假資料觀察
首先建立一份假資料做觀察,透過 np.linspace(0, 5, 100)
,在 0 到 5 區間建立 100 個點作為 x,並設立 y 為 1.2 * x * 0.8
,為了更符合真實數據性,讓 y 加上 np.random.randn(100) * 0.5
,如果要讓資料更隨機一點,可以將 0.5 調整為 0.6 或更高。
x = np.linspace(0, 5, 100)
y = 1.2 * x + 0.8 + 0.5 * np.random.randn(100)
使用 plt.scatter(x, y)
把點標記出來,如下圖。
建立訓練、測試資料
一開始必須從資料中提取出一部分當作「訓練資料」; 另一部分當作「測試資料」,顧名思義,訓練資料用於機器學習;測試資料用來測試預測結果。
接著要從 x 與 y 之中隨機挑選出幾個對應的值,並且分成兩組,來當作訓練、測試資料,為了完成此工作,可以透過以下套件快速達成,一樣先將套件 import
進來。
from sklearn.model_selection import train_test_split
切分出訓練、測試資料如下,其中 x, y,是由我們自己建立的,另外的 test_size
可以調整要切分的比例,例如 0.2
就是 80% 的訓練資料; 20% 的測試資料。接著 random_state
為隨機的種子,為了方便預測,有時候會希望產生的訓練、測試資料與先前的一樣,就可以透過隨機種子來達成。隨後 train_test_split
會回傳四個值,光看變數名稱應該就很清楚了。
x_train, x_test, y_train, y_test = train_test_split(x,
y,
test_size=0.2,
random_state=87)
接著透過 shape
來輸出訓練、測試的形狀。
如果要使用線性回歸預測,就必須先轉成二維陣列,其有兩種方法改變形狀,可以參考下圖使用 reshape
或 shape
。
開始預測
Python 要如何使用線性回歸需要 import
以下的套件。
from sklearn.linear_model import LinearRegression
在開始使用之前,必須實體化 LinearRegression
,如下。
regr = LinearRegression()
便可以使用 x_train
, y_train
執行訓練,由於資料量小,訓練時間近乎一執行就馬上完成了。
regr.fit(x_train, y_train)
接著對 x_test
進行預測,並將預測結果存至變數 predict_result
中。
predict_result = regr.predict(x_test)
現在要如何得知測試的準確度呢?可以透過,預測結果比對 y_test
,以下圖為例,紅線為真實結果的線性方程式; 綠線則為透過線性回歸預測方法得到的線性方程式,相較之下差異並不大,也代表預測結果並沒有失準太多。
支援向量機 SVM (Support Vector Machine)
SVM 屬於監督式學習,可以透過學習輸入、輸出的對應,來預測結果。
建立假資料觀察
首先與線性回歸相同,需要先行建立一份可以提供觀察、學習的資料,藉由以下方法建立 x, y,其中 x 為訓練資料的輸入,y 為分類結果(1, 2 兩類)。
x = np.array([[-3, 2], [-6, 5], [3, -4], [2, -8]])
y = np.array([1, 1, 2, 2])
藉此可以輸出 x 的圖形,並用 y 去著色。
開始預測
同樣的要 import
SVM 的套件,並實體化 SVM,如以下語法。
from sklearn.svm import SVC
clf = SVC()
訓練的方法並沒有改變,如同線性回歸,使用 fit
方法。
clf.fit(x, y)
預測方法也是一樣的,預測 x 的點,並回傳點 1, 2, 3, 4 分別屬於第幾類,也可以輸入一個全新的點,SVM 會藉由過去的經驗來預測這個點屬於第幾類。
了解原理
為了瞭解 SVM 到底是怎麼分類的,現在先行製作一個滿版的圖形,可以使用 meshgrid
方法來產生,並且使用 ravel
轉換成一維陣列,使用 ravel
比較方便的地方是不用像 reshape
,需要先行算好共有多少值。
X, Y = np.meshgrid(np.linspace(-6, 3, 30), np.linspace(-8, 5, 30))
X = X.ravel()
Y = Y.ravel()
查看圖形就會長成下圖這樣。
在藉由剛才的訓練結果來預測分析這張滿版的圖,就會變成下面這樣,一條曲線把全部分成了兩類。
分群演算法 K-Means
K-Means 屬於非監督式學習,可以藉由資料特徵自動將其分類,使用前一樣先 improt
必要的套件。
from sklearn.cluster import KMeans
建立假資料觀察
透過以下語法建立區間在 0 到 1 之間,且形狀為 (100, 2)
的亂數。
X = np.random.rand(100, 2)
開始分群
這次實體化,必須指定一個參數 n_clusters
,設置這個參數,可以告訴 K-Means
要自動分成幾個類別。
clf = KMeans(n_clusters=3)
訓練的方式與前者都一樣。
clf.fit(X)
可以透過 .labels_
來查看分類的狀況,並且藉由 .labels_
來進行著色。
最後閒聊
由於數學真的很差,許多演算法真的是絞盡腦汁也看不太懂,其次是剛進入到這個領域,有許多部份還是懵懵懂懂,如果有錯誤也希望有看到的網友們能夠給予反饋。