終於進入機器學習的實作階段啦,今天要來用鳶尾花資料集介紹一下羅吉斯回歸的作法。
如果覺得很難懂或很無聊再留言跟我說一下耶,寫程式要寫得好玩真的有點難@@
完整的程式我放在GitHub裡面,可以自己拿來練習
在前一天的文章中我們有提到鳶尾花這個常用在學習的資料集,今天的機器學習將會使用這個來做示範。
# 導入所需的函式庫
from sklearn.datasets import load_iris
# 導入鳶尾花資料集
iris = load_iris()
# 先瞭解資料中有那些索引鍵(不是欄位哦)
iris.keys()
可以從圖片裡看到,裡面有'data'(原始資料), 'target'(預測目標), 'frame', 'target_names'(預測目標的名稱), 'DESCR'(描述文字), 'feature_names'(特徵的名稱), 'filename'(檔案名稱), 'data_module'(所在模組)這些索引,我們可以用索引調出裡面的資料。
比如,我們可以用DESCR(描述文字)中看出資料的來源、特徵值、預測目標、數量、有無空值等資訊,甚至還有基本統計(最大值、最小值)
print(iris['DESCR'])
因為沒有遺漏值,資料欄位也沒有問題,不需要再去做清理,所以之後在其他資料上有用到我們再來談(我好懶)。
其他的索引只要照上面的程式碼,把'DESCR'換成其他的索引就可以了,可以自己去玩玩看裡面有什麼。
# 導入函式庫
import pandas as pd
# 將iris資料集的原始資料轉換成dataframe,並設定欄位名稱為其特徵名稱。
df = pd.DataFrame(iris['data'], columns=iris['feature_names'])
# 加入預測的目標(其中的0、1、2分別代表了花的三個不同屬種)
df['target'] = iris['target']
# 印出開頭的前五行,看看前面有沒有什麼設定錯誤
df.head()
這是很重要的步驟,由我們決定要拿那些資料,去預測哪些目標。
在這邊,我們以X作為特徵資料(自變數),用來預測Y(應變數),關於變數的涵意可以看五大研究變數介紹-應變數、自變數 & 控制、干擾、中介變數這篇文章。
Y應該很明顯是'target',也就是花的種類。那X要怎麼選?
通常,我們會看他跟Y的相關係數,也就是X跟Y的關係,數值在-1~1之間,越高,表示我們越能從X中看出Y。
打個比方,假設Y是性別:
那我們要怎麼看出資料間的相關係數呢?雖然從前面的'DESCR'就可以看到了,但這邊我們還是操作一次。
# 看DataFrame中各項特徵與targer欄位(花屬種)的相關係數,round(2)代表取到小數點後兩位
df.corr().round(2)['target']
可以看到,最相關的是petal width,而sepal width最不相關。因此這次我們將他踢除掉,只用另外三個加入模型。
# 將特徵(x)、目標(y)各自需要的欄位抓出來
x_col = df[['sepal length (cm)', 'petal length (cm)', 'petal width (cm)']]
y_col = df['target']
# 載入要切割資料的函式庫
from sklearn.model_selection import train_test_split
# 將資料切割成訓練集、測試集
X_train, X_test, Y_train, Y_test = train_test_split(x_col, y_col, test_size=0.33, random_state=42)
這個函式庫的運作過程是這樣:給他四個變數存放切割後的資料集(所以變數的名稱不一定要跟我取一樣,)有四個就好;告訴他你要切的x、y;測試集要切的大小(這邊是設定拿0.33,大概三分之一),最後加入一個隨機種子。
這邊比較難理解的應該是隨機種子這個概念,當初我在學的時候也很疑惑,這個到底是幹嘛用的?而且為什麼大家都用42?
設定一個隨機數(切法),讓每次切出來的資料都一樣。
因為程式在切割的時候,資料是隨機切的,每次出來的數字都不一樣。但如果像現在這樣在教學的時候,每個人資料如果切出來都不同,那學生就沒辦法確定自己到底是不是做對了。
所以設定隨機種子就是設定一個「固定的切法」,讓出來的資料都一樣。
至於為什麼都要用42?
據random_state = 42這篇網路文章所說……
42,是道格拉斯·亞當斯所作的小說《銀河系漫遊指南》中「生命、宇宙以及任何事情的終極答案」的答案,由於該作品的廣泛流傳,而成為在其他行業藉此對該作品的致敬。
只能說,這是一種致敬和另一種浪漫吧XD。
1. 初始模型
先從相關的函式庫中,將模型放到自己命名的變數中,之後訓練的結果都會儲存到這個變數裡面。
2. 機器學習
「只拿訓練集」做訓練,這個過程是先讓他看訓練集的資料,裡面有各種特徵,也有標籤(Y),他經過自己觀察,發現X跟Y之間的關聯。
訓練機器學習的函數式:
初始模型的變數.fit(X的訓練集, Y的訓練集)
3. 模型預測
訓練好模型後,用「測試集」去做預測,因為經過前面的訓練,他已經知道大概那些X會對應到哪個Y,這樣他就可以去預測沒看過的資料中,如果一個物體擁有那些X,可能就是那個Y。
下面是羅吉斯回歸的一個線性組合:
可能有人看到之後就頭暈了,怎麼我還要學數學?!
別急別急,我來說明一下。其中X1、X2等等的是其中的「特徵值」,BO、B1等則是每個特徵的「權重」。羅吉斯回歸會根據這些權重,輸出新的物體可能是哪個Y的概率。
這樣可能有點抽象,實際一點就是,前面訓練集中,在預測的時候,這個人(新的物體)的頭髮長度是70公分,一個禮拜吃甜食的日期是3天,聲音是高的,回歸跑出來後,可能就會顯示這個人是女生。
(原本的假設有點問題,這裡有重新改過了。)
預測模型的函數式:
# 因為是要用X去預測Y,所以只要給他X(題目)就好,不用給他Y(答案)。
要放結果的變數 = 初始模型的變數.predict(X測試集)
# 導入要做羅吉斯回歸的函式庫
from sklearn.linear_model import LogisticRegression
# 初始模型:將匯入的羅吉斯回歸模型放進自己設定的變數中
mod = LogisticRegression()
拿資料給他訓練,X是每朵鳶尾花的特徵(長寬等等),Y是鳶尾花的種類。這個訓練是讓他知道當這朵花長寬多少的時候,大概會是哪種鳶尾花。
# 訓練模型
mod.fit(X_train, Y_train)
給他測試集的X,讓他預測Y。
# 給他X讓他預測Y
pred = mod.predict(X_text)
評估預測結果我想放在明天講,因為還要講一些召回率、正確率、混亂矩陣等等巴拉巴拉的東西,再寫下去會讓人想睡覺。
今天先吸收這些吧!
上面有一些程式邏輯是參考徐聖訓老師的《一行指令學Python:用機器學習掌握人工智慧》,想要系統性學習的人,也可以去看看這本書哦。