Python機器學習入門

在過去的十年中,機器學習已經從科學研究實驗室轉移到日常的網路和移動應用程式中。機器學習使您的應用程式能夠執行以前很難程式設計的任務,例如檢測影象中的物件和麵部、檢測垃圾郵件和仇恨言論,以及為電子郵件和訊息應用程式生成智慧回覆。

但是執行機器學習與經典程式設計有著根本的不同。在本文中,您將學習機器學習的基礎知識,並將建立一個基本模型,該模型可以根據花的測量結果來預測花的種類。

機器學習如何工作?

經典程式設計依賴於明確定義的問題,這些問題可以分解為不同的類、函式和 if-else 命令。另一方面,機器學習依賴於根據經驗發展其行為。您不是為機器學習模型提供規則,而是透過示例來訓練它們。

機器學習演算法有很多種,每一種都可以解決特定的問題。

監督學習

監督學習

適用於需要從輸入資料到結果的問題。所有監督學習問題的共同特徵是,您可以根據一個基本事實來測試您的模型,例如標記影象或歷史銷售資料。

監督學習模型可以解決迴歸或分類問題。迴歸模型預測數量(例如售出商品的數量或庫存價格),而分類問題則嘗試確定輸入資料的類別(例如貓/狗/魚/鳥、欺詐/非欺詐)。

影象分類、人臉檢測、股價預測和銷售預測是監督學習可以解決的問題的例子。

一些流行的監督學習演算法包括線性和邏輯迴歸、支援向量機、決策樹和人工神經網路。

無監督學習

無監督學習適用於您有資料但不是結果,您正在尋找模式的問題。例如,您可能希望根據客戶的相似性將客戶分組。這在無監督學習中稱為

聚類

。或者,您可能想要檢測偏離企業正常活動的惡意網路流量。這稱為

異常檢測

,另一個無監督學習任務。無監督學習對於降

也很有用,這是一種透過刪除不相關的特徵來簡化機器學習任務的技巧。

一些流行的無監督學習演算法包括 K 均值聚類和主成分分析 (PCA)。

強化學習

強化學習

是機器學習的一個分支,其中智慧代理試圖透過與其環境互動來實現目標。強化學習涉及動作、狀態和獎勵。未經訓練的 RL 代理從隨機採取行動開始。每個動作都會改變環境的狀態。如果代理發現自己處於所需的狀態,則會收到獎勵。代理試圖找到產生最多獎勵的動作和狀態序列。

強化學習用於推薦系統、機器人和遊戲機器人,如谷歌的 AlphaGo 和 AlphaStar。

設定 Python 環境

在這篇文章中,我們將專注於監督學習,因為它是機器學習中最受歡迎的分支,而且它的結果更容易評估。我們將使用 Python,因為它具有許多支援機器學習應用程式的功能和庫。但是一般概念可以應用於任何具有類似庫的程式語言。

(如果您不熟悉 Python,freeCodeCamp 有一個很棒的速成課程,可以讓您從基礎開始。)

經常用於資料科學和機器學習的 Python 庫之一是Scikit-learn,它提供了流行的機器學習演算法的實現。Scikit-learn 不是 Python 基礎安裝的一部分,您必須手動安裝它。

macOS 和 Linux 預裝了 Python。要安裝 Scikit-learn 庫,請在終端視窗中鍵入以下命令:

pip install scikit-learn

或者對於 Python 3:

python3 -m pip install scikit-learn

在 Microsoft Windows 上,您必須先安裝 Python。您可以從官網獲取最新版 Python 3 for Windows 的安裝程式。安裝 Python 後,在命令列視窗中鍵入以下命令:

python -m pip install scikit-learn

或者,您可以安裝 Anaconda 框架,其中包括 Python 3 的獨立安裝以及 Scikit-learn 和許多其他用於資料科學和機器學習的庫,例如

Numpy

Scipy

Matplotlib

。您可以在其官網找到免費的Anaconda個人版的安裝說明。

步驟 1:定義問題

每個機器學習專案的第一步都是知道你想解決什麼問題。定義問題將幫助您確定需要收集的資料型別,並讓您瞭解需要使用的機器學習演算法型別。

在我們的例子中,我們想建立一個模型,根據花瓣和萼片的長度和寬度的測量來預測花的種類。

這是一個有監督的分類問題。我們需要收集不同花卉標本及其相應物種的測量值列表。然後我們將使用這些資料來訓練和測試一個可以將測量值對映到物種的機器學習模型。

第 2 步:收集資料

機器學習中最棘手的部分之一是收集資料來訓練模型。您必須找到一個來源,您可以在其中收集訓練模型所需數量的資料。您還需要驗證資料的質量,確保它代表您的模型將處理的不同情況,並避免收集包含隱藏偏差的資料。

對我們來說幸運的是,Scikit-learn 包含幾個用於嘗試不同機器學習演算法的玩具資料集。其中之一是“鳶尾花資料集”,它恰好包含我們解決問題所需的確切資料。我們需要做的就是從庫中載入它。

以下程式碼載入房屋資料集:

from sklearn。datasets import load_irisiris = load_iris()

Iris 資料集包含 150 個觀測值,每個觀測值包含四個測量值 (

iris。data

) 和目標花種 (

iris。target

)。資料列的名稱可以在

iris。feature_names

print(iris。feature_names)‘’‘[’sepal length (cm)‘, ’sepal width (cm)‘, ’petal length (cm)‘, ’petal width (cm)‘]’‘’

iris。target

包含資料集中註冊的三個花種之一的數字索引 (0-2)。花種的名稱可在

iris。target_names

print(iris。target_names)‘’‘[’setosa‘ ’versicolor‘ ’virginica‘]’‘’

第 3 步:拆分資料集

在開始訓練之前,您必須將資料拆分為訓練集和測試集。您將使用訓練集來訓練您的機器學習模型,並使用測試集來驗證其準確性。

這是為了確保您的模型沒有在訓練資料上過度擬合。當您的機器學習模型在訓練示例上表現良好但在看不見的資料上表現不佳時,就會發生過度擬合。選擇錯誤的機器學習演算法、對模型進行錯誤配置、訓練資料不佳或訓練示例太少都可能導致過度擬合。

根據您要解決的問題型別和您擁有的資料量,您必須確定將分配給測試集的資料量。通常,當您擁有大量資料(大約數萬個示例)時,即使是大約 1% 的小樣本也足以測試您的模型。對於 Iris 資料集,它總共包含 150 條記錄,我們將選擇 75-25 的拆分。

Scikit-learn 具有

train_test_split

將資料集拆分為訓練和測試資料集的功能:

from sklearn。model_selection import train_test_splitX_train, X_test, y_train, y_test = train_test_split(iris。data, iris。target, test_size=0。25, stratify=iris。target, random_state=42)

train_test_split

獲取資料和目標資料集並返回兩對資料集用於訓練(

X_train

y_train

)和測試(

X_test

y_test

)。該

test_size

引數確定將分配給測試的資料百分比(介於 0 和 1 之間)。該

stratify

引數確保訓練和測試陣列包含來自每個類的平衡數量的樣本。該

random_state

變數存在於 Scikit-learn 的許多函式中,用於控制隨機數生成器和可重複性。

第 4 步:構建模型

現在我們的資料準備好了,我們可以建立一個機器學習模型並在訓練集上訓練它。有許多不同的機器學習演算法可以解決我們正在處理的分類問題。在我們的例子中,我們將使用“邏輯迴歸”演算法,它非常快,適用於簡單且不包含太多維度的分類問題。

Scikit-learn 的

LogisticRegression

類實現了這個演算法。在例項化它之後,我們透過呼叫函式在我們的訓練集(

X_train

y_train

)上訓練它

fit

。這將調整模型的引數以找到測量值和花種之間的對映。

from sklearn。linear_model import LogisticRegressionlr = LogisticRegression()lr。fit(X_train, y_train)

步驟 5:評估模型

現在我們已經訓練了模型,我們想要測量它的準確性。本

LogisticRegression

類有一個

score

返回該模型的準確性方法。首先,我們將在訓練資料上測量模型的準確性:

print(lr。score(X_train, y_train))

這將返回大約 0。97,這意味著該模型準確預測了 97% 的訓練示例的類別,鑑於我們每個物種只有大約 37 個訓練示例,這非常好。

接下來,我們將在測試集上檢查模型的準確性:

print(lr。score(X_test, y_test))

這將為我們提供大約 95% 的準確率,略低於訓練準確率,這是很自然的,因為這些是模型以前從未見過的示例。透過建立更大的資料集或嘗試另一種機器學習演算法(例如支援向量機),我們可能能夠進一步提高模型的準確性並彌合訓練和測試效能之間的差距。

最後,我們想看看如何在新示例上使用我們訓練好的模型。的

LogisticRegression

類有一個

predict

函式,它的觀察作為輸入的一個數組並返回所預測的類。在我們的花分類器模型的情況下,我們需要為它提供一個包含四個測量值(萼片長度、萼片寬度、花瓣長度、花瓣寬度)的陣列,它將返回一個表示花朵類別的整數:

output = lr。predict([[4。4, 3。2, 1。3, 0。2]])print(iris。target_names[output[0]])‘’‘setosa

恭喜!您已經建立了第一個機器學習模型。我們現在可以將它放在一個應用程式中,該應用程式從使用者那裡進行測量並返回花種:

sepal_l = float(input(“Sepal length (cm):”))sepal_w = float(input(“Sepal width (cm):”))petal_l = float(input(“Petal length (cm):”))petal_w = float(input(“Petal width (cm):”))measurements = [[sepal_l, sepal_w, petal_l, petal_w]]output = lr。predict(measurements)print(f“Your flower is {iris。target_names[output[0]]}”)

希望這將是您成為機器學習大師的第一步。從這裡,您可以繼續學習其他機器學習演算法,更多地瞭解機器學習的基本概念,並繼續學習更高階的主題,例如神經網路和深度學習。透過一些學習和練習,您將能夠創建出色的應用程式,這些應用程式可以檢測影象中的物件、處理語音命令以及與使用者進行對話。