金錢能讓人更快樂嗎?手把手教你用機(jī)器學(xué)習(xí)找到答案
一種對(duì)機(jī)器學(xué)習(xí)系統(tǒng)進(jìn)行分類的方法是看它們?nèi)绾畏夯?。大多?shù)機(jī)器學(xué)習(xí)任務(wù)是要做出預(yù)測(cè)。這意味著系統(tǒng)需要通過給定的訓(xùn)練示例,在它此前并未見過的示例上進(jìn)行預(yù)測(cè)(泛化)。在訓(xùn)練數(shù)據(jù)上實(shí)現(xiàn)良好的性能指標(biāo)固然重要,但是還不夠充分。真正的目的是要在新的對(duì)象實(shí)例上表現(xiàn)出色。
泛化的主要方法有兩種:基于實(shí)例的學(xué)習(xí)和基于模型的學(xué)習(xí)。
1. 基于實(shí)例的學(xué)習(xí)
我們最司空見慣的學(xué)習(xí)方法就是簡(jiǎn)單地死記硬背。如果以這種方式創(chuàng)建一個(gè)垃圾郵件過濾器,那么它可能只會(huì)標(biāo)記那些與已被用戶標(biāo)記為垃圾郵件完全相同的郵件—這雖然不是最差的解決方案,但肯定也不是最好的。
除了完全相同的,你還可以通過編程讓系統(tǒng)標(biāo)記與已知的垃圾郵件非常相似的郵件。這里需要兩封郵件之間的相似度度量。一種(基本的)相似度度量方式是計(jì)算它們之間相同的單詞數(shù)目。如果一封新郵件與一封已知的垃圾郵件有許多單詞相同,系統(tǒng)就可以將其標(biāo)記為垃圾郵件。
這被稱為基于實(shí)例的學(xué)習(xí):系統(tǒng)用心學(xué)習(xí)這些示例,然后通過使用相似度度量來比較新實(shí)例和已經(jīng)學(xué)習(xí)的實(shí)例(或它們的子集),從而泛化新實(shí)例。例如,圖1-15中的新實(shí)例會(huì)歸為三角形,因?yàn)榇蠖鄶?shù)最相似的實(shí)例屬于那一類。
▲圖1-15:基于實(shí)例的學(xué)習(xí)
2. 基于模型的學(xué)習(xí)
從一組示例集中實(shí)現(xiàn)泛化的另一種方法是構(gòu)建這些示例的模型,然后使用該模型進(jìn)行預(yù)測(cè)。這稱為基于模型的學(xué)習(xí)(見圖1-16)。
▲圖1-16:基于模型的學(xué)習(xí)
舉例來說,假設(shè)你想知道金錢是否讓人感到快樂,你可以從經(jīng)合組織(OECD)的網(wǎng)站上下載“幸福指數(shù)”的數(shù)據(jù),再從國際貨幣基金組織(IMF)的網(wǎng)站上找到人均GDP的統(tǒng)計(jì)數(shù)據(jù),將數(shù)據(jù)并入表格,按照人均GDP排序,你會(huì)得到如表1-1所示的摘要。
表1-1:金錢能讓人更快樂嗎?
讓我們繪制這些國家的數(shù)據(jù)(見圖1-17)。
▲圖1-17:趨勢(shì)圖
這里似乎有一個(gè)趨勢(shì)!雖然數(shù)據(jù)包含噪聲(即部分隨機(jī)),但是仍然可以看出隨著該國人均GDP的增加,生活滿意度或多或少呈線性上升的趨勢(shì)。所以你可以把生活滿意度建模成一個(gè)關(guān)于人均GDP的線性函數(shù)。這個(gè)過程叫作模型選擇。你為生活滿意度選擇了一個(gè)線性模型,該模型只有一個(gè)屬性,就是人均GDP(見公式1-1)。
公式1-1:一個(gè)簡(jiǎn)單的線性模型
生活滿意度= θ0 + θ1×人均GDP
這個(gè)模型有兩個(gè)模型參數(shù):θ0和θ1。通過調(diào)整這兩個(gè)參數(shù),可以用這個(gè)模型來代表任意線性函數(shù),如圖1-18所示。
▲圖1-18:一些可能的線性模型
在使用模型之前,需要先定義參數(shù)θ0和θ1的值。怎么才能知道什么值可以使模型表現(xiàn)最佳呢?要回答這個(gè)問題,需要先確定怎么衡量模型的性能表現(xiàn)。要么定義一個(gè)效用函數(shù)(或適應(yīng)度函數(shù))來衡量模型有多好,要么定義一個(gè)成本函數(shù)來衡量模型有多差。
對(duì)于線性回歸問題,通常的選擇是使用成本函數(shù)來衡量線性模型的預(yù)測(cè)與訓(xùn)練實(shí)例之間的差距,目的在于盡量使這個(gè)差距最小化。
這正是線性回歸算法的意義所在:通過你提供的訓(xùn)練樣本,找出最符合提供數(shù)據(jù)的線性模型的參數(shù),這稱為訓(xùn)練模型。在這個(gè)案例中,算法找到的最優(yōu)參數(shù)值為θ0 = 4.85和θ1 = 4.91×10^(-5)。
注意:令人困惑的是,同一個(gè)詞“模型”可以指模型的一種類型(例如,線性回歸),到一個(gè)完全特定的模型架構(gòu)(例如,有一個(gè)輸入和一個(gè)輸出的線性回歸),或者到最后可用于預(yù)測(cè)的訓(xùn)練模型(例如,有一個(gè)輸入和一個(gè)輸出的線性回歸,使用參數(shù)θ0 = 4.85和θ1 = 4.91×10^(-5))。模型選擇包括選擇模型的類型和完全指定它的架構(gòu)。訓(xùn)練一個(gè)模型意味著運(yùn)行一種尋找模型參數(shù)的算法,使其最適合訓(xùn)練數(shù)據(jù)(希望能對(duì)新的數(shù)據(jù)做出好的預(yù)測(cè))。
現(xiàn)在,(對(duì)于線性模型而言)模型基本接近訓(xùn)練數(shù)據(jù),如圖1-19所示。
▲圖1-19:最擬合訓(xùn)練數(shù)據(jù)的線性模型
現(xiàn)在終于可以運(yùn)行模型來進(jìn)行預(yù)測(cè)了。例如,你想知道塞浦路斯人有多幸福,但是經(jīng)合組織的數(shù)據(jù)沒有提供答案。幸好你有這個(gè)模型可以做出預(yù)測(cè):先查查塞浦路斯的人均GDP是多少,發(fā)現(xiàn)是22 587美元,然后應(yīng)用到模型中,發(fā)現(xiàn)生活滿意度大約是4.85 + 22 587×4.91×10^(-5) = 5.96。
為了激發(fā)你的興趣,示例1-1是一段加載數(shù)據(jù)的Python代碼,包括準(zhǔn)備數(shù)據(jù),創(chuàng)建一個(gè)可視化的散點(diǎn)圖,然后訓(xùn)練線性模型并做出預(yù)測(cè)。
示例1-1:使用Scikit-Learn訓(xùn)練并運(yùn)行一個(gè)線性模型
- import matplotlib.pyplot as plt
- import numpy as np
- import pandas as pd
- import sklearn.linear_model
- # Load the data
- oecd_bli = pd.read_csv("oecd_bli_2015.csv", thousands=',')
- gdp_per_capita = pd.read_csv("gdp_per_capita.csv",thousands=',',delimiter='\t',
- encoding='latin1', na_values="n/a")
- # Prepare the data
- country_stats = prepare_country_stats(oecd_bli, gdp_per_capita)
- X = np.c_[country_stats["GDP per capita"]]
- y = np.c_[country_stats["Life satisfaction"]]
- # Visualize the data
- country_stats.plot(kind='scatter', x="GDP per capita", y='Life satisfaction')
- plt.show()
- # Select a linear model
- model = sklearn.linear_model.LinearRegression()
- # Train the model
- model.fit(X, y)
- # Make a prediction for Cyprus
- X_new = [[22587]] # Cyprus's GDP per capita
- print(model.predict(X_new)) # outputs [[ 5.96242338]]
如果使用基于實(shí)例的學(xué)習(xí)算法,你會(huì)發(fā)現(xiàn)斯洛文尼亞的人均GDP最接近塞浦路斯(20 732美元),而經(jīng)合組織的數(shù)據(jù)告訴我們,斯洛文尼亞人的生活滿意度是5.7,因此你很可能會(huì)預(yù)測(cè)塞浦路斯的生活滿意度為5.7。
如果稍微拉遠(yuǎn)一些,看看兩個(gè)與之最接近的國家——葡萄牙和西班牙的生活滿意度分別為5.1和6.5。取這三個(gè)數(shù)值的平均值,得到5.77,這也非常接近基于模型預(yù)測(cè)所得的值。這個(gè)簡(jiǎn)單的算法被稱為k-近鄰回歸(在本例中,k = 3)。
要將前面代碼中的線性回歸模型替換為k-近鄰回歸模型非常簡(jiǎn)單,只需要將下面這行代碼:
- import sklearn.linear_model
- model = sklearn.linear_model.LinearRegression()
替換為:
- import sklearn.neighbors
- model = sklearn.neighbors.KNeighborsRegressor(
- n_neighbors=3)
如果一切順利,你的模型將會(huì)做出很棒的預(yù)測(cè)。如果不行,則需要使用更多的屬性(例如就業(yè)率、健康、空氣污染等),獲得更多或更高質(zhì)量的訓(xùn)練數(shù)據(jù),或者選擇一個(gè)更強(qiáng)大的模型(例如,多項(xiàng)式回歸模型)。
簡(jiǎn)而言之:
- 研究數(shù)據(jù)。
- 選擇模型。
- 使用訓(xùn)練數(shù)據(jù)進(jìn)行訓(xùn)練(即前面學(xué)習(xí)算法搜索模型參數(shù)值,從而使成本函數(shù)最小化的過程)。
- 最后,應(yīng)用模型對(duì)新示例進(jìn)行預(yù)測(cè)(稱為推斷),希望模型的泛化結(jié)果不錯(cuò)。
以上就是一個(gè)典型的機(jī)器學(xué)習(xí)項(xiàng)目。