1. 程式人生 > >使用Python從頭開始實現基線機器學習演算法

使用Python從頭開始實現基線機器學習演算法

                  使用Python從頭開始實現基線機器學習演算法 

      在預測建模問題上建立基線效能非常重要。基線為您稍後評估的更高階方法提供了一個比較點。在本教程中,您將瞭解如何在Python中從頭開始實現基線機器學習演算法。

完成本教程後,您將瞭解:

如何實現隨機預測演算法。
如何實現零規則預測演算法。
讓我們開始吧。

更新於2018年8月:經過測試和更新,可與Python 3.6配合使用。

描述

有許多機器學習演算法可供選擇。事實上數以百計。

您必須知道給定演算法的預測是否良好。但你怎麼知道的?

答案是使用基線預測演算法。基線預測演算法提供了一組預測,您可以像對問題的任何預測一樣進行評估,例如分類準確度或RMSE。

在評估問題的所有其他機器學習演算法時,這些演算法的分數提供了所需的比較點。

一旦建立,您可以評論給定演算法與天真基線演算法相比有多好,提供給定方法實際有多好的背景。

兩種最常用的基線演算法是:

隨機預測演算法。
零規則演算法。
當開始比傳統分類或迴歸問題更具粘性的新問題時,首先設計一個特定於您的預測問題的隨機預測演算法是個好主意。稍後您可以對此進行改進並設計零規則演算法。

讓我們實現這些演算法,看看它們是如何工作的。

教程

本教程分為兩部分:

隨機預測演算法。
零規則演算法。
這些步驟將為您的機器學習演算法實現和計算基線效能提供所需的基礎。

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)

      執行該示例計算測試資料集的隨機預測並列印這些預測。

[0, 0, 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

        該函式使用帶有鍵屬性的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)

         執行此示例進行預測並將其列印到螢幕。 正如所料,選擇並預測了類值“0”。

['0', '0', '0', '0', '0', '0']

        現在,讓我們看一下回歸問題的零規則演算法。

       迴歸
       迴歸問題需要預測實際價值。對實際值的良好預設預測是預測集中趨勢。 這可以是均值或中位數。一個好的預設值是使用訓練資料中觀察到的輸出值的平均值(也稱為平均值)。這可能比隨機預測具有更低的誤差,隨機預測將返回任何觀察到的輸出值。下面是一個名為zero_rule_algorithm_regression()的函式。 它的工作原理是計算觀察到的輸出值的平均值。

ean = 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。


5
6
7
8
9
10
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)

        執行該示例計算列印的預測輸出值。 正如所料,測試資料集中每行的平均值為15。

[15.0, 15.0, 15.0, 15.0, 15.0, 15.0]

擴充套件
以下是基線演算法的一些擴充套件,您可能希望將工具作為本教程的擴充套件進行研究。

替代中心趨勢,其中預測中位數,模式或其他集中趨勢計算而不是平均值。
移動平均值用於預測最後n個記錄的平均值的時間序列問題。