《Learning scikit-learn Machine Learning in Python》chapter1

前言

因爲實驗緣由,準備入坑 python 機器學習,而 python 機器學習經常使用的包就是 scikit-learn ,準備先了解一下這個工具。在這裏搜了有 scikit-learn 關鍵字的書,找到了3本:《Learning scikit-learn: Machine Learning in Python》《Mastering Machine Learning With scikit-learn》《scikit-learn Cookbook》,第一本是2013年出版,後兩本是2014年出版,都下下來看了下目錄和頁數,第一本只有118頁,後兩本分別爲238頁和214頁,考慮到但願可以儘快看完一本,對總體 sklearn 有必定了解,最後選擇了第一本進行閱讀。
這本書上週看完了,可是筆記尚未整理,趁着寫這個博客,從新複習一遍,增強理解,鞏固記憶,若是有說錯的地方,敬請指出。html

本書概況

一共分爲4個大章節:第一章是對機器學習的一個入門介紹;第二章和第三章分別介紹了監督學習和無監督學習在 sklearn 中的幾種算法實現,每一個算法用一個例子進行分別介紹,我的以爲很不錯;第四章是對一些前面提到的高級技巧進行分類闡述,若是說前面的算法實現只是一個基本模型構建,第四章講的內容,可以讓模型進一步優化,達到如虎添翼的效果。
私覺得這本書寫得很不錯,雖然頁數很少,講的內容也不是特別深刻,可是對於一個機器學習小白來講,是一本很不錯的入門書籍。看完這本書,可以對使用機器學習方法解決問題樹立一個比較系統的思路和流程,並且因爲頁數很少,看完一本書基本也就花了大概一天半的時間,若是英語or有必定機器學習基礎可能會更快。
可是這本書也有一個很是嚴重的缺陷——太老了。裏面的代碼都是用 python2 寫的,並且一些函數接口,最新的 sklearn 快要不支持了,還有一些使用的數據集,連接下載的時候也遇到了一些問題,還有一些 typos 錯誤。這個讀書筆記邊整理的時候,也就邊在對一些代碼使用 python3 進行實現。python

第一章讀書筆記

前言

大多數用機器學習解決問題的過程能夠簡化成3個步驟:linux

  1. 給一個任務T
  2. 須要學習一些經驗E(藏在數據集裏)
  3. 有一個性能指標P(用來評估任務完成得怎麼樣)

安裝

Scikit-learn 須要提早安裝 Numpy 和 Scipy,參照後文的說法,最好還要安裝 Pandas 和 Matplotlib。
windows 下建議直接安裝 Anaconda,不錯的集成工具,包含 Jupyter Notebook 和 Spyder,以及幾乎全部的依賴包,若是沒有再安裝便可。
linux 下就直接安裝 python 的虛擬環境,利用 pip 包管理工具一個一個進行安裝,能夠看這裏,總結了一個很是簡要的linux下搭建python機器學習環境的相關命令。
Mac 下也有相似的工具 MacPorts 和 HomeBrew。算法

數據集

sklearn 包含一些公開知名的數據集,只要引入相關的數據集包就能夠。
這裏引入了 1936 年鳶尾花的那個數據集,試一下代碼(本文的代碼都是基於python2實現的,但這個筆記都把代碼轉化成了 python 3的實現形式,後文就不一一贅述了)。windows

from sklearn import datasets
iris = datasets.load_iris()
X_iris, Y_iris = iris.data, iris.target
print(X_iris.shape, Y_iris.shape)
print(X_iris[0],Y_iris[0])
(150, 4) (150,)
[ 5.1  3.5  1.4  0.2] 0

shape表示矩陣的維度,行x列。
Numpy 會把數據按照相似 R 的數據框 or 矩陣的格式讀取進來,數據一行表示一個實例,一列表示一個特徵,基本後續的算法輸入也是這種格式。數據結構

線性分類器模型構建、評估、可視化展現

這裏舉了個線性的例子,利用上面的數據集,用花萼的寬度和長度做爲特徵。隨機選擇了75%的做爲訓練集,剩下的做爲測試集,來預測花的類別。dom

#數據集初步處理,構造訓練集和驗證集
from sklearn.cross_validation import train_test_split
from sklearn import preprocessing
X, y = X_iris[:,:2], Y_iris
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=33)
print(X_train.shape, y_train.shape)
(112, 2) (112,)
#對數據進行歸一化
scaler = preprocessing.StandardScaler().fit(X_train)
X_train = scaler.transform(X_train)
X_test = scaler.transform(X_test)
print(scaler)
StandardScaler(copy=True, with_mean=True, with_std=True)
#用橫座標爲花萼長度,縱座標爲花萼寬度做圖,不一樣種類的花用不一樣顏色表示,對數據結構進行可視化展現,能夠指導後續的模型選擇和創建
%matplotlib inline #這句話是在 jupyter 中展現圖片必須寫的命令,不然圖片顯示不出來
import matplotlib.pyplot as plt
colors = ['red','greenyellow','blue']
for i in range(len(colors)):
    xs = X_train[:,0][y_train == i]
    ys = X_train[:,1][y_train == i]
    plt.scatter(xs, ys, c=colors[i])
plt.legend(iris.target_names)
plt.xlabel('Sepal length')
plt.ylabel('Sepal width')
Text(0,0.5,'Sepal width')

Learning scikit-learn Machine Learning in Python chapter1-1

#訓練模型
from sklearn.linear_model import SGDClassifier
clf = SGDClassifier()
clf.fit(X_train, y_train)
print(clf.coef_)
print(clf.intercept_)
[[-38.1319044    4.82101696]
 [  0.74533565 -12.21001281]
 [ 10.94046262  -9.35131933]]

[-11.9120138   -2.94008476 -17.30968766]
#開始做圖
x_min, x_max = X_train[:,0].min() - .5, X_train[:,0].max() + .5
y_min, y_max = X_train[:,1].min() - .5, X_train[:,1].max() + .5
import numpy as np
xs = np.arange(x_min, x_max, 0.5)
fig, axes = plt.subplots(1,3)
fig.set_size_inches(10,6)
for i in [0, 1, 2]:
    axes[i].set_aspect('equal')
    axes[i].set_title('Class' + str(i) + ' versus the rest')
    axes[i].set_xlabel('Sepal length')
    axes[i].set_ylabel('Sepal width')
    axes[i].set_xlim(x_min, x_max)
    axes[i].set_ylim(y_min, y_max)
    plt.sca(axes[i])
    plt.scatter(X_train[:,0], X_train[:, 1], c=y_train, cmap=plt.cm.prism)
    ys = (-clf.intercept_[i] - xs * clf.coef_[i, 0]) /clf.coef_[i, 1]
    plt.plot(xs, ys, hold=True)

Learning scikit-learn Machine Learning in Python chapter1-2

給一個實例,進行預測(訓練集和測試集都要作一樣的數據處理工做,如正則化等):機器學習

#預測
print(clf.predict(scaler.transform([[4.7, 3.1]])))
[0]
print(clf.decision_function(scaler.transform([[4.7, 3.1]])))
[[ 36.57038398  -5.03172599 -31.97218356]]

模型構建完畢,可是還須要評定性能:函數

#在訓練集上的性能評估
from sklearn import metrics
y_train_pred = clf.predict(X_train)
print(metrics.accuracy_score(y_train, y_train_pred))
0.776785714286
#在測試集上的性能評估
y_pred = clf.predict(X_test)
print(metrics.accuracy_score(y_test, y_pred))
0.526315789474

算法在訓練集上的效果確定比測試集上要好,因此是一個檢測算法性能上限的方法。工具

F1值的計算是一個結合精確率和召回率的評估指標,值爲 2* presion * recall/(precision + recall)

#總體的分析報告
print(metrics.classification_report(y_test, y_pred, target_names=iris.target_names))
precision    recall  f1-score   support
     setosa       1.00      1.00      1.00         8
 versicolor       0.38      1.00      0.55        11
  virginica       1.00      0.05      0.10        19
avg / total       0.82      0.53      0.42        38
#看混淆矩陣,能夠看出究竟是哪些判錯影響了性能
print(metrics.confusion_matrix(y_test, y_pred))
[[ 8  0  0]
 [ 0 11  0]
 [ 0 18  1]]

經常使用的交叉驗證方法來評估模型:

#採用5折交叉驗證的方法對模型進行評估
from sklearn.cross_validation import cross_val_score, KFold
from sklearn.pipeline import Pipeline
clf = Pipeline([
    ('scaler', preprocessing.StandardScaler()),
    ('linear_model', SGDClassifier())
])
cv = KFold(X.shape[0], 5, shuffle=True, random_state=33)
scores = cross_val_score(clf, X, y, cv=cv)
print(scores)
[ 0.66666667  0.63333333  0.6         0.83333333  0.86666667]
#計算5折的平均分值,即爲模型的性能
from scipy.stats import sem
def mean_score(scores):
    return ("Mean score: {0:.3f} (+/-{1:.3f})").format(np.mean(scores), sem(scores))
print(mean_score(scores))
Mean score: 0.720 (+/-0.054)

英語生詞總結

sepal:花萼;
petal:花瓣;
setosa:刺芒野古草;
versicolor:雜色的;
virginica:維爾吉尼卡;
harmonic:和諧的,和聲的;
intuitively:直觀的,直覺的;
adequately:充分的,足夠的,適當的;
instantiation:實例化;
annotated:有註釋的,帶註釋的。

小結

總體來講,第一章用一個簡單的線性分類器的例子,走了一遍簡要的機器學習的流程,介紹了一些相關概念,可以對機器學習有一個簡要的認識。

機器學習的一些分類:

  1. 監督學習(分類)
  2. 迴歸(其實也是一種分類,只不過不是離散型的類別,而是連續型的數字)
  3. 非監督學習(聚類)

機器學習的一些重要概念:

  1. 維數爆炸
  2. 過擬合/欠擬合
  3. 泛化能力
  4. 誤差和方差(其實和上面的過擬合和欠擬合是對應的)
  5. 線性分類器高誤差低方差,KNN低誤差高方差,誤差高對應欠擬合,方差高對應過擬合
  6. 特徵標準化和歸一化(數據的處理)
  7. 特徵工程(特徵提取和特徵選擇)
  8. 模型選擇(模型的參數設置)

歡迎轉載本博客文章,轉載請註明出處,十分感謝。