1. 程式人生 > >《機器學習實戰》——讀書筆記1

《機器學習實戰》——讀書筆記1

前言
在大學裡,最好的方面不是你研修的課程或從事的研究,而是一些外圍活動:與人會面、參加研討會、加入組織、旁聽課程,以及學習未知的知識。
一個機構會僱傭一些理論家(思考者)以及一些做實際工作的人(執行者)。前者可能會將大部分時間花在學術工作上,他們的日常工作就是基於論文產生思路,然後通過高階工具或教學進行建模。後者則通過編寫程式碼與真實世界互動,處理非理想世界中的瑕疵,比如崩潰的及其或帶噪聲的資料。並不能完全區分兩類人。

第一部分 分類

前兩部分主要探討監督學習。監督學習一般使用兩種型別的目標變數:標稱型(有限目標集)和數值型(無限的數值集合)。

第 1 章 機器學習基礎

機器學習能讓我們自資料集中受到啟發,換句話說,我們會利用計算機來彰顯資料背後的真實含義。

1.1 何謂機器學習

機器學習就是把無數的資料轉換成有用的資訊。
機器學習橫跨電腦科學、工程技術和統計學等多個學科,對於任何需要解釋並操作資料的領域都有所裨益。
機器學習用到了統計學知識,因為現實世界中很多例子我們無法位置簡歷精確的數學模型,所以需要統計學工具。

1.1.1 感測器和海量資料

網際網路有大量的非人為資料,舉了地震預測的例子,講述了移動計算和感測器產生海量資料。

1.1.2 機器學習非常重要

大量的經濟活動都依賴於資訊,我們不能再海量的資料中迷失,機器學習將有助於我們穿越資料霧靄,從中抽取出有用的資訊。

1.2 關鍵術語

特徵、分類、訓練集、目標變數、測試資料、知識表示

1.3 機器學習的主要任務

監督學習:分類和迴歸。無監督學習:聚類和密度估計。
這裡寫圖片描述

1.4 如何選擇合適的演算法

必須考慮兩個問題:一、使用機器學習演算法的目的,想要演算法完成何種任務。二、需要分析或收集的資料是什麼。

1.5 開發機器學習應用程式的步驟

1、收集資料
2、準備輸入資料
3、分析輸入資料
4、訓練演算法
5、測試演算法
6、使用演算法

1.6 Python語言的優勢

三個原因:(1)Python的語法清晰;(2)易於操作純文字檔案;(3)使用廣泛,存在大量的開發文件。

1.6.1 可執行虛擬碼

Python具有清晰的語法結構,並且語言處理和操作文字檔案非常簡單。

1.6.2 Python比較流行

1.6.3 Python語言的特色

和MATLAB相比是免費的,其外掛是開源的。
和Java、C相比,不需要編寫大量冗餘的程式碼。

1.6.4 Python語言的缺點

執行效率不高。

1.7 NumPy函式庫基礎

幾個命令random.rand(4,4)產生4*4的隨機陣列。
randMat=mat(random.rand(4*4))產生矩陣

矩陣與陣列的區別~

randMat.I 矩陣的逆 eye(n)n階單位陣

1.8 本章小結

機器學習廣泛應用於日常生活中,每天處理的資料不斷增加,能夠深入理解資料背後的真實含義,是資料驅動產業必須具備的基本技能。

第 2 章 k-近鄰演算法

知乎大神的相關筆記!
首先,我們將探討k-近鄰演算法的基本理論,以及如何使用距離測量的方法分類物品;其次我們將使用Python從文字檔案中匯入並解析資料;再次,本書討論了當存在許多資料來源時,如何避免計算距離時可能碰到的一些常見錯誤;最後,利用實際的例子講解如何是所有k-近鄰演算法改進約會網站和手寫數字識別系統。

2.1 k-近鄰演算法概述

簡單地說,k-近鄰演算法採用測量不同特徵值之間的距離方法進行分類。
k-近鄰演算法
優點:精度高、對異常值不敏感,無資料輸入假定
缺點:計算複雜度高、空間複雜度高
使用資料範圍:數值型和標稱型

k-近鄰演算法的工作原理:在訓練樣本集中,每個資料都存在標籤,即我們知道樣本集中每一資料與所屬分類的對應關係。輸入沒有標籤的新資料後,將新資料的每個特徵與樣本集中資料對應的特徵進行比較,然後演算法提取樣本集中特徵最相似資料(最近鄰)的分類標籤。一般來說,我們只選擇樣本資料即中前k(通常k<20)個最相似的資料。最後選擇k個最相似資料中出現次數最多的分類,作為新資料的分類。

k-近鄰演算法的一般流程
1、收集資料:可以使用任何方法
2、準備資料:距離計算所需要的數值,最好是結構化的資料格式
3、分修資料:可以使用任何方法
4、訓練演算法:此步驟不適用於k-近鄰演算法
5、測試演算法:計算錯誤率
6、使用演算法:首先需要輸入樣本資料和結構化的輸出結果,然後執行k-近鄰演算法判定輸入資料分別術語哪個分類,最後應用對計算出的分類執行後續的處理。

2.1.1 準備:使用Python匯入資料

這裡寫圖片描述

2.1.2 實施kNN演算法

這裡寫圖片描述

2.1.3 如何測試分類器

使用已知答案的資料。

2.2 示例:使用k-近鄰演算法改進約會網站的配對效果

示例:在約會網站上使用k-近鄰演算法
(1) 收集資料:提供文字檔案。
(2) 準備資料:使用Python解析文字檔案。
(3) 分析資料:使用Matplotlib畫二維擴散圖。
(4) 訓練演算法:此步驟不適用於k-近鄰演算法。
(5) 測試演算法:使用海倫提供的部分資料作為測試樣本。
測試樣本和非測試樣本的區別在於:測試樣本是已經完成分類的資料,如果預測分類與實際類別不同,則標記為一個錯誤。
(6) 使用演算法:產生簡單的命令列程式,然後海倫可以輸入一些特徵資料以判斷對方是否為自己喜歡的型別。

2.2.1 準備資料:從文字檔案中解析資料

在將特徵資料輸入到分類器之前,必須將待處理資料的格式改變為分類器可以接受的格式。

Numpy陣列和Python陣列
由於NumPy庫提供的陣列操作並不支援Python自帶的陣列型別,因此在編寫程式碼時要注意不要使用錯誤的陣列型別。

2.2.2 分析資料:使用Matplotlib建立散點圖

import matplotlib
import matplotlib.pyplot as plt
fig=plt.figure()
ax=fig.add_subplot(111)
ax.scatter(datingDataMat[:,1],datingDataMat[:,2]
#或者 ax.scatter(datingDataMat[:,1],datingDataMat[:,2],15.0*array(datingLabels),15.0*array(datingLabels))
plt.show()

2.2.3 準備資料:歸一化數值

def autoNorm(dataSet):
    minVals=dataSet.min(0)#對於dataSet這個矩陣返回每一列的最小值
    maxVals=dataSet.max(0)
    ranges=maxVals-minVals
    normDataSet=zeros(shape(dataSet))
    m=dataSet.shape[0]
    normDataSet=dataSet-tile(minVals,(m,1))
    normDataSet=normDataSet/tile(ranges,(m,1))
    return normDataSet,ranges,minVals

2.2.4 測試演算法:作為完整程式驗證分類器

隨機選擇一些資料測試分類器。

def datingClassTest():
    hoRatio=0.10
    datingDataMat,datingLabels=file2matrix('datingTestSet2.txt')
    normMat,ranges,minVals=autoNorm(datingDataMat)
    m=normMat.shape[0]
    numTestVecs=int(m*hoRatio)
    errorCount=0.0
    for i in range(numTestVecs):
        classifierResult=classify0(normMat[i,:],normMat[numTestVecs:m,:],datingLabels[numTestVecs:m],3)
        print "the classifier came back with %d, the real answer is: %d" %(classifierResult,datingLabels[i])
        if (classifierResult!=datingLabels[i]): errorCount+=1.0
    print "the total error rate is: %f"%(errorCount/float(numTestVecs))

2.2.5 使用演算法:構建完整可用系統

def classifyPerson():
    resultList=['not at all','in small doses','in large doses']
    percentTats=float(raw_input("percentage of time spent playing video games?"))
    ffMiles=float(raw_input(("frequent flier miles earned per year?")))
    iceCream=float(raw_input("liters of ice cream consumed per year?"))
    datingDataMat,datingLabels=file2matrix('datingTestSet2.txt')
    normMat, ranges, minVals = autoNorm(datingDataMat)
    inArr=array([ffMiles,percentTats,iceCream])
    classifierResult=classify0((inArr-minVals)/ranges,normMat,datingLabels,3)
    print "You will probably like this person: ",resultList[classifierResult-1]

2.3 示例:手寫識別系統

識別數字0-9

2.3.1 準備資料:將影象轉換為測試向量

編寫img2vector,建立1*1024的NumPyt陣列,然後開啟指定檔案,將檔案儲存到NumPy陣列中,返回陣列。

def img2vector(filename):
    returnVect=zeros((1,1024))
    fr=open(filename)
    for i in range(32):
        lineStr=fr.readline()
        for j in range(32):
            returnVect[0,32*i+j]=int(lineStr[j])
    return returnVect

2.3.2 測試演算法:使用k-近鄰演算法識別手寫數字

from os import listdir 從os模組中匯入函式listdir,列出給定目錄的檔名。

def handwritingClassTest():
    hwLabels=[]
    trainingFileList=listdir('trainingDigits')
    m=len(trainingFileList)
    trainingMat=zeros((m,1024))
    for i in range(m):
        fileNameStr=trainingFileList[i]
        fileStr=fileNameStr.split('.')[0]
        classNumStr=int(fileStr.split('_')[0])
        hwLabels.append(classNumStr)
        trainingMat[i,:]=img2vector('trainingDigits/%s'%fileNameStr)
    testFileList=listdir('testDigits')
    errorCount=0.0
    mTest=len(testFileList)
    for i in range(mTest):
        fileNameStr=testFileList[i]
        fileStr=fileNameStr.split('.')[0]
        classNumStr=int(fileStr.split('_')[0])
        vectorUnderTest=img2vector('testDigits/%s'%fileNameStr)
        classifierResult=classify0(vectorUnderTest,trainingMat,hwLabels,3)
        print "the classifier came back with: %d, the real answer is: %d"% (classifierResult,classNumStr)
        if (classifierResult!=classNumStr):errorCount+=1.0
    print "\n the total number of errors is: %d"% errorCount
    print "\n the total error rate is: %f"%(errorCount/float(mTest))

2.4 本章小結

k-近鄰演算法是分類資料最簡單最有效的演算法。k-近鄰演算法是基於實力的學習,使用演算法時我們必須有接近實際資料的訓練樣本資料。k-近鄰演算法必須儲存全部資料集,如果訓練資料集很大,必須使用大量的儲存空間。此外,由於必須對資料集中每個資料計算距離值,實際使用可能非常耗時。
k-近鄰演算法的另一個缺陷是它無法給出任何資料的基礎結構資訊,因此我們無法知曉平均例項樣本和典型例項樣本具有什麼特徵。概率測量方法可以解決該問題。

第 3 章 決策樹

k-近鄰演算法可以完成很多分類任務,但最大的缺點在於無法給出資料的內在含義,決策樹的主要優勢就在於資料形式非常容易理解。

3.1 決策樹的構造

決策樹
優點:計算複雜度不高,輸出結果易於理解,對中間值的缺失不�%2