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