摘要: 什麼是數據挖掘?什麼是機器學習?又如何進行Python數據預處理?本文將帶領你們一同瞭解數據挖掘和機器學習技術,經過淘寶商品案例進行數據預處理實戰,經過鳶尾花案例介紹各類分類算法。mysql
課程主講簡介:算法
韋瑋,企業家,資深IT領域專家/講師/做家,暢銷書《精通Python網絡爬蟲》做者,阿里雲社區技術專家。sql
如下內容根據主講嘉賓視頻分享以及PPT整理而成。數據庫
本次課程包含了五個知識點:網絡
1.數據挖掘與機器學習技術簡介 機器學習
2.Python數據預處理實戰 函數
3.常見分類算法介紹 學習
4.對鳶尾花進行分類案例實戰 測試
5.分類算法的選擇思路與技巧阿里雲
1、數據挖掘與機器學習技術簡介
什麼是數據挖掘?數據挖掘指的是對現有的一些數據進行相應的處理和分析,最終獲得數據與數據之間深層次關係的一種技術。例如在對超市貨品進行擺放時,牛奶究竟是和麪包擺放在一塊兒銷量更高,仍是和其餘商品擺在一塊兒銷量更高。數據挖掘技術就能夠用於解決這類問題。具體來講,超市的貨品擺放問題能夠劃分爲關聯分析類場景。
在平常生活中,數據挖掘技術應用的很是普遍。例如對於商戶而言,經常須要對其客戶的等級(svip、vip、普通客戶等)進行劃分,這時候能夠將一部分客戶數據做爲訓練數據,另外一部分客戶數據做爲測試數據。而後將訓練數據輸入到模型中進行訓練,在訓練完成後,輸入另外一部分數據進行測試,最終實現客戶等級的自動劃分。其餘相似的應用例子還有驗證碼識別、水果品質自動篩選等。
那麼機器學習技術又是什麼呢?一言以蔽之,凡是讓機器經過咱們所創建的模型和算法對數據之間的關係或者規則進行學習,最後供咱們利用的技術都是機器學習技術。其實機器學習技術是一個交叉的學科,它能夠大體分爲兩類:傳統的機器學習技術與深度學習技術,其中深度學習技術包含了神經網絡相關技術。在本次課程中,着重講解的是傳統的機器學習技術及各類算法。
因爲機器學習技術和數據挖掘技術都是對數據之間的規律進行探索,因此人們一般將二者放在一塊兒說起。而這兩種技術在現實生活中也有着很是廣闊的應用場景,其中經典的幾類應用場景以下圖所示:
一、分類:對客戶等級進行劃分、驗證碼識別、水果品質自動篩選等
機器學習和數據挖掘技術能夠用於解決分類問題,如對客戶等級進行劃分、驗證碼識別、水果品質自動篩選等。
以驗證碼識別爲例,現須要設計一種方案,用以識別由0到9的手寫體數字組成的驗證碼。有一種解決思路是,先將一些出現的0到9的手寫體數字劃分爲訓練集,而後人工的對這個訓練集進行劃分,即將各個手寫體映射到其對應的數字類別下面,在創建了這些映射關係以後,就能夠經過分類算法創建相應的模型。這時候若是出現了一個新的數字手寫體,該模型能夠對該手寫體表明的數字進行預測,即它到底屬於哪一個數字類別。例如該模型預測某手寫體屬於數字1的這個類別,就能夠將該手寫體自動識別爲數字1。因此驗證碼識別問題實質上就是一個分類問題。
水果品質的自動篩選問題也是一個分類問題。水果的大小、顏色等特徵也能夠映射到對應的甜度類別下面,例如1這個類別能夠表明甜,0這個類別表明不甜。在得到一些訓練集的數據以後,一樣能夠經過分類算法創建模型,這時候若是出現一個新的水果,就能夠經過它的大小、顏色等特徵來自動的判斷它究竟是甜的仍是不甜的。這樣就實現了水果品質的自動篩選。
二、迴歸:對連續型數據進行預測、趨勢預測等
除了分類以外,數據挖掘技術和機器學習技術還有一個很是經典的場景——迴歸。在前文提到的分類的場景,其類別的數量都有必定的限制。好比數字驗證碼識別場景中,包含了0到9的數字類別;再好比字母驗證碼識別場景中,包含了a到z的有限的類別。不管是數字類別仍是字母類別,其類別數量都是有限的。
如今假設存在一些數據,在對其進行映射後,最好的結果沒有落在某個0、1或者2的點上,而是連續的落在1.二、1.三、1.4...上面。而分類算法就沒法解決這類問題,這時候就能夠採用迴歸分析算法進行解決。在實際的應用中,迴歸分析算法能夠實現對連續型數據進行預測和趨勢預測等。
三、聚類:客戶價值預測、商圈預測等
什麼是聚類?在上文中提過,要想解決分類問題,必需要有歷史數據(即人爲創建的正確的訓練數據)。假若沒有歷史數據,而須要直接將某對象的特徵劃分到其對應的類別,分類算法和迴歸算法沒法解決這個問題。這種時候有一種解決辦法——聚類,聚類方法直接根據對象特徵劃分出對應的類別,它是不須要通過訓練的,因此它是一種非監督的學習方法。
在何時能用到聚類?假如數據庫中有一羣客戶的特徵數據,如今須要根據這些客戶的特徵直接劃分出客戶的級別(如SVIP客戶、VIP客戶),這時候就可使用聚類的模型去解決。另外在預測商圈的時候,也可使用聚類的算法。
四、關聯分析:超市貨品擺放、個性化推薦等
關聯分析是指對物品之間的關聯性進行分析。例如,某超市內存放有大量的貨品,如今須要分析出這些貨品之間的關聯性,如麪包商品與牛奶商品之間的關聯性的強弱程度,這時候能夠採用關聯分析算法,藉助於用戶的購買記錄等信息,直接分析出這些商品之間的關聯性。在瞭解了這些商品的關聯性以後,就能夠將之應用於超市的商品擺放,經過將關聯性強的商品放在相近的位置上,能夠有效提高該超市的商品銷量。
此外,關聯分析還能夠用於個性化推薦技術。好比,藉助於用戶的瀏覽記錄,分析各個網頁之間存在的關聯性,在用戶瀏覽網頁時,能夠向其推送強關聯的網頁。例如,在分析了瀏覽記錄數據後,發現網頁A與網頁C之間有很強的關聯關係,那麼在某個用戶瀏覽網頁A時,能夠向他推送網頁C,這樣就實現了個性化推薦。
五、天然語言處理:文本類似度技術、聊天機器人等
除了上述的應用場景以外,數據挖掘和機器學習技術也能夠用於天然語言處理和語音處理等等。例如對文本類似度的計算和聊天機器人。
2、Python數據預處理實戰
在進行數據挖掘與機器學習以前,首先要作的一步是對已有數據進行預處理。假若連初始數據都是不正確的,那麼就沒法保證最後的結果的正確性。只有對數據進行預處理,保證其準確性,才能保證最後結果的正確性。
數據預處理指的是對數據進行初步處理,把髒數據(即影響結果準確率的數據)處理掉,不然很容易影響最終的結果。常見的數據預處理方法以下圖所示:
一、缺失值處理
缺失值是指在一組數據中,某行數據缺失的某個特徵值。解決缺失值有兩種方法,一是將該缺失值所在的這行數據刪除掉,二是將這個缺失值補充一個正確的值。
二、異常值處理
異常值產生的緣由每每是數據在採集時發生了錯誤,如在採集數字68時發生了錯誤,誤將其採集成680。在處理異常值以前,天然須要先發現這些異常值數據,每每能夠藉助畫圖的方法來發現這些異常值數據。在對異常值數據處理完成以後,原始數據纔會趨於正確,才能保證最終結果的準確性。
三、數據集成
相較於上文的缺失值處理和異常值處理,數據集成是一種較爲簡單的數據預處理方式。那麼數據集成是什麼?假設存在兩組結構同樣的數據A和數據B,且兩組數據都已加載進入內存,這時候若是用戶想將這兩組數據合併爲一組數據,能夠直接使用Pandas對其進行合併,而這個合併的過程實際上就是數據的集成。
接下來以淘寶商品數據爲例,介紹一下上文預處理的實戰。
在進行數據預處理以前,首先須要從MySQL數據庫中導入淘寶商品數據。在開啓MySQL數據庫以後,對其中的taob表進行查詢,獲得了以下的輸出:
能夠看到,taob表中有四個字段。其中title字段用於存儲淘寶商品的名稱;link字段存儲淘寶商品的連接;price存儲淘寶商品的價格;comment存儲淘寶商品的評論數(必定程度上表明商品的銷量)。
那麼接下來如何將這些數據導入進來?首先經過pymysql鏈接數據庫(若是出現亂碼,則對pymysql的源碼進行修改),鏈接成功後,將taob中的數據所有檢索出來,而後藉助pandas中的read_sql()方法即可以將數據導入到內存中。read_sql()方法有兩個參數,第一個參數是sql語句,第二個參數是MySQL數據庫的鏈接信息。具體代碼以下圖:
一、缺失值處理實戰
對缺失值進行處理能夠採用數據清洗的方式。以上面的淘寶商品數據爲例,某件商品的評論數可能爲0,可是它的價格卻不可能爲0。然而實際上在數據庫內存在一些price值爲0的數據,之因此會出現這種狀況,是由於對部分數據的價格屬性沒有爬到。
那麼如何才能判斷出這些數據出現了缺失值呢?能夠經過如下的方法來進行判別:首先對於以前的taob表調用data.describe()方法,會出現以下圖所示的結果:
如何看懂這個統計結果?第一步要注意觀察price和comment字段的count數據,若是二者不相等,說明必定有信息缺失;若是二者相等,則暫時沒法看出是否有缺失狀況。例如price的count爲9616.0000,而comment的count爲9615.0000,說明評論數據至少缺失了一條。
其餘各個字段的含義分別爲:mean表明平均數;std表明標準差;min表明最小值;max表明最大值。
那麼如何對這些缺失數據進行處理?一種方法是刪掉這些數據,還有一種方法是在缺失值處插入一個新值。第二種方法中的值能夠是平均數或者中位數,而具體使用平均數仍是中位數須要根據實際狀況來決定。例如年齡這個數據(1到100歲),這類平穩、變化的級差不大的數據,通常插入平均數,而變化的間隔比較大的數據,通常插入中位數。
處理價格的缺失值的具體操做以下:
二、異常值處理實戰
跟缺失值的處理過程相似,想要處理異常值,首先要發現異常值。而異常值的發現每每是經過畫散點圖的方法,由於類似的數據會在散點圖中集中分佈到一塊區域,而異常的數據會分佈到遠離這塊區域的地方。根據這個性質,能夠很方便的找到數據中的異常值。具體操做以下圖:
首先須要從數據中抽出價格數據和評論數據。一般的作法能夠藉助循環去抽取,可是這種方法太複雜,有一種簡單的方法是這個數據框進行轉置,這時候原先的列數據就變成了如今的行數據,能夠很方便的獲取價格數據和評論數據。接下來經過plot()方法繪製散點圖,plot()方法第一個參數表明橫座標,第二個參數表明縱座標,第三個參數表明圖的類型,」o」表明散點圖。最後經過show()方法將其展示出來,這樣就能夠直觀的觀測到離羣點。這些離羣點對數據的分析沒有幫助,在實際操做中每每須要將這些離羣點表明的數據刪除或者轉成正常的值。下圖是繪製的散點圖:
根據上圖所示,將評論大於100000,價格大於1000的數據都處理掉,就能夠達處處理異常值的效果。而具體的兩種處理方法的實現過程以下:
第一種是改值法,將其改成中位數、平均數或者其餘的值。具體操做以下圖所示:
第二種是刪除處理法,即直接刪除這些異常數據,也是推薦使用的一種方法。具體操做以下圖所示:
三、分佈分析
分佈分析是指對數據的分佈狀態進行分析,即觀察其是線性分佈仍是正態分佈。通常採用畫直方圖的方式來進行分佈分析。直方圖的繪製有如下幾個步驟:計算極差、計算組距和繪製直方圖。具體的操做以下圖所示:
其中,藉助arrange()方法來制定樣式,arrange()方法第一個參數表明最小值,第二個參數表明最大值,第三個參數表明組距,接下來使用hist()方法來繪製直方圖。
taob表中的淘寶商品價格直方圖以下圖所示,大體上符合正態分佈:
taob表中的淘寶商品評論直方圖以下圖所示,大體上是遞減的曲線:
四、詞雲圖的繪製
有的時候經常須要根據一段文本信息來進行詞雲圖的繪製,繪製的具體操做以下圖:
實現的大體流程是:先使用cut()對文檔進行切詞,在切詞完成以後,將這些詞語整理爲固定格式,而後根據所需的詞雲圖的展示形式讀取相應的圖片(下圖中的詞雲圖是貓的形狀),接着使用wc.WordCloud()進行詞雲圖的轉換,最後經過imshow()展示出相應的詞雲圖。例如根據老九門.txt文檔繪製的詞雲圖效果以下圖所示:
3、常見分類算法介紹
常見的分類算法有不少,以下圖所示:
其中KNN算法和貝葉斯算法都是較爲重要的算法,除此以外還有其餘的一些算法,如決策樹算法、邏輯迴歸算法和SVM算法。Adaboost算法主要是用於弱分類算法改形成強分類算法。
4、對鳶尾花進行分類案例實戰
假如現有一些鳶尾花的數據,這些數據包含了鳶尾花的一些特徵,如花瓣長度、花瓣寬度、花萼長度和花萼寬度這四個特徵。有了這些歷史數據以後,能夠利用這些數據進行分類模型的訓練,在模型訓練完成後,當新出現一朵不知類型的鳶尾花時,即可以藉助已訓練的模型判斷出這朵鳶尾花的類型。這個案例有着不一樣的實現方法,可是藉助哪一種分類算法進行實現會更好呢?
一、KNN算法
(1)、KNN算法簡介
首先考慮這樣一個問題,在上文的淘寶商品中,有三類商品,分別是零食、名牌包包和電器,它們都有兩個特徵:price和comment。按照價格來排序,名牌包包最貴,電器次之,零食最便宜;按照評論數來排序,零食評論數最多,電器次之,名牌包包最少。而後以price爲x軸、comment爲y軸創建直角座標系,將這三類商品的分佈繪製在座標系中,以下圖所示:
顯然能夠發現,這三類商品都集中分佈在不一樣的區域。若是如今出現了一個已知其特徵的新商品,用?表示這個新商品。根據其特徵,該商品在座標系映射的位置如圖所示,問該商品最有多是這三類商品中的哪一種?
這類問題能夠採用KNN算法進行解決,該算法的實現思路是,分別計算未知商品到其餘各個商品的歐幾里得距離之和,而後進行排序,距離之和越小,說明該未知商品與這類商品越類似。例如在通過計算以後,得出該未知商品與電器類的商品的歐幾里得距離之和最小,那麼就能夠認爲該商品屬於電器類商品。
(2)實現方式
上述過程的具體實現以下:
固然也能夠直接調包,這樣更加簡潔和方便,缺點在於使用的人沒法理解它的原理:
(3)使用KNN算法解決鳶尾花的分類問題
首先加載鳶尾花數據。具體有兩種加載方案,一種是直接從鳶尾花數據集中讀取,在設置好路徑以後,經過read_csv()方法進行讀取,分離數據集的特徵和結果,具體操做以下:
還有一種加載方法是藉助sklearn來實現加載。sklearn的datasets中自帶有鳶尾花的數據集,經過使用datasets的load_iris()方法就能夠將數據加載出來,隨後一樣獲取特徵和類別,而後進行訓練數據和測試數據的分離(通常作交叉驗證),具體是使用train_test_split()方法進行分離,該方法第三個參數表明測試比例,第四個參數是隨機種子,具體操做以下:
在加載完成以後,就能夠調用上文中提到的KNN算法進行分類了。
二、貝葉斯算法
(1)、貝葉斯算法的介紹
首先介紹樸素貝葉斯公式:P(B|A)=P(A|B)P(B)/P(A)。假如如今有一些課程的數據,以下表所示,價格和課時數是課程的特徵,銷量是課程的結果,若出現了一門新課,其價格高且課時多,根據已有的數據預測新課的銷量。
價格(A) | 課時數(B) | 銷量(C) |
低 | 多 | 高 |
高 | 中 | 高 |
低 | 少 | 高 |
低 | 中 | 低 |
中 | 中 | 中 |
高 | 多 | 高 |
低 | 少 | 中 |
顯然這個問題屬於分類問題。先對錶格進行處理,將特徵一與特徵二轉化成數字,即0表明低,1表明中,2表明高。在進行數字化以後,[[t1,t2],[t1,t2],[t1,t2]]------[[0,2],[2,1],[0,0]],而後對這個二維列表進行轉置(便於後續統計),獲得[[t1,t1,t1],[t2,t2,t2]]-------[[0,2,0],[2,1,0]]。其中[0,2,0]表明着各個課程價格,[2,1,0]表明各個課程的課時數。
而原問題能夠等價於求在價格高、課時多的狀況下,新課程銷量分別爲高、中、低的機率。即P(C|AB)=P(AB|C)P(C)/P(AB)=P(A|C)P(B|C)P(C)/P(AB)=》P(A|C)P(B|C)P(C),其中C有三種狀況:c0=高,c1=中,c2=低。而最終須要比較P(c0|AB)、P(c1|AB)和P(c2|AB)這三者的大小,又
P(c0|AB)=P(A|C0)P(B|C0)P(C0)=2/4*2/4*4/7=1/7
P(c1|AB)=P(A|C1)P(B|C1)P(C1)=0=0
P(c2|AB)=P(A|C2)P(B|C2)P(C2)=0=0
顯然P(c0|AB)最大,便可預測這門新課的銷量爲高。
(2)、實現方式
跟KNN算法同樣,貝葉斯算法也有兩種實現方式,一種是詳細的實現:
另外一種是集成的實現方式:
三、決策樹算法
決策樹算法是基於信息熵的理論去實現的,該算法的計算流程分爲如下幾個步驟:
(1)先計算總信息熵
(2)計算各個特徵的信息熵
(3)計算E以及信息增益,E=總信息熵-信息增益,信息增益=總信息熵-E
(4)E若是越小,信息增益越大,不肯定因素越小
決策樹是指對於多特徵的數據,對於第一個特徵,是否考慮這個特徵(0表明不考慮,1表明考慮)會造成一顆二叉樹,而後對第二個特徵也這麼考慮...直到全部特徵都考慮完,最終造成一顆決策樹。以下圖就是一顆決策樹:
決策樹算法實現過程爲:首先取出數據的類別,而後對數據轉化描述的方式(例如將「是」轉化成1,「否」轉化成0),藉助於sklearn中的DecisionTreeClassifier創建決策樹,使用fit()方法進行數據訓練,訓練完成後直接使用predict()便可獲得預測結果,最後使用export_graphviz進行決策樹的可視化。具體實現過程以下圖所示:
四、邏輯迴歸算法
邏輯迴歸算法是藉助於線性迴歸的原理來實現的。假如存在一個線性迴歸函數:y=a1x1+a2x2+a3x3+…+anxn+b,其中x1到xn表明的是各個特徵,雖然能夠用這條直線去擬合它,可是因爲y範圍太大,致使其魯棒性太差。若想實現分類,須要縮小y的範圍到必定的空間內,如[0,1]。這時候經過換元法能夠實現y範圍的縮小:
令y=ln(p/(1-p))
那麼:e^y=e^(ln(p/(1-p)))
=> e^y=p/(1-p)
=>e^y*(1-p)=p => e^y-p*e^y=p
=> e^y=p(1+e^y)
=> p=e^y/(1+e^y)
=> p屬於[0,1]
這樣y就下降了範圍,從而實現了精準分類,進而實現邏輯迴歸。
邏輯迴歸算法對應的實現過程以下圖所示:
五、SVM算法
SVM算法是一種精準分類的算法,可是其可解釋性並不強。它能夠將低維空間線性不可分的問題,變爲高位空間上的線性可分。SVM算法的使用十分簡單,直接導入SVC,而後訓練模型,並進行預測。具體操做以下:
儘管實現很是簡單,然而該算法的關鍵卻在於如何選擇核函數。核函數可分爲如下幾類,各個核函數也適用於不一樣的狀況:
(1)線性核函數
(2)多項式核函數
(3)徑向基核函數
(4)Sigmoid核函數
對於不是特別複雜的數據,能夠採用線性核函數或者多項式核函數。對於複雜的數據,則採用徑向基核函數。採用各個核函數繪製的圖像以下圖所示:
五、Adaboost算法
假若有一個單層決策樹的算法,它是一種弱分類算法(準確率很低的算法)。若是想對這個弱分類器進行增強,可使用boost的思想去實現,好比使用Adaboost算法,即進行屢次的迭代,每次都賦予不一樣的權重,同時進行錯誤率的計算並調整權重,最終造成一個綜合的結果。
Adaboost算法通常不單獨使用,而是組合使用,來增強那些弱分類的算法。
5、分類算法的選擇思路與技巧
首先看是二分類仍是多分類問題,若是是二分類問題,通常這些算法均可以使用;若是是多分類問題,則可使用KNN和貝葉斯算法。其次看是否要求高可解釋性,若是要求高可解釋性,則不能使用SVM算法。再看訓練樣本數量、再看訓練樣本數量,若是訓練樣本的數量太大,則不適合使用KNN算法。最後看是否須要進行弱-強算法改造,若是須要則使用Adaboost算法,不然不使用Adaboost算法。若是不肯定,能夠選擇部分數據進行驗證,並進行模型評價(耗時和準確率)。
綜上所述,能夠總結出各個分類算法的優缺點爲:
KNN:多分類,惰性調用,不宜訓練數據過大
貝葉斯:多分類,計算量較大,特徵間不能相關
決策樹算法:二分類,可解釋性很是好
邏輯迴歸算法:二分類,特徵之間是否具備關聯無所謂
SVM算法:二分類,效果比較不錯,但可解釋性欠缺
Adaboost算法:適用於對弱分類算法進行增強
閱讀更多幹貨好文,請關注掃描如下二維碼: