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

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