python基线计算法_从头开始:用Python实现基线机器学习算法
在預(yù)測建模時,確定基線性能(baseline performance)是很重要的。
基線為評估更高級的方法提供了比較的標(biāo)準(zhǔn)。
在本教程中,你將了解如何在 Python 中實現(xiàn)基線機器學(xué)習(xí)算法(Baseline Machine Learning Algorithms)。學(xué)完本教程后,你將了解:
如何實現(xiàn)隨機預(yù)測(random prediction)算法
如何實現(xiàn)零規(guī)則(zero rule prediction)算法
讓我們開始吧!
描述
可供選擇的機器學(xué)習(xí)算法有很多。事實上,有上百種。那么在選擇算法之前,你需要評價它的預(yù)測結(jié)果。可是,你如何判斷結(jié)果的好壞?
答案是使用基線預(yù)測算法。如其它預(yù)測一樣,基線預(yù)測算法提供了一組可以評估的預(yù)測結(jié)果,例如分類準(zhǔn)確率(Accuracy)或 RMSE。
這些評價指標(biāo)的數(shù)值為評估所有其它機器學(xué)習(xí)算法提供了所需的比較標(biāo)準(zhǔn)。
一旦計算出基線預(yù)測算法的評價指標(biāo),就可以知道一個給定算法比樸素基線算法到底好多少,為評價算法提供了依據(jù)。
兩種最常用的基線算法是:
隨機預(yù)測(random prediction)算法
零規(guī)則(zero rule prediction)算法
當(dāng)遇到比傳統(tǒng)分類或回歸問題更棘手的新問題時,一個好的想法是首先設(shè)計一個基于該預(yù)測問題特征的隨機預(yù)測算法。之后你可以在此基礎(chǔ)上改進,并設(shè)計一個零規(guī)則算法。
讓我們執(zhí)行這些算法代碼,并看看它們是如何工作的吧。
教程
本教程分為兩部分:
隨機預(yù)測算法
零規(guī)則算法
對于實施和計算給定機器學(xué)習(xí)算法的基線性能,下面的步驟將為你提供必要的基礎(chǔ)。
1. 隨機預(yù)測算法
正如在訓(xùn)練數(shù)據(jù)中觀察到的那樣,隨機預(yù)測算法給出隨機的預(yù)測結(jié)果。這可能是機器學(xué)習(xí)中最簡單的算法。
它要求訓(xùn)練集包含所有可能的因變量結(jié)果值,對于自變量取值很多的回歸問題,這個集合可能非常大。
因為隨機數(shù)用于預(yù)測,所以最佳的方法是在使用算法之前固定隨機數(shù)種子。這是為了確保我們獲得相同的一組隨機數(shù),并且每次運行算法時都得到相同的決策。
下面是隨機預(yù)測算法在名為 random_algorithm() 的函數(shù)中的實現(xiàn)。
該函數(shù)的輸入?yún)?shù)為兩部分:含有因變量數(shù)值的訓(xùn)練集和需要預(yù)測因變量數(shù)值的測試集。
該函數(shù)將用于分類和回歸問題。它假定訓(xùn)練集的預(yù)測輸出值是每行觀測值的最后一列。
首先,從訓(xùn)練集得到所有因變量取值的集合。然后,從集合中隨機選擇一個值作為測試集每一行觀測值的輸出值。
# Generate random predictions
def random_algorithm(train, test):
output_values = [row[-1] for row in train]
unique = list(set(output_values))
predicted = list()
for row in test:
index = randrange(len(unique))
predicted.append(unique[index])
return predicted
我們可以用一個小數(shù)據(jù)集測試這個函數(shù),為了簡單起見,它只包含輸出列。
訓(xùn)練集的輸出值為 0 或 1,意味著算法的預(yù)測集合為 {0,1},并從中選擇預(yù)測值。在預(yù)測之前,測試集的輸出列為空。
from random import seed
from random import randrange
# Generate random predictions
def random_algorithm(train, test):
output_values = [row[-1] for row in train]
unique = list(set(output_values))
predicted = list()
for row in test:
index = randrange(len(unique))
predicted.append(unique[index])
return predicted
seed(1)
train = [[0], [1], [0], [1], [0], [1]]
test = [[None], [None], [None], [None]]
predictions = random_algorithm(train, test)
print(predictions)
運行示例代碼,計算測試集的隨機預(yù)測,并 print 預(yù)測結(jié)果。
[0, 1, 1, 0]
隨機預(yù)測算法易于實現(xiàn)且運行速度快,但作為基線算法,我們可以做得更好。
2. 零規(guī)則算法
零規(guī)則算法是比隨機預(yù)測算法更好的基線預(yù)測算法。對于給定問題,它運用更多相關(guān)的信息來建立規(guī)則以進行預(yù)測。此規(guī)則根據(jù)問題類型而有所不同。
讓我們從分類問題開始,預(yù)測每一類的標(biāo)簽。
分類
對于分類問題,一個規(guī)則是預(yù)測訓(xùn)練集中最常見類的取值。這意味著如果訓(xùn)練集有 90 個類為 0 的實例和 10 個類為 1 的實例,那么輸出值將都預(yù)測為 0,此時的基線精度為 90/100 或 90%。
這比平均只能達到 82% 準(zhǔn)確率的隨機預(yù)測算法要好得多。如何計算隨機預(yù)測算法準(zhǔn)確率估計值的細(xì)節(jié)如下:
= ((0.9 * 0.9) + (0.1 * 0.1)) * 100
= 82%
下面是一個基于分類問題的名為 zero_rule_algorithm_classification() 的零規(guī)則算法函數(shù)。
# zero rule algorithm for classification
def zero_rule_algorithm_classification(train, test):
output_values = [row[-1] for row in train]
prediction = max(set(output_values), key=output_values.count)
predicted = [prediction for i in range(len(test))]
return predicted
該函數(shù)使用帶有 key 屬性的 max() 函數(shù),這是一個聰明的做法。給定訓(xùn)練集中觀察到的所有類的取值,max() 函數(shù)將通過調(diào)用計數(shù)函數(shù)統(tǒng)計每一類數(shù)值的數(shù)量,采用數(shù)量最多的一組類值。
結(jié)果是它返回訓(xùn)練集中觀察到的具有最高計數(shù)類值的數(shù)值。
如果所有類值具有相同的計數(shù),則選擇在數(shù)據(jù)集中觀察到的第一個類值。
一旦我們選擇好計數(shù)最大的類值,它將用于每一行測試集數(shù)據(jù)的預(yù)測。
下面是一個例子,這個構(gòu)造的數(shù)據(jù)集包含 4 個類為 0 的實例和 2 個類為 1 的實例。算法將選擇類值 0 作為測試集中每一行的預(yù)測。
from random import seed
from random import randrange
# zero rule algorithm for classification
def zero_rule_algorithm_classification(train, test):
output_values = [row[-1] for row in train]
prediction = max(set(output_values), key=output_values.count)
predicted = [prediction for i in range(len(train))]
return predicted
seed(1)
train = [['0'], ['0'], ['0'], ['0'], ['1'], ['1']]
test = [[None], [None], [None], [None]]
predictions = zero_rule_algorithm_classification(train, test)
print(predictions)
運行此代碼將進行預(yù)測并將其 print 到屏幕。如預(yù)期,類值 0 被選擇并用來預(yù)測。
['0', '0', '0', '0', '0', '0']
現(xiàn)在,讓我們看看回歸問題的零規(guī)則算法。
回歸
回歸問題需要預(yù)測非離散型值。一個默認(rèn)的好的預(yù)測方法是預(yù)測數(shù)據(jù)的集中趨勢(central tendency)。這可以是平均值或中值。使用訓(xùn)練集觀察到的因變量的平均值是一個很不錯的默認(rèn)方法。它的誤差可能比隨機預(yù)測低,因為后者將返回任何觀察到的因變量值。
下面是一個名為 zero_rule_algorithm_regression()的函數(shù)。它的原理是計算觀察到的因變量的平均值。
mean = sum(value) / total values
一旦計算出平均值,它將用于每一行訓(xùn)練數(shù)據(jù)的預(yù)測。
from random import randrange
# zero rule algorithm for regression
def zero_rule_algorithm_regression(train, test):
output_values = [row[-1] for row in train]
prediction = sum(output_values) / float(len(output_values))
predicted = [prediction for i in range(len(test))]
return predicted
這個函數(shù)可以用一個簡單的例子來測試。
我們可以構(gòu)造一個小數(shù)據(jù)集,其中平均值已知為 15。
10
15
12
15
18
20
mean = (10 + 15 + 12 + 15 + 18 + 20) / 6
mean = 90 / 6
mean = 15
下面是完整的例子。我們期望 4 行測試集的預(yù)測值為平均值 15。
from random import seed
from random import randrange
# zero rule algorithm for regression
def zero_rule_algorithm_regression(train, test):
output_values = [row[-1] for row in train]
prediction = sum(output_values) / float(len(output_values))
predicted = [prediction for i in range(len(test))]
return predicted
seed(1)
train = [[10], [15], [12], [15], [18], [20]]
test = [[None], [None], [None], [None]]
predictions = zero_rule_algorithm_regression(train, test)
print(predictions)
運行示例代碼,計算測試集的預(yù)測值,并 print 預(yù)測結(jié)果。如預(yù)期,每一行測試集的預(yù)測值為平均值 15。
[15.0, 15.0, 15.0, 15.0, 15.0, 15.0]
擴展
以下是基線預(yù)測算法的一些擴展,你可以自己來實現(xiàn)這些算法。
用中位數(shù)值、眾數(shù)等其它中心趨勢統(tǒng)計量預(yù)測,而不是平均值
對于時間序列問題,當(dāng)最后 n 條記錄的平均值已經(jīng)預(yù)測出來時,使用滑動平均值(Moving Average)用于預(yù)測
回顧
在本教程中,你了解了計算機器學(xué)習(xí)問題的基線性能的重要性。
你現(xiàn)在知道了:
如何實現(xiàn)分類和回歸問題的隨機預(yù)測算法
如何實現(xiàn)分類和回歸問題的零規(guī)則算法
相關(guān)鏈接:
總結(jié)
以上是生活随笔為你收集整理的python基线计算法_从头开始:用Python实现基线机器学习算法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算机模拟方法辅助建筑设计,计算机模拟辅
- 下一篇: 转:壹百度-百度十年千倍的29条法则