python 超全sklearn教程,數據挖掘從入門到入坑

最近工作中遇到了一些數據建模的問題,趁這幾天有時間,把數據挖掘過程中一些流程規範和常見的機器學習問題總結一下。本篇博文涵蓋的內容有機器學習的概念,模型分類(有監督、無監督),python語言與R語言,以及基於sklearn的機器學習框架。

一、什麼是機器學習

機器學習概念的來自計算機科學領域,相關的一些研究與統計學有很大的重複部分。人類個體的學習是由客觀世界給出的反饋然後進行向最優方向調節的過程,計算機科學家認爲機器也可以像人腦一樣進行學習,基於他們的數學功底,開發出的算法命名爲機器學習。學習的本質是一大批互相連接的信息傳遞和存儲元素所組成的系統。他們共同的特點是:開始準確率很低,隨着學習進行,準確率越來越高。

讓計算機學習分辨標籤

二、機器學習方法的分類

2.1 監督式學習 Supervised Learning

在監督式學習下,每組訓練數據都有一個標識值或結果值(target)。

2.1.1 分類 Classification

(1)K最近鄰 K-Nearest Neighbor (KNN)
(2)樸素貝葉斯 Naive Bayes
(3)決策樹 Decision Tree

  • ID3
  • C4.5
  • 分類迴歸樹 Classification And Regression Tree (CART)

這裏寫圖片描述
區別:決策樹系列算法總結(ID3, C4.5, CART, Random Forest, GBDT)
(4)支持向量機器 Support Vector Machine (SVM)

2.1.2 迴歸 Regression

(1)線性迴歸 linear regression
(2)局部加權迴歸 Locally weighted regression
(3)邏輯迴歸 logistic Regression
(4)逐步迴歸 stepwise regression
(5)嶺迴歸 Ridge Regression
(6)Least Absolute Shrinkage and Selection Operator ( LASSO )
(7)彈性網絡 Elastic Net (L1+L2)
(8)人工神經網絡

2.2 非監督學習 Unsupervised Learning

(1)聚類 Cluster (K均值 k-means)
(2)主成分分析Principal Component Analysis ( PCA )
(3)偏最小二乘迴歸 Partial Least Squares Regression ( PLS )
(4)關聯規則 Association Rule

2.3 半監督

在半監督學習方式下,訓練數據有部分被標識,部分沒有被標識,這種模型首先需要學習數據的內在結構,以便合理的組織數據來進行預測。算法上,包括一些對常用監督式學習算法的延伸,這些算法首先試圖對未標識數據進行建模,在此基礎上再對標識的數據進行預測。如深度學習:

深度學習 Deep Learning

深度學習是 監督學習的匹配學習中人工神經網絡延伸出來發展出來的。
(1)受限波爾茲曼機 Restricted Boltzmann Machine ( RBM )
(2)深度信念網絡 Deep Belief Networks ( DBN )
(3)卷積網絡 Convolutional Network
(4)棧式自編碼 Stacked Auto-encoders

2.4 增強學習 Reinforcement Learning

增強學習應用範圍在機器人和工業界比較多,與深度學習結合較多,目前暫不瞭解。
(1)Q-Learning
(2)時間差學習 Temporal difference learning

2.5 機器學習分類面試考點

一般筆試題都會問一道題,以下降維算法是否屬於監督(非監督),在這裏總結以下。

  • 主成分分析(Principal Component Analysis,PCA)
  • 線性判別分析(Linear Discriminant Analysis,LDA
  • 等距映射(Isomap
  • 局部線性嵌入(Locally Linear Embedding,LLE
  • Laplacian 特徵映射(Laplacian Eigenmaps
  • 局部保留投影(Local Preserving Projection,LPP
  • 局部切空間排列(Local Tangent Space Alignment,LTSA
  • 最大方差展開( Maximum Variance Unfolding,MVU
分類法(是否) 不是
監 督 PCA、LPP、Isomap、LLE、Laplacian Eigenmaps、LTSA、MVU LDA
線 性 PCA、LDA、LPP Isomap、LLE、Laplacian Eigenmaps、LTSA、MVU
全 局 PCA、LDA、Isomap、MVU Laplacian Eigenmaps、LPP、LTSA

三、Python機器學習

3.1 爲什麼選擇python

項目裏做模型的語言肯定是R/SAS/Python三者之一,項目上線一般是Java。R語言和Python語言有許多共通之處,比如pandas就是借鑑R中的dataframe。其他的相同點不再多說,比如開源、易學習,主要的不同點在:

  1. python 更加通用。除了可以用python進行數據分析,它還在其他領域有更多應用,比如Linux運維、socket編程、遊戲開發等。
  2. R的包管理很複雜。雖然同樣是機器學習,R中不同模型可以使用的方法都不一樣,而且有時候還需要加載一些命名非常奇怪的包。更多情況下是我自己寫完的R代碼過幾天再看,這都是啥?
  3. python 的社區比R更加完善。除了stackoverflow, R的一些社區感覺就是各自爲戰,而且大部分是討論統計學上的問題。找到特定bug解決的成本挺高的。

總的來說,R偏向於學術上的計算,python更易上手,而且社區對新人非常友好,所以我建議用python進行數據分析。

3.2 機器學習大殺器 scikit-learn

3.2.1 什麼是 sklearn

sklearn (scikit-learn簡稱) 是基於 numpyscipy 擴展的模塊,項目最早由David Cournapeau 於2007年穀歌編程大賽發起,後來越來越多的貢獻者加入到模塊的開發,經過多年發展,成爲了python裏機器學習最強大的工具包。基本涵蓋了數據挖掘流程中所有可能需要用到的算法。
項目代碼傳送門:Github/scikit-learn

3.2.2 sklearn 安裝指南

  1. 集成環境(推薦)
    Anaconda + Spyder(清華鏡像)
  2. 自定義安裝(python + Jupyter IPython Notebook

    • Python (>= 2.7 or >= 3.3)
    • NumPy (>= 1.8.2)
    • SciPy (>= 0.13.3)

    安裝方法:

    1. pip install numpy,scipy, sklearn -i https://pypi.douban.com/simple
    2. windows環境下遇到編譯錯誤的情況:下載對應的.whl(編譯好的文件) 到本地,再用 pip install 安裝。
      whl下載地址:http://www.lfd.uci.edu/~gohlke/pythonlibs/#scipy
    3. IPython Notebook
      https://jupyter.readthedocs.io/en/latest/install.html

3.3 如何確定學習類型

處理不同問題的時候呢, 我們會要用到不同的機器學習-學習方法。 Sklearn 提供了一張非常有用的流程圖,供我們選擇合適的學習方法。
機器學習模型選擇流程圖

根據樣本量,是否分類問題等確定解決的方法。

3.4 sklearn 通用學習模式

根據sklearn的開發規範,只要你懂使用其中一個模型,就能按一樣的格式使用其他的模型。

3.4.1 通用數據庫

sklearn 自帶一些常用的測試數據集,比如鳶尾花、手寫字符(0-9)、573條波士頓房價數據,以及更強大的自定義分類或者回歸的隨機數據集。

from sklearn import datasets
import matplotlib.pyplot as plt
# 自帶的數據集
iris = datasets.load_riris() # load_digital
test_X = iris.data
test_y = iris.target
feat_name = iris.feature_names

# 計算機產生的數據集
## 產生樣本量爲100,特徵維數爲2,有相關關係的特徵維數爲2,的分類數據集
X, y = datasets.make_classification(n_samples=100, n_features=2, n_informative=2, n_redundant=2, random_state=22)
## 產生樣本量爲100,特徵維數爲2,有相關關係的特徵維數爲2,分類數爲1,噪聲爲0的分類數據集
X, y = datasets.make_regression(n_samples=100, n_features=2, n_informative=2, n_targets=1, noise=0.0, random_state=22)
# 可視化
plt.scatter(X, y)
plt.show()

完整數據庫及介紹:
http://scikit-learn.org/stable/modules/classes.html#module-sklearn.datasets

3.4.2 數據集切分、訓練

真實建模必須要分訓練集和測試集

from sklearn.model_selection import train_test_split
# 分隨機抽取30%的數據作爲測試集,有4個返回值
train_X, test_X, train_y, test_y = train_test_split(X, y, test_size=0.3)

模型訓練、預測,以KNN模型爲例

import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn import datasets

iris = datasets.load_iris()
X= iris.data
y = iris.target
train_X, test_X, train_y, test_y = train_test_split(X, y, test_size=0.3)
# 引入模型
knn = KNeighborsClassifier()
# fit 訓練步驟
knn.fit(train_X, train_y)
# pred 預測步驟
pred = knn.predict(test_X)

## 分別打印出來看看有沒有預測錯誤的
print(np.array(test_y))
print(np.array(pred))

# 或者直接打印score
print(knn.score(test_X,test_y))  # 93%左右的正確率

3.4.3 數據標準化(去量綱)

在梯度下降過程中,如果數據的跨度太大會導致收斂速度降低,模型產生偏差,所以一般情況下都需要對數據進行標準化或者歸一化。
sklearn 提供了數據預處理的一些方法,比如scale和minmax_scale。以相同數據集iris 作爲比較。

from sklearn import preprocessing
from sklearn.svm import SVC
X_scale = preprocessing.scale(X)
train_X, test_X, train_y, test_y = train_test_split(X, y, test_size=0.3)
knn.fit(train_X, train_y)
print(knn.score(test_X, test_y))

使用SVM中的中的分類

from sklearn.svm import SVC
X_scale = preprocessing.scale(X)
train_X, test_X, train_y, test_y = train_test_split(X, y, test_size=0.3)
clf = SVC()
clf.fit(train_X, train_y)
print(clf.score(test_X, test_y)) ##正確率99%

3.4.5 交叉驗證改善模型

交叉驗證(cross_validation)是指將原數據集切分成n等分,每一份做一次得分,求得平均值作爲當前模型的準確度或者誤差。

# 示例
from sklearn.model_selection import cross_val_score
scores = cross_val_score(knn, X, y, cv=5, scoring="accuracy")
print(scores.mean()) 
#array([ 0.966667, 1. ,  0.93333,  0.966667,  1. ])

3.4.5.1 參數調優

KNN選取k個最近鄰的類別進行打分,當k不同時,對模型結果能造成一定影響。如果我們想找到最好的k的近鄰,就需要進行交叉驗證。

k_score = []
k = range(1,31)
for n in k:
    knn = KNeighborsClassifier(n_neighbors=n)
    scores = cross_val_score(knn, X, y, cv=5, scoring="accuracy") # 分類問題
    # loss = -cross_val_score(knn, X, y, cv=5, scoring="mean_squared_error") # 迴歸
    k_score.append(scores.mean())
plt.plot(k, k_score)
plt.xlabel("Value for KNN")
plt.ylabel("Cross-validation accuracy")
plt.show()

不同的n下的準確率
當k=10左右模型的準確率最好。

3.4.5.2 防止過擬合

sklearn.learning_curve 中的 learning curve 可以很直觀的看出我們的 model 學習的進度,對比發現有沒有 overfitting 的問題。然後我們可以對我們的 model 進行調整,克服 overfitting 的問題。

# 以手寫數字識別數據庫爲例
## 手寫字體
from sklearn.model_selection import learning_curve
from sklearn.svm import SVC
digits = datasets.load_digits()
X = digits.data
y = digits.target
train_sizes, train_loss, test_loss = learning_curve(SVC(gamma=0.001), X, y, cv=5,
             scoring="neg_mean_squared_error", train_sizes=[0.1, 0.25, 0.5, 0.75, 1])
train_loss_mean = -np.mean(train_loss, axis=1)
test_loss_mean = -np.mean(test_loss,axis=1)
plt.plot(train_sizes, train_loss_mean, 'o-', color='r', label="training error")
plt.plot(train_sizes, test_loss_mean, 'o-', color='g', label="cross-validation")
plt.legend()
plt.show()

這裏寫圖片描述

3.4.5.3 同時兼顧過擬合與參數尋優

validation_curve, 用這一種 curve 我們就能更加直觀看出改變 model 中的參數的時候有沒有 overfitting 的問題了。這也是可以讓我們更好的選擇參數的方法。

from sklearn.model_selection import validation_curve
# 參數範圍
param_range = np.logspace(-6,-2.3, num=7)
train_loss, test_loss = validation_curve(SVC(), X, y, param_name='gamma', param_range=param_range, 
             cv=5, scoring="neg_mean_squared_error")
train_loss_mean = -np.mean(train_loss, axis=1)
test_loss_mean = -np.mean(test_loss, axis=1)
plt.plot(param_range, train_loss_mean, 'o-', color='r', label="Training")
plt.plot(param_range, test_loss_mean, 'o-', color='g', label="Cross-validation")
plt.legend()

這裏寫圖片描述
因此, 最優的gamma參數爲0.001附近,此時cv=5的訓練誤差和測試集誤差最小。

四、模型保存

# 方法 1: pickle
import pickle
## save 
with open('save/clf.pickle', 'wb') as f:
    pickle.dump(knn, f)
## restore
with open('save/clf.pickle', 'wb') as f:
    knn = pickle.load(f)

# 方法 2: joblib
from sklearn.externals import joblib
## save
joblib.dump(knn, 'save/save.pkl')
## restore
knn = joblib.load('save/save.pkl')

參考資料:

  1. Scikit-learn: API Reference
  2. 決策樹系列算法總結(ID3, C4.5, CART, Random Forest, GBDT)
  3. 【數據降維】數據降維方法分類
  4. 周莫煩:什麼是機器學習? …系列教程
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章