旗下產(chǎn)業(yè): A產(chǎn)業(yè)/?A實習/?A計劃
全國統(tǒng)一咨詢熱線:010-5367 2995
首頁 > 熱門文章 > 大數(shù)據(jù)分析 > 如何使用Python構(gòu)建機器學(xué)習模型

如何使用Python構(gòu)建機器學(xué)習模型

時間:2020-09-26來源:lb577.com點擊量:作者:Sissi
時間:2020-09-26點擊量:作者:Sissi



  在構(gòu)建機器學(xué)習模型時,我們希望將誤差保持在盡可能低的水平。對于任何打算學(xué)習Python進行大數(shù)據(jù)分析的人來說,這都是一項關(guān)鍵技能。誤差的兩個主要來源是偏差和方差。如果我們設(shè)法減少這兩個,那么我們可以建立更準確的模型。
 

  但是,我們?nèi)绾问紫仍\斷偏差和方差?當我們檢測到某些東西時應(yīng)該采取什么行動?
 

  在如何使用Python構(gòu)建機器學(xué)習模型中,我們將學(xué)習如何使用學(xué)習曲線來回答這兩個問題。我們將使用現(xiàn)實世界的數(shù)據(jù)集,并嘗試預(yù)測電廠的電能輸出。
 

  假定你對scikit學(xué)習和機器學(xué)習理論有所了解。如果在我說交叉驗證或監(jiān)督學(xué)習時你不皺眉,那么你就很好了。如果你是機器學(xué)習的新手,并且從未嘗試過scikit,那么如何使用Python構(gòu)建機器學(xué)習模型是一個不錯的起點。
 

  我們首先簡要介紹偏差和方差。
 

  偏差方差的權(quán)衡
 

  在監(jiān)督學(xué)習中,我們假設(shè)特征與目標之間存在真實關(guān)系,并使用模型估算這種未知關(guān)系。如果假設(shè)是正確的,那么確實存在一個模型,我們將其稱為\(f \),該模型可以完美描述要素與目標之間的關(guān)系。
 

  實際上,\(f \)幾乎總是完全未知,我們嘗試使用模型\(\ hat {f} \)對其進行估計(注意\(f \)和\(\ hat之間的符號略有不同{F}\))。我們使用特定的訓(xùn)練集并獲得特定的 \(\ hat {f} \)。如果我們使用不同的訓(xùn)練集,我們很可能會得到不同的\(\ hat {f} \)。隨著我們不斷更改訓(xùn)練集,我們得到\(\ hat {f} \)的不同輸出。\(\ hat {f} \)隨著我們更改訓(xùn)練集而變化的量稱為方差。
 

  要估算真實的\(f \),我們使用不同的方法,例如線性回歸或隨機森林。例如,線性回歸假設(shè)特征和目標之間是線性的。但是,對于大多數(shù)現(xiàn)實生活場景而言,要素與目標之間的真實關(guān)系非常復(fù)雜,而且并非線性關(guān)系。簡化的假設(shè)會使模型產(chǎn)生偏差。關(guān)于真實關(guān)系的假設(shè)越錯誤,偏差就越大,反之亦然。
 

  通常,對某些測試數(shù)據(jù)進行測試時,模型\(\ hat {f} \)會出現(xiàn)一些錯誤。從數(shù)學(xué)上可以證明,偏差和方差都只會增加模型的誤差。我們希望誤差很小,因此我們需要將偏差和方差保持在最小。但是,這不太可能。偏差和方差之間需要權(quán)衡。
 

  低偏方法非常適合訓(xùn)練數(shù)據(jù)。如果我們更改訓(xùn)練集,我們將獲得截然不同的模型\(\ hat {f} \)。

如何使用Python構(gòu)建機器學(xué)習模型
 

  你可以看到,低偏差方法可以捕獲不同訓(xùn)練集之間的大多數(shù)差異(甚至較小的差異)。\(\ hat {f} \)隨我們更改訓(xùn)練集而變化很大,這表明差異很大。
 

  方法的偏見程度越小,其數(shù)據(jù)擬合能力越強。此能力越大,方差越大。因此,偏差越小,方差越大。
 

  反之亦成立:偏差越大,方差越小。高偏差方法會建立簡單的模型,這些模型通常不適合訓(xùn)練數(shù)據(jù)。當我們更改訓(xùn)練集時,通常從高偏置算法獲得的模型\(\ hat {f} \)彼此之間并沒有太大差異。

如何使用Python構(gòu)建機器學(xué)習模型
 

  如果在更改訓(xùn)練集時\(\ hat {f} \)的變化不大,則方差很小,這證明了我們的觀點:偏差越大,方差越小。
 

  從數(shù)學(xué)上講,很明顯為什么我們要低偏差和低方差。如上所述,偏差和方差只會增加模型的誤差。但是,從更直觀的角度來看,我們希望低偏差以避免構(gòu)建過于簡單的模型。在大多數(shù)情況下,簡單的模型在訓(xùn)練數(shù)據(jù)上的表現(xiàn)不佳,并且極有可能在測試數(shù)據(jù)上重復(fù)表現(xiàn)不佳的情況。
 

  同樣,我們希望方差較小,以避免構(gòu)建過于復(fù)雜的模型。這樣的模型幾乎完全適合訓(xùn)練集中的所有數(shù)據(jù)點。但是,訓(xùn)練數(shù)據(jù)通常包含噪聲,僅是來自大量人口的樣本。過于復(fù)雜的模型會捕獲該噪聲。當對樣本外數(shù)據(jù)進行測試時,性能通常很差。那是因為模型對樣本訓(xùn)練數(shù)據(jù)的學(xué)習太好了。它對某事了解很多,而對其他事情則一無所知。
 

  但是實際上,我們需要權(quán)衡取舍。我們不能同時擁有低偏見和低方差,因此我們希望瞄準中間的東西。

如何使用Python構(gòu)建機器學(xué)習模型
 

  當我們在下面生成和解釋學(xué)習曲線時,我們將嘗試為此折衷建立一些實用的直覺。
 

  學(xué)習曲線–基本思想
 

  假設(shè)我們有一些數(shù)據(jù),并將其分為訓(xùn)練集和驗證集。我們從訓(xùn)練集中獲取一個實例(是的,一個!),并使用它來估計模型。然后,我們在驗證集和單個訓(xùn)練實例上測量模型的誤差。訓(xùn)練實例上的錯誤將為0,因為完美擬合單個數(shù)據(jù)點非常容易。但是,驗證集上的錯誤將非常大。
 

  這是因為該模型是圍繞單個實例構(gòu)建的,并且?guī)缀蹩梢钥隙ǖ氖?,該模型無法準確地概括以前未見過的數(shù)據(jù)。現(xiàn)在讓我們說,代替一個訓(xùn)練實例,我們?nèi)∈畟€并重復(fù)誤差測量。然后我們需要五十,一百,五百,直到我們使用了整個訓(xùn)練集。當我們更改訓(xùn)練集時,錯誤分數(shù)或多或少會有所不同。因此,我們需要監(jiān)控兩個錯誤評分:一個用于驗證集,一個用于訓(xùn)練集。如果我們繪制兩個誤差分數(shù)隨訓(xùn)練集的變化而變化的演變,我們將得到兩條曲線。這些稱為學(xué)習曲線。簡而言之,學(xué)習曲線顯示了錯誤隨著訓(xùn)練集大小的增加而如何變化。
 

  下圖應(yīng)幫助你可視化到目前為止描述的過程。在訓(xùn)練集列上,你可以看到我們不斷增加訓(xùn)練集的大小。這會導(dǎo)致我們的模型\(\ hat {f} \)稍有變化。在第一行,其中n = 1(n是訓(xùn)練實例的數(shù)量),該模型非常適合單個訓(xùn)練數(shù)據(jù)點。但是,完全相同的模型非常適合20個不同數(shù)據(jù)點的驗證集。因此,模型的訓(xùn)練集誤差為0,而驗證集的誤差更高。隨著我們增加訓(xùn)練集的大小,模型不再能夠完美地適合訓(xùn)練集。因此訓(xùn)練誤差變得更大。但是,該模型接受了更多數(shù)據(jù)的訓(xùn)練,因此可以更好地擬合驗證集。因此,驗證誤差減小。提醒你,在所有三種情況下,驗證集均保持不變。

如何使用Python構(gòu)建機器學(xué)習模型
 

  如果我們繪制每種訓(xùn)練量的錯誤分數(shù),我們將獲得兩條與這些相似的學(xué)習曲線:

如何使用Python構(gòu)建機器學(xué)習模型
 

  學(xué)習曲線為我們提供了在監(jiān)督學(xué)習模型中診斷偏差和方差的機會。我們將在接下來的內(nèi)容中看到這種可能性。
 

  數(shù)據(jù)介紹
 

  上面繪制的學(xué)習曲線已理想用于教學(xué)目的。但是,實際上,它們通常看起來大不相同。因此,讓我們通過使用一些實際數(shù)據(jù)在實際環(huán)境中進行討論。我們將嘗試建立回歸模型來預(yù)測電廠的每小時電能輸出。我們使用的數(shù)據(jù)來自土耳其研究人員P?narTüfekci和Heysem Kaya,可以從此處下載。由于數(shù)據(jù)存儲在.xlsx文件中,因此我們使用pandas read_excel() 函數(shù)讀取數(shù)據(jù):

如何使用Python構(gòu)建機器學(xué)習模型
 

  讓我們快速解讀每個列名稱:

如何使用Python構(gòu)建機器學(xué)習模型
 

  該PE列是目標變量,它描述了每小時的凈電能輸出。所有其他變量都是潛在特征,每個變量的值實際上是每小時平均值(不是凈值,例如PE)。電力由燃氣輪機,蒸汽輪機和熱回收蒸汽發(fā)生器產(chǎn)生。根據(jù)數(shù)據(jù)集的文檔,真空度會影響蒸汽輪機,而其他三個變量會影響燃氣輪機。因此,我們將在回歸模型中使用所有特征列。在這一步中,我們通常會放置一個測試集,徹底探究訓(xùn)練數(shù)據(jù),刪除任何異常值,測量相關(guān)性等。但是,出于教學(xué)目的,我們假設(shè)已經(jīng)完成并直接跳出一些學(xué)習曲線。在開始之前,需要注意的是沒有缺失的值。同樣,數(shù)字是未縮放的,但我們將避免使用無法縮放數(shù)據(jù)的模型。
 

  確定訓(xùn)練集的大小
 

  首先讓我們決定我們要用于生成學(xué)習曲線的訓(xùn)練集大小。最小值為1。最大值由訓(xùn)練集中的實例數(shù)給出。我們的訓(xùn)練集有9568個實例,因此最大值為9568。但是,我們尚未預(yù)留驗證集。我們將使用80:20的比例進行此操作,最后得到7654個實例的訓(xùn)練集(80%)和1914個實例的驗證集(20%)。假設(shè)我們的訓(xùn)練集將有7654個實例,則可用于生成學(xué)習曲線的最大值為7654。對于我們的情況,在這里,我們使用以下六個大?。?/p>

如何使用Python構(gòu)建機器學(xué)習模型
 

  要意識到的重要一點是,對于每個指定的大小,都會訓(xùn)練一個新模型。如果你正在使用交叉驗證(我們將在如何使用Python構(gòu)建機器學(xué)習模型中進行此操作),則將針對每種訓(xùn)練大小訓(xùn)練k個模型(其中k由用于交叉驗證的折疊數(shù)給出)。為了節(jié)省代碼運行時間,最好將自己限制為5至10個培訓(xùn)大小。
 

  scikit-learn中的learning_curve()函數(shù)
 

  我們將使用scikit-learn庫中的learning_curve() 函數(shù)為回歸模型生成學(xué)習曲線。我們沒有必要將驗證集放在一邊,因為這learning_curve()會解決這個問題。在下面的代碼單元中,我們:
 

  1)從進行所需的進口sklearn。

  2)聲明功能和目標。

  3)使用learning_curve()生成繪制學(xué)習曲線所需的數(shù)據(jù)。該函數(shù)返回一個包含三個元素的元組:訓(xùn)練集大小,以及驗證集和訓(xùn)練集上的錯誤分數(shù)。在函數(shù)內(nèi)部,我們使用以下參數(shù):

  a)estimator —表示我們用于估算真實模型的學(xué)習算法;

  b)X —包含要素的數(shù)據(jù);

  c)y —包含目標的數(shù)據(jù);

  d)train_sizes —指定要使用的訓(xùn)練集大小;

  e)cv —確定交叉驗證拆分策略(我們將立即討論);

  f)scoring—指示要使用的錯誤度量;目的是使用均方誤差(MSE)度量,但這不是的可能參數(shù)scoring;我們將使用最接近的代理服務(wù)器(負MSE),并且稍后只需要翻轉(zhuǎn)標志即可。

如何使用Python構(gòu)建機器學(xué)習模型
 

  我們已經(jīng)知道里面有什么train_sizes。讓我們檢查其他兩個變量以查看learning_curve()返回的結(jié)果:

如何使用Python構(gòu)建機器學(xué)習模型
 

  由于我們指定了六個訓(xùn)練集大小,因此你可能希望每種分數(shù)都有六個值。相反,我們每行有六行,每行有五個錯誤分數(shù)。發(fā)生這種情況是因為learning_curve()在k后臺運行了-fold交叉驗證,其中的值k由我們?yōu)閏v參數(shù)指定的值給出。在我們的示例中,cv = 5將有五個拆分。對于每個分割,針對指定的每個訓(xùn)練集大小訓(xùn)練一個估計量。上面兩個數(shù)組中的每一列都指定一個拆分,每一行對應(yīng)一個測試大小。下表是訓(xùn)練錯誤分數(shù)的表格,可幫助你更好地了解過程:

如何使用Python構(gòu)建機器學(xué)習模型
 

  要繪制學(xué)習曲線,我們只需要每個訓(xùn)練集大小的單個錯誤評分,而不是5。因此,在下一個代碼單元中,我們?nèi)∶恳恍械钠骄担⒎D(zhuǎn)錯誤評分的符號(如前所述)以上)。

如何使用Python構(gòu)建機器學(xué)習模型
 

  現(xiàn)在,我們擁有繪制學(xué)習曲線所需的所有數(shù)據(jù)。但是,在進行繪制之前,我們需要停下來并進行重要觀察。你可能已經(jīng)注意到,訓(xùn)練集上的某些錯誤分數(shù)是相同的。對于對應(yīng)于訓(xùn)練集大小為1的行,這是預(yù)期的,但是其他行呢?除了最后一行,我們有很多相同的值。例如,取第二行,從第二個分割開始,我們具有相同的值。為什么?這是由于未對每個分組隨機分配訓(xùn)練數(shù)據(jù)引起的。讓我們借助下圖瀏覽一個示例。當訓(xùn)練大小為500時,將選擇訓(xùn)練集中的前500個實例。
 

  對于第一次拆分,將從第二個塊中獲取這500個實例。從第二個分割開始,這500個實例將從第一塊中取出。因為我們沒有隨機化訓(xùn)練集,所以用于第二次分割的500個訓(xùn)練實例是相同的。這說明了從500次訓(xùn)練實例情況的第二次分割開始的相同值。相同的推理適用于100個實例情況,類似的推理適用于其他情況。

如何使用Python構(gòu)建機器學(xué)習模型
 

  要停止這種行為,我們需要在函數(shù)中將shuffle參數(shù)設(shè)置為。這將使每個分組的訓(xùn)練數(shù)據(jù)的索引隨機化。由于以下兩個原因,我們尚未進行隨機分組:Truelearning_curve()
 

  1)數(shù)據(jù)經(jīng)過了五次預(yù)混洗(如文檔中所述),因此不再需要隨機化。

  2)我想讓你知道這個怪癖,以防你在實踐中偶然發(fā)現(xiàn)它。
 

  最后,讓我們作圖。
 

  學(xué)習曲線–高偏差和低方差
 

  我們使用常規(guī)的matplotlib工作流程繪制學(xué)習曲線:

如何使用Python構(gòu)建機器學(xué)習模型
如何使用Python構(gòu)建機器學(xué)習模型
 

  我們可以從該圖中提取很多信息。讓我們繼續(xù)進行。當訓(xùn)練集大小為1時,我們可以看到訓(xùn)練集的MSE為0。這是正常現(xiàn)象,因為該模型完全適合單個數(shù)據(jù)點時沒有問題。因此,當在同一數(shù)據(jù)點上進行測試時,預(yù)測是完美的。但是,當在驗證集(具有1914個實例)上進行測試時,MSE會猛增至大約423.4。此相對較高的值是我們將y軸范圍限制在0到40之間的原因。這使我們能夠精確讀取大多數(shù)MSE值。預(yù)期會有如此之高的價值,因為在單個數(shù)據(jù)點上訓(xùn)練的模型不太可能能夠準確地推廣到訓(xùn)練中未見的1914個新實例。當訓(xùn)練集大小增加到100時,訓(xùn)練MSE急劇增加,
 

  線性回歸模型無法完美預(yù)測所有100個訓(xùn)練點,因此訓(xùn)練MSE大于0。但是,由于使用更多數(shù)據(jù)進行估算,該模型現(xiàn)在在驗證集上的表現(xiàn)要好得多。從500個訓(xùn)練數(shù)據(jù)點開始,驗證MSE大致保持不變。這告訴我們一些非常重要的事情:添加更多的訓(xùn)練數(shù)據(jù)點不會導(dǎo)致明顯更好的模型。因此,除了浪費時間(可能是金錢)來收集更多數(shù)據(jù)之外,我們還需要嘗試其他事情,例如切換到可以構(gòu)建更復(fù)雜模型的算法。

如何使用Python構(gòu)建機器學(xué)習模型
 

  為了避免在這里產(chǎn)生誤解,請務(wù)必注意,真正無濟于事的是向訓(xùn)練數(shù)據(jù)中添加更多實例(行)。但是,添加更多功能是另一回事,并且很有可能會有所幫助,因為這將增加當前模型的復(fù)雜性?,F(xiàn)在讓我們開始診斷偏差和方差。偏差問題的主要指標是較高的驗證誤差。在我們的案例中,驗證MSE停滯在大約20的值。但是,這有多好?我們將從某些領(lǐng)域的知識(在這種情況下可能是物理或工程學(xué))中受益來回答這個問題,但讓我們嘗試一下。
 

  從技術(shù)上講,該值20具有MW \(^ 2 \)(兆瓦平方)作為單位(當我們計算MSE時,單位也將平方)。但是我們的目標列中的值以MW為單位(根據(jù)文檔)。取20 MW \(^ 2 \)的平方根可得出大約4.5 MW。每個目標值代表每小時凈輸出電能。因此,每小時我們的模型平均減少4.5 MW。根據(jù)Quora的回答,4.5 MW相當于4500臺手持式吹風機產(chǎn)生的熱能。如果我們試圖預(yù)測一天或更長時間的總能量輸出,這將加起來。我們可以得出結(jié)論,MSE為20 MW \(^ 2 \)很大。因此我們的模型存在偏差問題。
 

  但這是低偏差問題還是高偏差問題?為了找到答案,我們需要查看訓(xùn)練錯誤。如果訓(xùn)練誤差非常低,則意味著訓(xùn)練數(shù)據(jù)非常適合估計模型。如果模型非常適合訓(xùn)練數(shù)據(jù),則意味著該模型相對于該組數(shù)據(jù)具有較低的偏差。如果訓(xùn)練誤差高,則意味著估計模型無法很好地擬合訓(xùn)練數(shù)據(jù)。如果模型不能很好地擬合訓(xùn)練數(shù)據(jù),則意味著它對該數(shù)據(jù)集有很高的偏見。

如何使用Python構(gòu)建機器學(xué)習模型
 

  在我們的特定情況下,訓(xùn)練的MSE穩(wěn)定在大約20 MW \(^ 2 \)的值。正如我們已經(jīng)確定的那樣,這是一個很高的錯誤評分。因為驗證MSE高,并且訓(xùn)練MSE也高,所以我們的模型存在高偏差問題。現(xiàn)在讓我們開始診斷最終的方差問題。估計方差可以通過至少兩種方式完成:
 

  1)通過檢查驗證學(xué)習曲線和訓(xùn)練學(xué)習曲線之間的差距。

  2)通過檢查訓(xùn)練錯誤:隨著訓(xùn)練集大小的增加,它的價值及其演變。

如何使用Python構(gòu)建機器學(xué)習模型
 

  狹窄的差距表明低方差。通常,間隙越窄,方差越小。反之亦然:差距越大,差異越大。現(xiàn)在讓我們解釋為什么會這樣。正如我們之前討論的,如果方差很大,則該模型非常適合訓(xùn)練數(shù)據(jù)。當訓(xùn)練數(shù)據(jù)擬合得太好時,模型將難以推廣訓(xùn)練中未見的數(shù)據(jù)。當在訓(xùn)練集上然后在驗證集上測試這種模型時,訓(xùn)練誤差將很低,并且驗證誤差通常會很高。隨著我們更改訓(xùn)練集大小,這種模式將繼續(xù),并且訓(xùn)練和驗證錯誤之間的差異將確定兩條學(xué)習曲線之間的差距。
 

  訓(xùn)練和驗證錯誤之間的關(guān)系以及差距可以用以下方式總結(jié):\(差距=驗證\錯誤–訓(xùn)練\錯誤\)因此,兩個錯誤之間的差異越大,差距就越大。差距越大,差異越大。在我們的情況下,差距非常狹窄,因此我們可以安全地得出結(jié)論,方差很小。訓(xùn)練有素的 MSE分數(shù)高也是檢測低方差的快速方法。如果學(xué)習算法的方差很小,那么當我們更改訓(xùn)練集時,該算法將提供簡單且相似的模型。由于模型過于簡單,他們甚至不能滿足訓(xùn)練數(shù)據(jù)以及(他們underfit數(shù)據(jù))。因此,我們應(yīng)該期待訓(xùn)練有素的MSE。因此,訓(xùn)練有素的MSE可用作低方差的指標。

如何使用Python構(gòu)建機器學(xué)習模型
 

  在我們的案例中,MSE訓(xùn)練的高峰期約為20,而我們已經(jīng)得出結(jié)論,這是很高的價值。因此,除了狹窄的差距之外,我們現(xiàn)在還有另一個確認,那就是我們有一個低方差問題。到目前為止,我們可以得出以下結(jié)論:
 

  1)我們的學(xué)習算法存在高偏差和低方差的問題,不適合訓(xùn)練數(shù)據(jù)。

  2)在當前的學(xué)習算法下,向訓(xùn)練數(shù)據(jù)中添加更多實例(行)的可能性極小,無法導(dǎo)致更好的模型。
 

  此時的一種解決方案是更改為更復(fù)雜的學(xué)習算法。這將減少偏差并增加方差。一個錯誤是嘗試增加訓(xùn)練實例的數(shù)量。通常,在解決高偏差和低方差問題時,這兩個其他修復(fù)程序也起作用:
 

  1)在更多特征上訓(xùn)練當前的學(xué)習算法(為避免收集新數(shù)據(jù),你可以輕松生成多項式特征)。這應(yīng)該通過增加模型的復(fù)雜性來降低偏差。

  2)如果是這樣的話,請 減少當前學(xué)習算法的規(guī)則化。簡而言之,正則化會阻止算法很好地擬合訓(xùn)練數(shù)據(jù)。如果減少正則化,則該模型將更好地擬合訓(xùn)練數(shù)據(jù),結(jié)果,方差將增加且偏差將減小。
 

  學(xué)習曲線–低偏差和高方差
 

  讓我們看看這里的非正規(guī)隨機森林回歸器的價格。我們將使用與上述相同的工作流程來生成學(xué)習曲線。這次,我們將所有內(nèi)容捆綁到一個函數(shù)中,以便以后使用。為了進行比較,我們還將顯示上面的線性回歸模型的學(xué)習曲線。

如何使用Python構(gòu)建機器學(xué)習模型
如何使用Python構(gòu)建機器學(xué)習模型
 

  現(xiàn)在,讓我們嘗試應(yīng)用剛剛學(xué)到的知識。最好暫時停止閱讀,然后嘗試自己解釋新的學(xué)習曲線。查看驗證曲線,我們可以看到我們已經(jīng)減少了偏差。仍然存在一些明顯的偏見,但沒有以前那么多。觀察訓(xùn)練曲線,我們可以推斷出這次存在一個低偏差問題。
 

  兩條學(xué)習曲線之間的新差距表明方差顯著增加。低訓(xùn)練水平的MSE證實了這種高方差的診斷。較大的差距和較低的訓(xùn)練誤差也表示過度擬合的問題。當模型在訓(xùn)練集上表現(xiàn)良好但在測試(或驗證)集上表現(xiàn)較差時,就會發(fā)生過度擬合。我們在這里可以得出的一個更重要的觀察結(jié)果是,添加新的訓(xùn)練實例很可能會產(chǎn)生更好的模型。驗證曲線不會穩(wěn)定在所使用的最大訓(xùn)練集大小上。它仍然有可能減小并收斂到訓(xùn)練曲線,類似于我們在線性回歸情況下看到的收斂。到目前為止,我們可以得出以下結(jié)論:
 

  1)我們的學(xué)習算法(隨機森林)具有較高的方差和相當?shù)偷钠睿虼诉^度擬合了訓(xùn)練數(shù)據(jù)。

  2)在當前的學(xué)習算法下,添加更多的訓(xùn)練實例很可能會導(dǎo)致更好的模型。
 

  在這一點上,我們可以做一些事情來改善我們的模型:
 

  1)添加更多的訓(xùn)練實例。

  2)增加我們當前學(xué)習算法的正則化。這將減少方差并增加偏差。

  3)減少我們當前使用的訓(xùn)練數(shù)據(jù)中的特征數(shù)量。該算法仍將很好地擬合訓(xùn)練數(shù)據(jù),但是由于特征數(shù)量的減少,它將建立較簡單的模型。這將增加偏差并減小方差。
 

  在我們的情況下,我們沒有任何其他隨時可用的數(shù)據(jù)。我們可以去電廠進行一些測量,但是我們將其保存在另一個帖子中(只是在開玩笑)。讓我們嘗試規(guī)范化我們的隨機森林算法。一種方法是調(diào)整每個決策樹中葉節(jié)點的最大數(shù)量。這可以通過使用max_leaf_nodes參數(shù)來完成RandomForestRegressor()。你不一定必須了解這種正則化技術(shù)。對于我們這里的目的,你需要關(guān)注的是這種正則化對學(xué)習曲線的影響。

如何使用Python構(gòu)建機器學(xué)習模型
如何使用Python構(gòu)建機器學(xué)習模型
 

  不錯!差距現(xiàn)在更窄了,因此變化也更少了。偏見似乎有所增加,這就是我們想要的。但是我們的工作還遠遠沒有結(jié)束!驗證的MSE仍顯示出很大的降低潛力。你可以為實現(xiàn)該目標而采取的一些步驟包括:
 

  1)添加更多的訓(xùn)練實例。

  2)添加更多功能。

  3)功能選擇。

  4)超參數(shù)優(yōu)化。
 

  理想的學(xué)習曲線和不可減少的誤差
 

  學(xué)習曲線是在機器學(xué)習工作流程的每個點快速檢查我們的模型的好工具。但是我們怎么知道什么時候停止?我們?nèi)绾巫R別完美的學(xué)習曲線?對于我們之前的回歸案例,你可能會認為理想的情況是兩條曲線都朝著MSE 0收斂。這確實是理想的情況,但不幸的是,這是不可能的。既沒有實踐,也沒有理論。這是由于某種不可減少的錯誤。當我們構(gòu)建模型以映射特征\(X \)與目標\(Y \)之間的關(guān)系時,我們假設(shè)首先存在這種關(guān)系。
 

  如果假設(shè)為真,則存在一個真實模型\(f \),該模型完美地描述了\(X \)和\(Y \)之間的關(guān)系,如下所示:
 

  $$
 

  Y = F(X)+束縛\錯誤\標簽{1}
 

  $$
 

  但是為什么會有錯誤呢?我們不是剛剛說\(f \)完美地描述了X和Y之間的關(guān)系嗎?出現(xiàn)錯誤是因為\(Y \)不僅是我們有限數(shù)量的功能\(X \)的函數(shù)??赡苓€有許多其他因素會影響\(Y \)的值。我們沒有的功能。\(X \)也可能包含測量錯誤。因此,除了\(X \),\(Y \)也是\(irreducible \ error \)的函數(shù)?,F(xiàn)在,讓我們解釋一下為什么該錯誤是不可減少的。當我們使用模型\(\ hat {f}(X)\)估算\(f(X)\)時,我們引入了另一種誤差,稱為可歸約誤差:
 

  $$
 

  f(X)= \ hat {f}(X)+可歸約\錯誤\ tag {2}
 

  $$
 

  將\(f(X)\)替換為\((1)\),我們得到:
 

  $
 

  Y = \ hat {f}(X)+可歸約\錯誤+不可約\錯誤\ tag {3}

 

  $$
 

  通過建立更好的模型可以減少可減少的誤差。查看方程\((2)\)我們可以看到,如果\(reducible \ error \)為0,則我們的估計模型\(\ hat {f}(X)\)等于真實模型\(f (X)\)。
 

  但是,從\((3)\)可以看出,即使\(reducible \ error \)為0,方程中也仍然存在\(irreducible \ error \)。由此得出的結(jié)論是,無論模型估算值多么好, ,通常仍然存在一些我們無法減少的錯誤。這就是為什么這個錯誤被認為是不可減少的。這告訴我們,在實踐中,我們可以看到的最佳學(xué)習曲線是收斂于某些不可減少誤差的值,而不是收斂于某些理想誤差值的曲線(對于MSE,理想誤差分數(shù)為0;我們將立即看到其他錯誤指標具有不同的理想錯誤

如何使用Python構(gòu)建機器學(xué)習模型
 

  實際上,不可減少誤差的確切值幾乎總是未知的。我們還假設(shè)不可約誤差與\(X \)無關(guān)。這意味著我們不能使用\(X \)來找到真正的不可約錯誤。用更精確的數(shù)學(xué)語言表達同一件事,沒有函數(shù)\(g \)映射\(X \)到不可約誤差的真實值:
 

  $$
 

  不可約\錯誤\ neq g(X)
 

  $$
 

  因此,無法根據(jù)我們擁有的數(shù)據(jù)知道不可減少誤差的真實值。在實踐中,一個好的解決方法是嘗試盡可能降低錯誤分數(shù),同時要記住,限制是由一些不可減少的錯誤所給定的。
 

  那分類呢?
 

  到目前為止,我們已經(jīng)了解了在回歸設(shè)置中學(xué)習曲線的知識。對于分類任務(wù),工作流程幾乎相同。主要區(qū)別在于,我們將不得不選擇另一種錯誤度量標準-一種適合評估分類器性能的度量標準。讓我們來看一個例子:

如何使用Python構(gòu)建機器學(xué)習模型
 

  與到目前為止我們所看到的不同,請注意,訓(xùn)練錯誤的學(xué)習曲線高于驗證錯誤的學(xué)習曲線。這是因為所使用的分數(shù)(準確性)描述了模型的良好程度。精度越高,越好。另一方面,MSE描述了模型的嚴重程度。MSE越低越好。這對于不可減少的錯誤也有影響。對于描述模型有多糟糕的錯誤度量標準,不可減少的錯誤給出了一個下限:你不能低于這個范圍。對于描述模型的好壞的度量指標,不可減少的誤差給出了一個上限:你無法獲得更高的誤差。在此附帶說明,在更多的技術(shù)著作中,術(shù)語貝葉斯錯誤率通常用于指代分類器的最佳錯誤評分。這個概念類似于不可減少的誤差。
 

  下一步
 

  學(xué)習曲線構(gòu)成了一種在任何監(jiān)督學(xué)習算法中診斷偏差和方差的好工具。我們已經(jīng)學(xué)習了如何使用scikit-learn和matplotlib生成它們,以及如何使用它們來診斷模型中的偏差和方差。為了鞏固你所學(xué)的內(nèi)容,請考慮以下一些步驟:
 

  1)使用不同的數(shù)據(jù)集為回歸任務(wù)生成學(xué)習曲線。

  2)生成分類任務(wù)的學(xué)習曲線。

  3)通過從頭開始編寫所有內(nèi)容來生成監(jiān)督學(xué)習任務(wù)的學(xué)習曲線(請勿learning_curve()從scikit-learn中使用)。使用交叉驗證是可選的。

  4)將沒有交叉驗證的學(xué)習曲線與使用交叉驗證的曲線進行比較。兩種曲線應(yīng)用于相同的學(xué)習算法。

 

預(yù)約申請免費試聽課

填寫下面表單即可預(yù)約申請免費試聽!怕錢不夠?可先就業(yè)掙錢后再付學(xué)費! 怕學(xué)不會?助教全程陪讀,隨時解惑!擔心就業(yè)?一地學(xué)習,可推薦就業(yè)!

?2007-2021/北京漫動者教育科技有限公司版權(quán)所有
備案號:京ICP備12034770號

?2007-2022/ lb577.com 北京漫動者數(shù)字科技有限公司 備案號: 京ICP備12034770號 監(jiān)督電話:010-53672995 郵箱:bjaaa@aaaedu.cc

京公網(wǎng)安備 11010802035704號

網(wǎng)站地圖