《機器學習實戰》——讀書筆記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創建散點圖

具體可見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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章