1.1機器學(xué)習(xí)緒論
(1)什么是機器學(xué)習(xí)?
機器學(xué)習(xí) 是一種讓計算機利用數(shù)據(jù)而非指令來進行各種工作的方法。
機器學(xué)習(xí) 是一個計算機程序,針對某個特定的任務(wù),從經(jīng)驗中學(xué)習(xí),且越做越好。
機器學(xué)習(xí) 在統(tǒng)計理論下的、比較深刻的本質(zhì):它追求的是 合理的假設(shè)空間(Hypothesis Space)的選取 和 模型的泛化(Generalization)能力 。
- “假設(shè)空間”===>模型在數(shù)學(xué)上的“適用場合”
- “泛化能力”===>模型在未知數(shù)據(jù)上的表現(xiàn)
(2)機器學(xué)習(xí)常用術(shù)語
-
“數(shù)據(jù)集”(Data Set)
,即數(shù)據(jù)的集合。其中每一條單獨的數(shù)據(jù)被稱為“樣本”(Sample)。
- 數(shù)據(jù)集中的樣本之間在各個意義下應(yīng)該相互獨立。
- 對于每個樣本,它通常具有一些 “屬性”(Attribute)或者說“特征”(Feature) , 特征所具體取的值就被稱為“特征值”(Feature Value) 。
- 特征和樣本所生成的空間被稱為 “特征空間”(Feature Space) 和 “樣本空間”(Sample Space) ,可以把它們簡單地理解為特征和樣本“可能存在的空間”。
- 相對應(yīng)的, “標簽空間”(Label Space)用于描述模型的輸出“可能存在的空間”;當模型是分類器時,將其稱之為“類別空間” 。
其中,數(shù)據(jù)集又可以分為以下3類:
- 訓(xùn)練集(Training Set):用來訓(xùn)練模型。
- 測試集(Test Set):用來測試、評估模型泛化能力。
- 交叉驗證集(Cross-Validation Set,CV Set):用來調(diào)整模型具體參數(shù)。
(3)機器學(xué)習(xí)的分類? 有監(jiān)督學(xué)習(xí)/無監(jiān)督學(xué)習(xí)
(3-1)有監(jiān)督學(xué)習(xí)(Supervised learning)? ? 可分為“回歸”和“分類”
????通過大量已知的輸入和輸出相配對的數(shù)據(jù),讓計算機從中學(xué)習(xí)出規(guī)律,從而能針對一個新的輸入做出合理的輸出預(yù)測。
- ???? 在回歸問題(Regression learning)中,我們會預(yù)測一個連續(xù)值。也就是說我們試圖將輸入變量和輸出用一個連續(xù)函數(shù)對應(yīng)起來;
- ?? ??在分類問題(Classification learning)中,我們會預(yù)測一個離散值(0,1,2...N),我們試圖將輸入變量與離散的類別對應(yīng)起來。
????每個數(shù)據(jù)點都會獲得標注,如類別標簽或與數(shù)值相關(guān)的標簽。
- ??? ?數(shù)值標簽的例子如:預(yù)測一套二手房的售價。
- ? ? 類別標簽的例子:將圖片分類為「蘋果」或「橘子」;
????監(jiān)督學(xué)習(xí)的目的是通過學(xué)習(xí)許多有標簽的樣本,然后對新的數(shù)據(jù)做出預(yù)測。例如,預(yù)測二手房的售價(回歸)或者準確識別新照片上的水果(分類)。
(3-2)無監(jiān)督學(xué)習(xí)(Unsupervised learning) 一般為“聚類”
? ? 通過學(xué)習(xí)大量的無標記數(shù)據(jù),去分析出數(shù)據(jù)本身的內(nèi)在特點和結(jié)構(gòu)。
? ? 比如:基于大量用戶購物的歷史記錄信息,從數(shù)據(jù)中去分析用戶的不同類別。針對這個問題, 最終能劃分為幾個類別?每個類別有那些特點?我們事先是不知道的 ,這稱為 “聚類”(Clustering) 。
(3-3)有監(jiān)督學(xué)習(xí)和無監(jiān)督學(xué)習(xí)中 “分類”和“聚類” 的區(qū)別
-
有監(jiān)督學(xué)習(xí)中的“分類”:是我們已經(jīng)知道了有哪幾種類別;
- 分類問題是在已知答案中選擇一個
-
無監(jiān)督學(xué)習(xí)中的“聚類”:是我們在分析數(shù)據(jù)之前其實是不知道有哪些類別的。
- 聚類的答案是未知的,需要利用算法從數(shù)據(jù)里挖掘出數(shù)據(jù)的特點和結(jié)構(gòu)。
(4)機器學(xué)習(xí)應(yīng)用開發(fā)的典型步驟
- 數(shù)據(jù)采集與標記
- 數(shù)據(jù)清洗
- 特征選擇
- 模型選擇
- 模型訓(xùn)練和測試
- 模型性能評估和優(yōu)化
- 模型使用
(5)“欠擬合”+“過擬合”? ? ?===> “交叉驗證”
- 泛化能力針對的其實是學(xué)習(xí)方法,它用于衡量該學(xué)習(xí)方法學(xué)習(xí)到的模型在整個樣本空間上的表現(xiàn)。
????????這一點當然是十分重要的,因為我們拿來訓(xùn)練模型的數(shù)據(jù)終究只是樣本空間的一個很小的采樣,如果只是過分專注于它們,就會出現(xiàn)所謂的“過擬合”(Over Fitting)的情況。當然,如果過分罔顧訓(xùn)練數(shù)據(jù),又會出現(xiàn)“欠擬合”(Under Fitting)。可以用一張圖來直觀地感受過擬合和欠擬合(如圖1所示,左為欠擬合,右為過擬合)。
????????所以需要“張弛有度”,找到最好的那個平衡點。 統(tǒng)計學(xué)習(xí)中的結(jié)構(gòu)風(fēng)險最小化(Structural Risk Minimization,SRM)就是研究這個的,它和傳統(tǒng)的經(jīng)驗風(fēng)險最小化(Empirical Risk Minimization,ERM)相比,注重于對風(fēng)險上界的最小化,而不是單純地使經(jīng)驗風(fēng)險最小化。 它有一個原則:在使風(fēng)險上界最小的函數(shù)子集中挑選出使經(jīng)驗風(fēng)險最小的函數(shù) 。而這個函數(shù)子集,正是我們之前提到過的假設(shè)空間。
????????相比起通過選取合適的假設(shè)空間來規(guī)避過擬合,進行 交叉驗證(Cross Validation) 則可以讓我們知道過擬合的程度,從而幫助我們選擇合適的模型。常見的交叉驗證有以下三種。
-
S-fold Cross Validation:中文可翻譯成S折交叉驗證,它是應(yīng)用最多的一種方法,其方法大致如下。?
- 將數(shù)據(jù)分成S份:D={D_1,D_2,…,D_S},一共做S次試驗。
- 在第i次試驗中,使用D-D_i作為訓(xùn)練集,D_i作為測試集對模型進行訓(xùn)練和評測。
- 最終選擇平均測試誤差最小的模型。
- 留一交叉驗證(Leave-one-out Cross Validation):這是S折交叉驗證的特殊情況,此時S=N。
- 簡易交叉驗證:這種實現(xiàn)起來最簡單,也是本書(在進行交叉驗證時)所采用的方法。它簡單地將數(shù)據(jù)進行隨機分組,最后達到訓(xùn)練集約占原數(shù)據(jù)70%的程度(這個比例可以視情況改變),選擇模型時使用測試誤差作為標準。
1.2使用Python進行機器學(xué)習(xí)
- 使用Anaconda
1.3第一個機器學(xué)習(xí)樣例
該問題來自Coursera上的斯坦福大學(xué)機器學(xué)習(xí)課程,其敘述如下:現(xiàn)有47個房子的面積和價格,需要建立一個模型對新的房價進行預(yù)測。稍微翻譯問題,可以得知:
- 輸入數(shù)據(jù)只有一維,亦即房子的面積。
- 目標數(shù)據(jù)也只有一維,亦即房子的價格。
- 則 根據(jù)已知的房子的面積和價格的關(guān)系進行機器學(xué)習(xí) 。
(1)獲取與處理數(shù)據(jù)
數(shù)據(jù)網(wǎng)址:https://github.com/carefree0910/MachineLearning/blob/master/_Data/prices.txt
一般而言,對數(shù)據(jù)做簡單的處理以期望降低問題的復(fù)雜度。在這個例子里,采取常用的將輸入數(shù)據(jù)標準化的做法,其數(shù)學(xué)公式為:
import numpy as np import matplotlib.pyplot as plt x,y=[],[] # 定義存儲輸入數(shù)據(jù)(x)和目標數(shù)據(jù)(y)的數(shù)組 infos=open('prices.txt','r') for sample in infos: # 遍歷數(shù)據(jù)集,變量sample對應(yīng)的正是一個個樣本 _x=sample.strip('\n').split(',')[0] _y=sample.strip('\n').split(',')[1] x.append(float(_x)) y.append(float(_y)) # 將字符串數(shù)據(jù)轉(zhuǎn)化為浮點數(shù) x,y=np.array(x),np.array(y) #讀取完數(shù)據(jù)后,將它們轉(zhuǎn)化為Numpy數(shù)組以方便進一步的處理 x=(x-x.mean())/x.std() #標準化 #將原始數(shù)據(jù)以散點圖的形式畫出 plt.figure() plt.scatter(x,y,c='g',s=6) plt.show()
該圖的橫軸是標準化后的房子面積,縱軸是房子價格?!敬藭r算是完成機器學(xué)習(xí)的第一步:數(shù)據(jù)預(yù)處理】
(2)選擇與訓(xùn)練模型
? ??通過可視化原始數(shù)據(jù),可以非常直觀地感受到:很有可能通過 線性回歸(Linear Regression)中的多項式擬合 來得到一個不錯的結(jié)果。
注意:用多項式擬合散點只是線性回歸的很小的一部分,但是它的直觀意義比較明顯??紤]到問題比較簡單,我們才選用了多項式擬合?!敬颂幹皇呛唵问褂谩?
- ????其中f(x|p;n)就是我們的模型,p、n都是模型的參數(shù),其中p是多項式f的各個系數(shù),n是多項式的次數(shù)。
- ????L(p;n)則是模型的損失函數(shù), 即歐氏距離(或說向量的二范數(shù))。
- ????x、y則分別是輸入向量和目標向量;在我們這個樣例中,x、y這兩個向量都是47維的向量,分別由47個不同的房子面積、房子價格所構(gòu)成。
在確定好模型后,就可以開始編寫代碼來進行訓(xùn)練了。對于大多數(shù)機器學(xué)習(xí)算法,所謂的訓(xùn)練正是最小化某個損失函數(shù)的過程,這個多項式擬合的模型也不例外:我們的目的就是讓上面定義的L(p;n)最小。
x0=np.linspace(-2,4,100) # 在(-2,4)這個區(qū)間上取100個點作為畫圖的基礎(chǔ)
# 利用Numpy的函數(shù)定義訓(xùn)練并返回多項式回歸模型的函數(shù)
# deg參數(shù)代表著模型參數(shù)中的n,亦即模型中多項式的次數(shù)
# 返回的模型能夠根據(jù)輸入的x(默認是x0),返回相對應(yīng)的預(yù)測的y
def get_model(deg):
return lambda input_x=x0:np.polyval(np.polyfit(x,y,deg),input_x)
Numpy里面帶的兩個函數(shù):polyfit和polyval的用法。
-
polyfit(x, y, deg)
:該函數(shù)會返回使得上述(注:該公式中的x和y就是輸入的x和y)最小的參數(shù)p,亦即多項式的各項系數(shù)。換句話說,該函數(shù)就是模型的訓(xùn)練函數(shù)。
- polyval(p, x) :根據(jù)多項式的各項系數(shù)p和多項式中x的值,返回多項式的值y。
(3)評估與可視化結(jié)果
- 模型做好后,我們就要嘗試判斷各種參數(shù)下模型的好壞了。
- 為簡潔起見,我們采用n=1,4,10這三組參數(shù)進行評估。
- 由于我們訓(xùn)練的目的是最小化損失函數(shù),所以用損失函數(shù)來衡量模型的好壞似乎是一個合理的做法。
# 根據(jù)參數(shù)n、輸入的x、y返回相對應(yīng)的損失
def get_cost(deg,input_x,input_y):
return 0.5*((get_model(deg)(input_x)-input_y)**2).sum()
test_set=(1,4,10)# 定義測試參數(shù)集并根據(jù)它進行各種實驗
for d in test_set:
print('test_set:{}--->{}'.format(d,get_cost(d,x,y))) # 輸出相應(yīng)的損失
"""
test_set:1--->96732238800.35292
test_set:4--->94112406641.67743
test_set:10--->75874846680.09283
"""
那么,怎么最直觀地了解是否出現(xiàn)過擬合了呢?當然還是畫圖了。
#畫出相應(yīng)的圖像
plt.scatter(x,y,c="g",s=20)
for d in test_set:
plt.plot(x0,get_model(d)(),label='degree={}'.format(d))
plt.xlim(-2,4)
plt.ylim(1e5,8e5) # 將橫軸、縱軸的范圍分別限制在(-2,4)、(1×〖10〗^5,8×〖10〗^5)
plt.legend() # 調(diào)用legend方法使曲線對應(yīng)的label正確顯示
plt.show()
所得的結(jié)果是:
- 當n=1,4,10時,損失的頭兩位數(shù)字分別為96、94和75。這么看來似乎是n=10優(yōu)于n=4,而n=1最差,
- 但從圖可以看出,三條線分別代表n=1、n=4、n=10的情況。可以看出,從n=4開始模型就已經(jīng)開始出現(xiàn)過擬合現(xiàn)象了,到n=10時模型已經(jīng)變得非常不合理。似乎直接選擇n=1作為模型的參數(shù)才是最好的選擇。
這里矛盾的來源正是前文所提到過的過擬合情況。
【注:該例子結(jié)束。因為數(shù)據(jù)集太少,所以沒有進行交叉驗證。】
轉(zhuǎn)載于:https://my.oschina.net/pansy0425/blog/3099751
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
