因爲實驗緣由,準備入坑 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
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')
#訓練模型 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)
給一個實例,進行預測(訓練集和測試集都要作一樣的數據處理工做,如正則化等):機器學習
#預測 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:有註釋的,帶註釋的。
總體來講,第一章用一個簡單的線性分類器的例子,走了一遍簡要的機器學習的流程,介紹了一些相關概念,可以對機器學習有一個簡要的認識。
機器學習的一些分類:
機器學習的一些重要概念:
歡迎轉載本博客文章,轉載請註明出處,十分感謝。