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