iT邦幫忙

2023 iThome 鐵人賽

DAY 19
0

終於進入機器學習的實作階段啦,今天要來用鳶尾花資料集介紹一下羅吉斯回歸的作法。

如果覺得很難懂或很無聊再留言跟我說一下耶,寫程式要寫得好玩真的有點難@@


今天的學習目錄

完整的程式我放在GitHub裡面,可以自己拿來練習

  1. 載入鳶尾花資料集
  2. 將資料轉換成DataFrame並抓出我們要的欄位
  3. 將資料切割成訓練集、測試集
  4. 機器學習三步驟:初始模型、機器學習、模型預測
  5. 使用羅吉斯回歸做機器學習
    (明天會講如何評估預測結果的好壞)

載入鳶尾花資料集

前一天的文章中我們有提到鳶尾花這個常用在學習的資料集,今天的機器學習將會使用這個來做示範。

# 導入所需的函式庫
from sklearn.datasets import load_iris

# 導入鳶尾花資料集
iris = load_iris()

在使用資料前,我們要先了解一下他

# 先瞭解資料中有那些索引鍵(不是欄位哦)
iris.keys()

key

可以從圖片裡看到,裡面有'data'(原始資料), 'target'(預測目標), 'frame', 'target_names'(預測目標的名稱), 'DESCR'(描述文字), 'feature_names'(特徵的名稱), 'filename'(檔案名稱), 'data_module'(所在模組)這些索引,我們可以用索引調出裡面的資料。

比如,我們可以用DESCR(描述文字)中看出資料的來源、特徵值、預測目標、數量、有無空值等資訊,甚至還有基本統計(最大值、最小值)

print(iris['DESCR'])

DESCR

因為沒有遺漏值,資料欄位也沒有問題,不需要再去做清理,所以之後在其他資料上有用到我們再來談(我好懶)。

其他的索引只要照上面的程式碼,把'DESCR'換成其他的索引就可以了,可以自己去玩玩看裡面有什麼。

將資料轉換成DataFrame並抓出我們要的欄位

# 導入函式庫
import pandas as pd

# 將iris資料集的原始資料轉換成dataframe,並設定欄位名稱為其特徵名稱。
df = pd.DataFrame(iris['data'], columns=iris['feature_names'])

# 加入預測的目標(其中的0、1、2分別代表了花的三個不同屬種)
df['target'] = iris['target']

# 印出開頭的前五行,看看前面有沒有什麼設定錯誤
df.head()

轉換成df

選擇我們要的欄位

這是很重要的步驟,由我們決定要拿那些資料,去預測哪些目標。

在這邊,我們以X作為特徵資料(自變數),用來預測Y(應變數),關於變數的涵意可以看五大研究變數介紹-應變數、自變數 & 控制、干擾、中介變數這篇文章。

Y應該很明顯是'target',也就是花的種類。那X要怎麼選?

通常,我們會看他跟Y的相關係數,也就是X跟Y的關係,數值在-1~1之間,越高,表示我們越能從X中看出Y。

打個比方,假設Y是性別:

  • 如果X是性器官這類的第一性徵,相關係數就會很高(但不會是1)。
  • 如果X是鬍子、喉結這類的第二性徵,相關係數就會比較前面的低一些。
  • 如果X是性取向,那相關係數又會再低一點,畢竟生理性別不一定能夠決定每個人的性取向。

那我們要怎麼看出資料間的相關係數呢?雖然從前面的'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:用機器學習掌握人工智慧》,想要系統性學習的人,也可以去看看這本書哦。


上一篇
Day18 所以我說那個資料呢?-公開資料集
下一篇
Day20 評估機器學習預測結果
系列文
跟我一起在AI的世界裡打怪獸30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言