[Python] 跌入數據分析的坑 – 談談機器學習入門 (三)

Photo by Marc-Olivier Jodoin on Unsplash

接續前兩篇起手式「跌入數據分析的坑 – 談談起手式 NumPy (一)」與「跌入數據分析的坑 – 談談起手式 Pandas (二)」後,接下來要談談機器學習,同時也是「成為python數據分析達人的第一課(自學課程)」 最後的第六、七週課程,內文大多也是依照課程上提到,並且加上自己的學習筆記。

前言

上述已經有提到課程來到了第六、第七週,花費了一個禮拜的時間要將這些內容吸收,並同時活用在數據分析之中,說實在話,似乎還有點距離,但基礎的知識、用法,該懂還是要懂,演算法原理之後再談,就如同課程內容,只是提供數據分析、機器學習入門的管道,將核心放在增加廣度。

基礎知識

所謂機器學習分類可以分成以下幾點。

  1. 監督式學習
    假設要讓電腦辨別貓咪,就如同教育小孩子一樣,不斷的給他關於貓咪的影像、特徵,帶著這原理回到電腦上,就必須丟給電腦許多貓咪的照片,讓電腦自行識別出這些照片上的共通點,來辨別什麼是貓咪。
  2. 非監督式學習
    非監督學習的方法在於,連人類都不知道該如何去辨別的時候,就可以藉由此學習方法,讓機器來找出不同特徵之間該如何去歸類。
  3. 半監督學習
    半監督學習介於監督與非監督之間,其作法是先透過監督是學習後,在將環境轉換至陌生的環境進行自主學習。
  4. 強化學習
    此學習方法比較特殊,不需要給予電腦過多的資訊,透過學習演算法找到最佳方法,借用莫煩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 來輸出訓練、測試的形狀。

如果要使用線性回歸預測,就必須先轉成二維陣列,其有兩種方法改變形狀,可以參考下圖使用 reshapeshape

開始預測

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_ 來進行著色。

最後閒聊

由於數學真的很差,許多演算法真的是絞盡腦汁也看不太懂,其次是剛進入到這個領域,有許多部份還是懵懵懂懂,如果有錯誤也希望有看到的網友們能夠給予反饋。


發佈留言

這個網站採用 Akismet 服務減少垃圾留言。進一步瞭解 Akismet 如何處理網站訪客的留言資料