用Python進行機器學習(附代碼、學習資源)

2021-02-19 數據分析

作者:Tirthajyoti Sarkar;翻譯:張逸;校對:馮羽

本文約3090字,建議閱讀6分鐘。

本文從非線性數據進行建模,帶你用簡便並且穩健的方法來快速實現使用Python進行機器學習。

使用Python庫、流水線功能以及正則化方法對非線性數據進行建模。

在數據科學和分析領域中,對非線性數據進行建模是一項常規任務。但找到一個結果隨自變量線性變化的自然過程很不容易。因此,需要有一種簡便並且穩健的方法來快速將測量數據集與一組變量進行擬合。我們假定測量數據可能包含了一種複雜的非線性函數關係。這應該是數據科學家或機器學習工程師常用的工具。

 

我們要考慮以下幾個相關的問題:

 

如何確定擬合多項式的順序?

「我們能不能畫出數據圖形直接得到結論?」

 

數據如果能清楚的可視化表示(即特徵維度為1或2)時,方法可行。一旦數據的特徵維度等於3或者更多,這事兒就麻煩了。而且如果對結果產生影響的特徵存在交叉耦合,這麼做就完全是在浪費時間。下面我們畫個圖來感受一下:

很明顯,直接畫圖的方法最多也只能做到上面這種程度。對那些更高維度並且變量相互作用的數據集,如果你試圖每次只查看單個輸入變量和輸出之間的關係,會得出完全錯誤的結論。而且目前沒有什麼好辦法同時顯示兩個以上的變量。所以,我們必須採用某種機器學習的技術來擬合多維數據集。

 

實際上,已經有了不少好的解決方案。

 

在你看到「...但這些是高維非線性數據集...」這句話發出尖叫之前,線性回歸應該是頭一個能找到的工具。注意一點:線性回歸模型中的「線性」二字指的是係數,而不是特徵。特徵(即自變量)可以是任意多維度的,甚至可以是指數、對數、正弦這些函數。更厲害的是,可以使用這些變換和線性模型(近似)對令人驚訝的大量自然現象進行建模。

 

來看看下邊這個有三個特徵、單輸出的數據集。我們再一次使用了前邊提到的畫圖方法,很明顯它表現的差強人意。

因此,我們決定學習一個具有高階多項式項線性模型來擬合數據集。那麼問題來了:

怎樣確定什麼多項式是有用的?

如果我們開始將一次項、二次項、三次項...逐個進行組合,什麼時候停止比較合適呢?

我們怎麼判定哪些交叉耦合的項是重要的?比如:是只需要_X_1²、_X_2³還是需要有_X_1._X_2以及_X_1².X3這種項?

最後,我們是不是必須手動將這些多項式轉換的方程/函數式寫出來並且應用到數據集上?

 

強大的Python機器學習庫來幫忙


幸運的是,有一個很厲害的機器學習庫--scikit-learn提供了很多成熟的類/對象來解決上邊說的這些問題。

這兒有一個對使用scikit-learn進行線性回歸進行概述的資料(原文中說是視頻,但打開連結看了一下是這個庫的使用文檔,故直接翻譯為了資料)

http://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LinearRegression.html#sklearn.linear_model.LinearRegression

還有一篇很好的文章供大家查看。

https://towardsdatascience.com/simple-and-multiple-linear-regression-in-python-c928425168f9?gi=69160943145f

但本文要介紹的不僅僅是一個簡單的線性擬合,請大家接著往下看。(原文有一句提到代碼在作者的GitHub,但是發現連結已經404,所以沒加)

我們從引入scikit-learn中相關的包開始:

 

from sklearn.cross_validation#引入函數進行訓練集和測試集的劃分

import train_test_split

#引入函數自動生成多項式特徵

from sklearn.preprocessing import PolynomialFeatures

# 引入線性回歸和一個正則化的回歸函數

from sklearn.linear_model import LinearRegression

from sklearn.linear_model import LassoCV

from sklearn.pipeline import make_pipeline

下面快速說明一下我們等會兒要用到的一些概念。

訓練/測試集劃分:表示將已有的單獨數據集劃分為兩個子集。其中一個(訓練集)用來建立模型,另外一個(測試集)用來評估模型的準確性和穩定性。這個步驟對任何一個機器學習任務來說都是必不可少的。經過處理,我們沒有用所有的數據建立出一個看似異常準確的模型。(因為模型接觸到所有的數據,當然會擬合的很好)這個模型通常在新數據(未知)數據上表現很差。

 

模型在測試集上的準確性比其在訓練集上的準確性更有說服力。這兒有一篇關於這個話題延伸的文章,有興趣的讀者可以看看。

https://towardsdatascience.com/train-test-split-and-cross-validation-in-python-80b61beca4b6

下面你會看到Google car的先驅Sebastion Thrun對這個概念的說法。

 

多項式特徵自動生成


Scikit-learn提供了一個從一組線性特徵中生成多項式特徵的方法。你需要做的就是傳入線性特徵列表,並指定希望生成的多項式項的最大階數。它還可以讓你選擇是生成所有交叉耦合項還是只生成主要特徵的階數。這裡有一個Python代碼進行演示。

http://scikit-learn.org/stable/auto_examples/linear_model/plot_polynomial_interpolation.html#sphx-glr-auto-examples-linear-model-plot-polynomial-interpolation-py

 

正則化回歸


正則化的重要性不言而喻,它是機器學習的一個中心概念。在建立線性模型時,最基本的想法是對模型的係數進行「懲罰」,使它們不會變得太大而過擬合數據(對噪聲數據過於敏感)。有兩個廣泛使用的正則化方法,其中我們要用的被稱為LASSO。下邊這篇文章對兩種正則化方法做了很好的概述。

https://www.analyticsvidhya.com/blog/2016/01/complete-tutorial-ridge-lasso-regression-python/

機器學習流水線

一個機器學習項目幾乎不會是單一的建模任務。它最常見的形式包括數據生成、數據清洗、數據轉換、模型擬合、交叉驗證、模型準確性評估和最終的部署。

列舉一些相關的學習資料如下:

https://www.quora.com/What-is-a-pipeline-and-baseline-in-machine-learning-algorithms

https://medium.com/@yanhann10/a-brief-view-of-machine-learning-pipeline-in-python-5f50b941fca8

https://www.oreilly.com/ideas/building-and-deploying-large-scale-machine-learning-pipelines

http://scikit-learn.org/stable/tutorial

/statistical_inference/putting_together.html

 

怎樣最終整合併建立一個穩健的模型?


在這裡,我們提供了一些代碼樣例,你可以對它進行修改,應用在你自己的數據集上。

# LASSO回歸的參數設置

lasso_eps = 0.0001

lasso_nalpha=20

lasso_iter=5000

 

# 多項式特徵項的最大、最小階數

degree_min = 2

degree_max = 8

 

# 訓練集、測試集劃分

X_train, X_test, y_train, y_test =

train_test_split(df['X'], df['y'],test_size=test_set_fraction)

 

# 建立一個流水線模型

for degree in range(degree_min,degree_max+1):

    model=make_pipeline(PolynomialFeatures(degree, interaction_only=False),LassoCV(eps=lasso_eps,

n_alphas=lasso_nalpha,max_iter=lasso_iter,

normalize=True,cv=5))

    model.fit(X_train,y_train)

    test_pred = np.array(model.predict(X_test))

    RMSE=np.sqrt(np.sum(np.square(test_pred-y_test)))

    test_score = model.score(X_test,y_test)

不過這些冷冰冰的代碼是給機器看的,我們還準備了有詳細注釋的版本。

為了進一步提煉它,下面是更精簡的流程圖:

為了進一步提煉它,下面是更精簡的流程圖:

讓我們來討論討論結果

對於所有的模型,我們給出了測試誤差、訓練誤差(均方根)還有R²係數作為模型準確性的度量。然後把它們畫出來:

這些圖回答了最早提出的兩個問題。

可以看出,我們需要四階和五階的多項式項來進行擬合。線性、二次甚至三次模型對這個數據來說都不夠複雜。

同時,我們也沒必要使階數超過5,這會使得模型過於複雜。


等等!問題來了:在這條曲線中,我們熟悉的表現出偏差和方差之間權衡(即過擬合與欠擬合)的形狀在哪?為什麼測試誤差沒有隨著模型複雜度的增加急劇升高?

 

答案在於,使用LASSO回歸之後,我們基本消除了複雜模型中的高階項。對於更細節的東西,比如這個結果到底是怎麼出現的,可以參考這篇文章。

https://dataorigami.net/blogs/napkin-folding/79033923-least-squares-regression-with-l1-penalty

實際上,這正是LASSO回歸和L1正則的關鍵優勢之一,它不是僅僅將模型中的部分係數減小,而是將它們直接變為零。這相當於提供了「自動特徵選擇」的功能。即便你一開始使用了很複雜的模型來擬合數據,經過這種處理後,也可以讓那些不重要的特徵自動被忽略。

 

為了進行對比,我們這次不做正則化處理,並且使用一個簡單的線性模型來擬合數據。下邊是得出的結果。這次可以看到那條熟悉的偏差/方差權衡曲線了(補充:表示訓練誤差及測試誤差隨著模型複雜度增長的變化,體現過擬合及欠擬合)

噪聲數據會發生什麼?


(這裡作者有提到自己的代碼,同樣因為GitHub地址失效沒有加進來)

數據中的噪聲會讓模型很難變得準確,甚至還會產生過擬合。因為模型會試圖解釋噪聲,而不是發掘真正的模式。基本上,簡單的線性回歸模型在這種情況下都會失敗,而正則化模型仍然表現良好。不過即便這樣,在模型足夠複雜時,過擬合現象也會現出端倪。

下面是總結:

結語

 

簡而言之,本文討論了一個擬合多變量回歸模型的方法,它適用於高度非線性、具有耦合項並且含有噪聲的數據集。我們知道了如何利用Python的機器學習庫來生成多項式特徵、對數據進行正則化處理,防止模型中的係數變得過大、畫圖來評估模型的準確性及穩定性等。

 

對於更高級的具有非多項式特徵的模型,你可以看看sklearn中關於核回歸或支持向量機的內容。還有這篇文章有對高斯核回歸的介紹。

http://mccormickml.com/2014/02/26/kernel-regression/

如果你有任何問題或者看法要分享,

可以點這裡給作者發郵件。(mailto:tirthajyoti@gmail.com)

原文連結:

https://www.codementor.io/tirthajyotisarkar/machine-learning-with-python-easy-and-robust-method-to-fit-nonlinear-data-hfgyw7i4f#how-to-decide-the-order-of-polynomial-and-related-dilemma

譯者簡介:張逸,中國傳媒大學大三在讀,主修數字媒體技術。對數據科學充滿好奇,感慨於它創造出來的新世界。目前正在摸索和學習中,希望自己勇敢又熱烈,學最有意思的知識,交最志同道合的朋友。

END

版權聲明:本號內容部分來自網際網路,轉載請註明原文連結和作者,如有侵權或出處有誤請和我們聯繫。

關聯閱讀:

相關焦點

  • 使用Python進行機器學習的假設檢驗(附代碼)
    大數據文摘授權轉載自數據派THU來源:medium編譯:張睿毅、張一豪也許所有機器學習的初學者我將簡要介紹一下這個當我學習時給我帶來了麻煩的主題。我把所有這些概念放在一起,並使用python進行示例。在我尋求更廣泛的事情之前要考慮一些問題 ——什麼是假設檢驗?我們為什麼用它?什麼是假設的基本條件?什麼是假設檢驗的重要參數?讓我們一個個地開始吧!假設檢驗是一種統計方法,用於使用實驗數據進行統計決策。
  • B站最強學習資源匯總(Python,數據科學,機器學習)
    需要視頻配套資料的可以看看這裡https://zhuanlan.zhihu.com/p/84214338這是國內黃博士為吳老師課程配的全套資料,包括視頻字幕,對應python代碼,原版PPT,中文版筆記等等https://www.bilibili.com/video/av12463015/課程介紹:臺灣大學林軒田老師的《機器學習基石》課程由淺入深、內容全面,基本涵蓋了機器學習領域的很多方面。
  • 獨家|使用Python進行機器學習的假設檢驗(附連結&代碼)
    也許所有機器學習的初學者,或者中級水平的學生,或者統計專業的學生,都聽說過這個術語,假設檢驗。我將簡要介紹一下這個當我學習時給我帶來了麻煩的主題。我把所有這些概念放在一起,並使用python進行示例。什麼是假設檢驗?我們為什麼用它?什麼是假設的基本條件?
  • 用Python 做機器學習不得不收藏的重要庫
    -82a9ada57aeb 用 Python 做機器學習不得不收藏的重要庫 一組健壯的庫可以使開發人員更容易執行複雜的任務,而無需重寫許多代碼。 機器學習很大程度上是基於數學。具體來說就是數學優化、統計和概率。Python庫幫助那些不具備開發人員知識的研究人員/數學家輕鬆地「進行機器學習」。
  • 帶你用深度學習虛擬機進行文本遷移學習(附代碼)
    動機現代機器學習模型,尤其是深度神經網絡,通常可以從遷移學習中顯著受益。在計算機視覺中,在大型圖像分類數據集(如ImageNet)上訓練的深卷積神經網絡已被證明對初始化其他視覺任務(如物體檢測)模型非常有用(Zeiler和Fergus,2014)。但是,我們如何文本上應用遷移學習技術?
  • 教你用PyTorch實現「看圖說話」(附代碼、學習資源)
    本文用淺顯易懂的方式解釋了什麼是「看圖說話」(Image Captioning),藉助github上的PyTorch代碼帶領大家自己做一個模型,並附帶了很多相關的學習資源。介紹深度學習目前是一個非常活躍的領域---每天都會有許多應用出現。
  • 吳恩達機器學習課程:完全用Python完成,可以的!(附代碼)
    「吳恩達的Coursera機器學習課程可以完全用Python完成!」昨天,Reddit論壇的機器學習看板出現這樣一條熱帖。可以說,吳恩達(Andrew Ng)的機器學習課程是很多人、尤其是中國學生進入機器學習世界的引路人,被認為是入門機器學習的最好課程。截至目前,有超過80000人在Coursera上完成了這門課的學習。
  • 49個Python 學習必備資源,附連結 | 收藏
    本文為不同階段的Python學習者從不同角度量身定製了49個學習資源。
  • 只需十四步:從零開始掌握Python機器學習(附資源)
    參與:黃小天、吳攀、晏奇、蔣思源Python 可以說是現在最流行的機器學習語言,而且你也能在網上找到大量的資源。本教程的目的是幫助幾乎沒有 Python 機器學習背景的新手成長為知識淵博的實踐者,而且這個過程中僅需要使用免費的材料和資源即可。這個大綱的主要目標是帶你了解那些數量繁多的可用資源。毫無疑問,資源確實有很多,但哪些才是最好的呢?哪些是互補的呢?以怎樣的順序學習這些資源才是最合適的呢?
  • Stacking 模型融合詳解(附python代碼)
    在集成學習器當中,個體學習器都相同,那麼這些個體學習器可以叫做「基學習器」。  個體學習器組合在一起形成的集成學習,常常能夠使得泛化性能提高,這對於「弱學習器」的提高尤為明顯。弱學習器指的是比隨機猜想要好一些的學習器。  在進行集成學習的時候,我們希望我們的基學習器應該是好而不同,這個思想在後面經常體現。
  • 從機器學習到放射學,這個學習工具鏈助你起步!
    全文共5029字,預計學習時長10分鐘想用機器學習的方法了解放射學嗎?這可不是件容易的事情。深度學習,TensorFlow,Scikit-Learn,Keras,Pandas,Python還有Anaconda,這麼多的新術語讓人頭暈眼花。在正式學習開始前,需要先掌握這些讓人目不暇接又相對基礎的信息。大量的網絡資源還有書籍資源可以幫助我們更好地入手。不過,在開始學習各類優秀教程之前,最好對整個生態有所了解。
  • 資源|用Python和NumPy學習《深度學習》中的線性代數基礎
    本文系巴黎高等師範學院在讀博士 Hadrien Jean 的一篇基礎學習博客,其目的是幫助初學者/高級初學者基於深度學習和機器學習來掌握線性代數的概念。掌握這些技能可以提高你理解和應用各種數據科學算法的能力。
  • 值得收藏的45個Python優質資源(附連結)
    熱門資源博客 Mybridge AI 比較了18000個關於Python的項目,並從中精選出45個最具競爭力的項目。我們進行了翻譯,在此一併送上。這份清單中包括了各不相同的20個主題,以及一些資深程式設計師分享使用Python的經驗,值得收藏。Mybridge AI 的排名結合了內部機器評估的內容質量和各種人為因素,包括閱讀次數和閱讀時長等。
  • 資源|李宏毅中文《機器學習/深度學習》2019上線(附ppt及視頻分享)
    他的研究方向主要是機器學習(深度學習)和語音識別。課程目錄和截圖回歸、梯度下降誤差來源、分類、邏輯回歸深度學習、反向傳播、異常檢測CNN、Keras、對抗性攻擊訓練深度模型、可解釋 AIRNN、Order LSTMEnsemble半監督式學習、遷移學習、終身學習元學習seq2seq、Transformer
  • 想入門機器學習?機器之心為你準備了一份中文資源合集
    機器之心整理參與:機器之心編輯部機器學習日益廣為人知,越來越多的計算機科學家和工程師投身其中。不幸的是,理論、算法、應用、論文、書籍、視頻等信息如此之多,很容易讓初學者迷失其中,不清楚如何才能提升技能。本文作者依據自身經驗給出了一套快速上手的可行方法及學習資源的分類匯總,機器之心在其基礎上做了增益,希望對讀者有所幫助。
  • 強烈推薦,B站最強學習資源匯總(數據科學,機器學習,python)
    需要視頻配套資料的可以看看這裡https://zhuanlan.zhihu.com/p/84214338這是國內黃博士為吳老師課程配的全套資料,包括視頻字幕,對應python代碼,原版PPT,中文版筆記等等https://www.bilibili.com/video/av12463015/課程介紹:臺灣大學林軒田老師的《機器學習基石》課程由淺入深、內容全面,基本涵蓋了機器學習領域的很多方面。
  • B站最強學習資源匯總(數據科學,機器學習,Python)
    需要視頻配套資料的可以看看這裡https://zhuanlan.zhihu.com/p/84214338這是國內黃博士為吳老師課程配的全套資料,包括視頻字幕,對應python代碼,原版PPT,中文版筆記等等https://www.bilibili.com/video/av12463015/課程介紹:臺灣大學林軒田老師的《機器學習基石》課程由淺入深、內容全面,基本涵蓋了機器學習領域的很多方面。
  • 吐血推薦,B站最強學習資源匯總(數據科學,機器學習,python)
    需要視頻配套資料的可以看看這裡https://zhuanlan.zhihu.com/p/84214338這是國內黃博士為吳老師課程配的全套資料,包括視頻字幕,對應python代碼,原版PPT,中文版筆記等等https://www.bilibili.com/video/av12463015/課程介紹:臺灣大學林軒田老師的《機器學習基石》課程由淺入深、內容全面,基本涵蓋了機器學習領域的很多方面。
  • 吐血推薦,B站最強學習資源匯總(數據科學,機器學習,Python)
    https://zhuanlan.zhihu.com/p/84214338 這是國內黃博士為吳老師課程配的全套資料,包括視頻字幕,對應python代碼,原版PPT,中文版筆記等等。Scikit-learn (sklearn) 優雅地學會機器學習 (莫煩 Python 教程)https://www.bilibili.com/video/av17003173課程介紹:莫煩的機器學習教程匯集了很多近些年來比較流行的 python 模塊教程。課程內容有趣,沒有機器學習背景的朋友們也能產生興趣,對機器學習的每種方法都能迅速理解。
  • 如何在疫情期間高效學習!附SQL/Python系統學習途徑
    這個是很多coding課上提倡的,找一個和你基礎差不多的人一起寫代碼作業,大家的強弱在不同的地方可以互相彌補,(而且兩個人一起為代碼痛苦比自己一個人為代碼痛苦要幸福的多),以我自己為例,如果是我自己寫作業,周五截止,我通常周三才開始寫,但是如果是pair coding,我們通常從周日就約好每天(online)見面一起寫coding...自己一個人就會想一直拖延..3.