pytorch&scikit-learn機器學1- 賦予計算機從資料中學習的能力

磁石空杯發表於2023-05-04

在我看來,機器學習即對資料有意義的演算法的應用和科學,是所有電腦科學中最令人興奮的領域!利用機器學習領域的自學演算法,我們可以將這些資料轉化為知識。

在本章中,我們將涵蓋以下主題:

  • 機器學習的一般概念
  • 三種型別的學習和基本術語
  • 成功設計機器學習系統的基石
  • 安裝和設定用於資料分析和機器學習的Python
  • 構建智慧機器,將資料轉化為知識

機器學習的一般概念

在這個現代技術的時代有大量的結構化和非結構化資料。在20世紀下半葉,機器學習作為人工智慧(AI)的子領域發展起來,涉及到自學演算法,從資料中得出知識,進行預測。

與其要求人類從分析大量資料中手動推匯出規則並建立模型,機器學習提供了更有效的替代方案,捕捉資料中的知識,逐步提高預測模型的效能,做出資料驅動的決策。

由於機器學習,我們享有強大的電子郵件垃圾郵件過濾器,方便的文字和語音識別軟體,可靠的網路搜尋引擎,娛樂性電影的觀看建議,移動支票存款,估計送餐時間,以及更多。希望不久之後,我們將把安全高效的自動駕駛汽車新增到這個列表中。此外,在醫療應用方面也取得了明顯的進展;例如,研究人員證明,深度學習模型可以以接近人類的準確度檢測皮膚癌。另一個里程碑是最近由DeepMind的研究人員取得的,他們使用深度學習來預測三維蛋白質結構,比基於物理學的方法要好得多。研究人員設計了提前四天預測COVID-19患者的氧氣需求的系統,以幫助醫院為需要的人分配資源。我們這個時代的另一個重要話題是氣候變化,它是最大和最關鍵的挑戰之一。研究人員旨在設計基於計算機視覺的機器學習系統,以最佳化資源配置,儘量減少肥料的使用和浪費。

機器學習的三種不同型別

在本節中,我們將看一下機器學習的三種型別:監督學習、無監督學習和強化學習。我們將瞭解這三種不同的學習型別之間的根本區別,並利用概念性的例子,對它們可以應用的實際問題領域進行了解:

image

  • 用監督學習對未來進行預測

監督學習的主要目標是從標記的訓練資料中學習一個模型,使我們能夠對未見的或未來的資料進行預測。在這裡,術語 "監督 "指的是一組訓練例項(資料輸入),其中所需的輸出訊號(標籤)已經知道。監督下的學習是對資料輸入和輸出之間的關係進行建模的過程。 因此,我們也可以把監督學習看作是 "標籤學習"。

下圖總結了典型的監督學習工作流程:標記的訓練資料被傳遞給機器學習演算法,用於擬合預測模型,該模型可以對新的、未標記的資料輸入進行預測:

我們可以使用監督機器學習演算法在已標記的郵件語料庫上訓練一個模型,這些郵件被正確地標記為垃圾郵件或非垃圾郵件,以預個新郵件是否屬於這兩個類別。有離散類標籤的監督學習任務,如前面的垃圾郵件過濾例子,也被稱為分類任務。監督學習的另一個子類別是迴歸,其中結果訊號是一個連續值。

分類是監督學習的子類別,其目標是根據過去的觀察結果來預測新例項或資料點的分類標籤。這些類標籤是離散的、無序的值,可以理解為資料點的組別成員。前面提到的垃圾郵件檢測的例子代表了二元分類任務的典型例子,機器學習演算法學習了一套規則來區分兩個可能的類別:垃圾郵件和非垃圾郵件。

下圖說明了給定30個訓練例項的二元分類任務的概念;15個訓練例項被標記為A類,15個訓練例項被標記為B類。在這種情況下,我們的資料集是二維的,這意味著每個例項有兩個與之相關的值:x1和x2。現在,我們可以使用監督下的機器學習演算法來學習一條規則--用虛線表示的決策邊界--它可以將這兩個類別分開,並將新的資料分類到這兩個類別中,因為它的值是x1和x2。

image

類標籤的集合不一定是二進位制性質的。由監督學習演算法學習的預測模型可以將訓練資料集中出現的任何類別標籤分配給新的、未標記的資料點或例項。

多類分類任務的典型例子是手寫字元識別。我們可以收集一個訓練資料集,其中包括字母表中每個字母的多個手寫例子。這些字母("A"、"B"、"C"等)將代表我們想要預測的不同無序類別或類標籤。現在,如果使用者透過輸入裝置提供新的手寫字元,我們的預測模型將能夠以一定的準確性預測出字母表中的正確字母。然而,我們的機器學習系統將無法正確識別0到9之間的任何數字,如果它們不是訓練資料集的一部分。

第二種型別的監督學習是預測連續結果,這也被稱為迴歸分析。在迴歸分析中,我們得到一些預測(解釋)變數和連續的響應變數(結果),我們試圖找到這些變數之間的關係,使我們能夠預測結果。

注意,在機器學習領域,預測變數通常被稱為 "特徵",而響應變數通常被稱為 "目標變數"。

例如,讓我們假設我們對預測學生的數學SAT分數感興趣。(SAT是美國大學錄取時經常使用的一種標準化考試)。如果學習考試的時間和最終的分數之間有關係,我們可以用它作為訓練資料來學習一個模型,用學習時間來預測未來計劃參加這個考試的學生的考試分數。

他觀察到,父母的身高並沒有傳給他們的孩子,相反,他們的孩子的身高會向人群的平均水平倒退。

下圖說明了線性迴歸的概念。給定特徵變數x和目標變數y,我們對這個資料擬合一條直線,使資料點和擬合線之間的距離最小--最常見的是平均平方距離。

image

  • 用強化學習解決互動問題

在強化學習中,目標是開發一個系統(代理),根據與環境的互動作用來提高其效能。由於關於環境當前狀態的資訊通常還包括獎勵訊號,我們可以認為強化學習是監督學習有關的領域。然而,在強化學習中,這種反饋不是正確的基礎真理標籤或價值,而是衡量該行動被獎勵函式所衡量的程度。透過與環境的互動,代理可以使用強化學習來學習一系列的行動,透過探索性的試錯方法或深思熟慮的規劃來使這個獎勵最大化。

強化學習的流行的例子是國際象棋程式。在這裡,代理人根據棋盤(環境)的狀態來決定一系列的動作,獎勵可以定義為遊戲結束時的贏或輸:

image

強化學習有許多不同的子型別。然而普遍的方案是,強化學習中的代理人試圖透過與環境的一系列互動來實現獎勵的最大化。每個狀態都可以與正或負的獎勵相關聯,獎勵可以被定義為完成一個總體目標,如贏或輸一盤棋。例如,在國際象棋中,每一步棋的結果可以被認為是環境的不同狀態。

為了進一步探討國際象棋的例子,我們可以認為訪問棋盤上的某些配置與更有可能導致勝利的狀態有關--例如,從棋盤上移走對手的棋子或威脅到皇后。而其他位置則與更有可能導致輸掉比賽的狀態有關,例如在下一回合輸給對手一個棋子。現在,在國際象棋遊戲中,獎勵(贏棋的正面獎勵或輸棋的負面獎勵)將在遊戲結束時才會給出。此外,最後的獎勵也將取決於對手如何下棋。例如,對手可能會犧牲皇后,但最終贏得比賽。

總之,強化學習關注的是學會選擇一系列行動,使總獎勵最大化,獎勵可以在採取行動後立即獲得,也可以透過延遲的反饋獲得。

  • 用無監督學習發現隱藏結構

在監督學習中,當我們訓練一個模型時,我們事先知道正確的答案(標籤或目標變數),而在強化學習中,我們為代理進行的特定行動定義了獎勵的措施。然而,在無監督學習中,我們要處理的是沒有標籤的資料或未知結構的資料。使用無監督學習技術,我們能夠探索資料的結構,在沒有已知的結果變數或獎勵函式的指導下提取有意義的資訊。

聚類是一種探索性的資料分析或模式發現技術,它允許我們將一堆資訊組織成有意義的子組(聚類),而不需要事先了解它們的組員身份。在分析過程中產生的每個聚類定義了一組具有一定程度相似性的物件,但與其他聚類中的物件更不相似,這就是為什麼聚類有時也被稱為無監督分類。聚類是一種構造資訊和從資料中得出有意義關係的偉大技術。例如,它允許營銷人員根據客戶的興趣來發現客戶群,以便制定不同的營銷方案。

下圖說明了聚類是如何應用於將無標籤的資料根據其特徵x1和x2的相似性組織成三個不同的群體或聚類(A、B和C,順序任意):

image

無監督學習的另一個子領域是降維。通常情況下,我們要處理的是高維資料--每個觀察值都有大量的測量值--這對有限的儲存空間和機器學習演算法的計算效能是一個挑戰。無監督的降維是特徵預處理中常用的方法,可以去除資料中的噪音,這可能降低某些演算法的預測效能。降維將資料壓縮到較小的維度子空間,同時保留大部分相關資訊。

有時,降維對於資料的視覺化也很有用;例如,高維特徵集可以被投射到一維、二維或三維特徵空間上,透過二維或三維散點圖或直方圖進行視覺化。下圖顯示了一個應用非線性降維的例子,將三維瑞士捲壓縮到一個新的二維特徵子空間:

image

基本術語和記號的介紹

下圖Iris資料集的節選,這是機器學習領域的一個經典案例(更多資訊可以在https://archive.ics.uci.edu/ml/datasets/iris)。鳶尾花資料集包含來自三個不同品種的150朵鳶尾花的測量結果--Setosa, Versicolor, 和Virginica。

在這裡,每個花的例子代表我們資料集中的一行,以釐米為單位的花的測量值被儲存為列,我們也稱之為資料集的特徵:

image

為了使符號和實現簡單而有效,我們將利用線性代數的一些基礎知識。在下面的章節中,我們將使用矩陣符號來指代我們的資料。我們將遵循常見的慣例,將每個例子表示為特徵矩陣X中的一個單獨的行,其中每個特徵被儲存為一個單獨的列。

Iris資料集由150個例子和4個特徵組成,因此可以寫成150×4的矩陣,形式上表示為 :

我們將使用上標i指代第i個訓練例項,下標j指代訓練資料集的第j個維度。

我們將使用小寫的粗體字來指代向量,大寫的粗體字來指代矩陣。為了指代向量或矩陣中的單個元素,我們將用斜體字寫字母。

例如,指的是花例150的第一個維度,即萼片長度。矩陣X中的每一行代表一個花的例項,可以寫成一個四維行向量, :

而每個特徵維度是一個150維的列向量, 。舉例來說:

同樣,我們可以把目標變數(這裡是指類標籤)表示為150維的列向量:

機器學習是一個龐大的領域,也是非常跨學科的領域,因為它彙集了許多來自其他研究領域的科學家。恰好,許多術語和概念被重新發現或重新定義,可能已經為你所熟悉,但以不同的名稱出現。為了方便起見,在下面的列表中,你可以找到一些常用的術語和它們的同義詞,你在閱讀本書和一般的機器學習文獻時可能會發現它們很有用:

訓練例項: 表中代表資料集的一行,與觀察、記錄、例項或樣本同義(在大多數情況下,樣本是指訓練例項的集合)。
訓練: 模型擬合,對於引數模型類似於引數估計。
特徵,縮寫為x: 資料表或資料(設計)矩陣中的一列。與預測器、變數、輸入、屬性或協變數同義。
目標,縮寫為y: 與結果、輸出、響應變數、因果變數、(類)標籤和基本事實同義。

損失函式: 通常與成本函式同義使用。有時損失函式也被稱為誤差函式。在一些文獻中,"損失 "一詞指的是針對單個資料點測量的損失,而成本是計算整個資料集的損失(平均或加總)的測量。

構建機器學習系統的路線圖

在前面的章節中,我們討論了機器學習的基本概念和三種不同的學習型別。在本節中,我們將討論機器學習系統中伴隨著學習演算法的其他重要部分。

image

  • 預處理--使資料成型

原始資料很少以學習演算法的最佳效能所需的形式和形狀出現。因此,資料的預處理是任何機器學習應用中最關鍵的步驟之一。

如果我們以上一節中的鳶尾花資料集為例,我們可以把原始資料看成是一系列的花卉影像,我們要從中提取有意義的特徵。有用的特徵可以圍繞花的顏色或花的高度、長度和寬度。

許多機器學習演算法還要求所選特徵在同一尺度上以獲得最佳效能,這通常是透過在[0, 1]範圍內轉換特徵或具有零平均值和單位方差的標準正態分佈來實現。

一些被選中的特徵可能是高度相關的,因此在一定程度上是多餘的。在這些情況下,降維技術對於將特徵壓縮到較低維度的子空間是很有用的。降低特徵空間的維度需要更少的儲存空間,而且學習演算法可以執行得更快。在某些情況下,如果資料集包含大量不相關的特徵(或噪聲);也就是說,如果資料集的訊雜比很低,降維也可以提高模型的預測效能。

為了確定我們的機器學習演算法不僅在訓練資料集上表現良好,而且對新資料也有很好的泛化作用,我們還想把資料集隨機分成獨立的訓練和測試資料集。我們使用訓練資料集來訓練和最佳化我們的機器學習模型,而將測試資料集保留到最後以評估最終模型。

  • 訓練和選擇預測模型

每種分類演算法都有其固有的偏見,如果我們不對任務做任何假設,沒有任何分類模型有優勢。因此,在實踐中,必須至少比較一些不同的學習演算法,以訓練和選擇效能最好的模型。但在比較不同的模型之前,我們首先要決定衡量效能的指標。常用的指標是分類精度,它被定義為正確分類的例項比例。

如果我們不使用這個測試資料集進行模型選擇,而是保留它進行最終的模型評估,我們怎麼知道哪個模型在最終的測試資料集和真實世界的資料上表現良好?為了解決這個問題中蘊含的問題,可以使用被總結為 "交叉驗證 "的不同技術。在交叉驗證中,我們將資料集進一步劃分為訓練子集和驗證子集,以估計模型的泛化效能。

最後,我們也不能指望軟體庫提供的不同學習演算法的預設引數對我們的具體問題任務來說是最優的。因此,我們將經常使用超引數最佳化技術,幫助我們在後面的章節中對模型的效能進行微調。

我們可以把這些超引數看作不是從資料中學習出來的引數,而是代表模型的旋鈕,我們可以轉動它來提高其效能。在後面的章節中,當我們看到實際的例子時,這將變得更加清晰。

  • 評估模型和預測未見過的資料例項

在我們選擇了一個在訓練資料集上擬合的模型後,我們可以使用測試資料集來估計它在這些未見過的資料上的表現,以估計所謂的泛化誤差。如果我們對它的表現感到滿意,我們現在可以用這個模型來預測新的、未來的資料。需要注意的是,前面提到的程式的引數,如特徵縮放和降維,完全是從訓練資料集中獲得的,同樣的引數後來被重新應用於轉換測試資料集,以及任何新的資料例項--否則在測試資料上測量的效能可能過於樂觀了。

使用Python進行機器學習

  • Anaconda

Python是資料科學中最流行的程式語言,由於其非常活躍的開發者和開源社群,已經開發了大量有用的科學計算和機器學習的庫。

儘管Python等解釋型語言在計算密集型任務方面的效能不如低階別的程式語言,但NumPy和SciPy等擴充套件庫已經被開發出來,它們建立在低階別的Fortran和C實現之上,用於對多維陣列進行快速向量操作。

對於機器學習程式設計任務,我們將主要參考scikit-learn庫,它是目前最流行和最容易獲得的開源機器學習庫之一。在後面的章節中,當我們關注機器學習的一個子領域--深度學習時,我們將使用最新版的PyTorch庫,它專門透過利用顯示卡非常有效地訓練所謂的深度神經網路模型。

強烈推薦的用於科學計算背景下安裝Python的開源軟體包管理系統是Continuum Analytics的Conda。Conda是免費的,並在許可性的開源許可證下授權。它的目標是幫助資料科學、數學和工程的Python包在不同的作業系統上進行安裝和版本管理。如果你想使用conda,它有不同的版本,即Anaconda、Miniconda和Miniforge:

Anaconda預裝了許多科學計算軟體包。Anaconda的安裝程式可以在https://docs.anaconda.com/anaconda/install/,而Anaconda的快速入門指南可以在https://docs.anaconda.com/anaconda/user-guide/getting-started/。
Miniconda是Anaconda的一個更精簡的替代品(https://docs.conda.io/en/latest/miniconda.html)。本質上,它與Anaconda相似,但沒有預裝任何軟體包,許多人(包括作者)都喜歡這樣。
Miniforge與Miniconda類似,但由社群維護,並使用與Miniconda和Anaconda不同的包庫(conda-forge)。我們發現Miniforge是Miniconda的很好的替代品。下載和安裝說明可以在GitHub倉庫中找到:https://github.com/conda-forge/miniforge。
在透過 Anaconda、Miniconda 或 Miniforge 成功安裝 conda 後,我們可以使用以下命令安裝新的 Python 包:

conda install SomePackage
conda update SomePackage

不能透過官方conda渠道獲得的軟體包可能會透過社群支援的conda-forge專案(https://conda-forge.org)獲得,這可以透過-channel conda-forge標誌指定。比如說

conda install SomePackage --channel conda-forge

不能透過預設的conda通道或conda-forge獲得的軟體包可以透過pip安裝,如前所述。比如說

pip install SomePackage
  • 用於科學計算、資料科學和機器學習的軟體包

在本書的前半部分,我們將主要使用NumPy的多維陣列來儲存和處理資料。偶爾,我們會使用pandas,這是建立在NumPy之上的庫,它提供了額外的高階資料操作工具,使處理表格資料更加方便。為了增強你的學習體驗,並將定量資料視覺化,這對理解資料往往非常有用,我們將使用非常可定製的Matplotlib庫。

NumPy
SciPy
Scikit-learn 
Matplotlib 
pandas

相關文章