本文參考了About Jason Brownlee的博文
英文鏈接:https://machinelearningmastery.com/machine-learning-in-python-step-by-step/
本文主要是上文的一些翻譯谓谦,附加了自己實際中的總結(jié)和心得
這個項目從一個小的實例開始啊犬,經(jīng)典的鳶尾花的分類。編寫實例對新手學習一門工具來說是一個好的開始,如同編程中的hello world幅垮。
大綱:
- 安裝Python和SciPy平臺
- 導入數(shù)據(jù)集
- 總結(jié)數(shù)據(jù)集
- 可視化數(shù)據(jù)集
- 評估算法
- 做出一些預(yù)測
1 下載安裝和開始使用Python SciPy
安裝過程可以參考本上的上一篇博文拱层,基本上這個流程過了一遍之后下面的步驟都沒什么問題了虹菲。
安裝與配置環(huán)境:http://www.reibang.com/p/b9f3b5440dfe
1.1 安裝SciPy庫
Python的版本號是2.7或者3.5憋肖,本人的是3.5
有五個庫需要預(yù)先安裝好:
- scipy
- numpy
- matplotlib
- pandas
- sklearn
如果是windows下的話,強烈推薦安裝Anaconda胰苏,正如本節(jié)開頭所寫硕蛹,參考上一篇博文。
有一點注意的是硕并,本人安裝Anaconda的時候法焰,scikit-learn版本為0.17,現(xiàn)在已經(jīng)不夠新了鲤孵,這個教程推薦的scikit-learn版本至少為0.18以上壶栋,所以這里做了一個更新。
更新scikit-learn庫只需要在cmd中輸入 :
pip install –U scikit-learn
完成后如圖:
完成了自動更新普监。
1.2 運行Python 和檢查版本
下面檢查Python和上文的庫是否已經(jīng)安裝成功了
打開一個cmd命令框贵试,輸入:
python
然后復(fù)制如下代碼:
# import sys
# print('Python:{}'.format(sys.version))
import scipy
print('scipy: {}'.format(scipy.__version__))
import numpy
print('numpy: {}'.format(numpy.__version__))
import matplotlib
print('matplotlib:{}'.format(matplotlib.__version__))
import pandas
print('pandas: {}'.format(pandas.__version__))
import sklearn
print('sklearn: {}'.format(sklearn.__version__))
測試輸出的結(jié)果,本人的運行結(jié)果顯示如下:
Python:3.5.2 |Anaconda 4.2.0 (64-bit)| (default, Jul 5 2016, 11:41:13) [MSC v.1900 64 bit (AMD64)]
scipy: 0.18.1
numpy: 1.13.0
matplotlib: 1.5.3
pandas: 0.18.1
sklearn: 0.19.1
理想情況下凯正,應(yīng)該是跟上面差不多或者更新一些水泉,如果差一點也沒關(guān)系感帅。但是如果報錯的話驶俊,立刻停下來剥汤,檢查原因,處理好錯誤再繼續(xù)允睹。如果這段運行不通過运准,后續(xù)代碼也無法進行。
2 導入數(shù)據(jù)
我們使用鳶尾花(iris)數(shù)據(jù)集缭受。這是個很有名的數(shù)據(jù)集胁澳,被稱為機器學習界的hello world。
這個數(shù)據(jù)集的詳情:learn more about this dataset on Wikipedia.
2.1 導入庫
# Load libraries
import pandas
from pandas.tools.plotting import scatter_matrix #導入散點圖矩陣包
import matplotlib.pyplot as plt
from sklearn import model_selection
from sklearn.metrics import classification_report
from sklearn.metrics import confusion_matrix
from sklearn.metrics import accuracy_score
from sklearn.linear_model import LogisticRegression
from sklearn.tree import DecisionTreeClassifier
from sklearn.neighbors import KNeighborsClassifier
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
from sklearn.naive_bayes import GaussianNB
from sklearn.svm import SVC
這些導入過程不應(yīng)該有錯誤米者,如果有韭畸,停下來檢查宇智,看看上面的搭建環(huán)境的內(nèi)容,排除錯誤然后繼續(xù)胰丁。
2.2 導入數(shù)據(jù)集
# Load dataset
url = "https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data"
names = ['sepal-length', 'sepal-width', 'petal-length', 'petal-width', 'class']
dataset = pandas.read_csv(url, names=names)
也可以先下載數(shù)據(jù)文件随橘,然后修改url中的路徑去加載它。
3 統(tǒng)計數(shù)據(jù)集
然后看看數(shù)據(jù)锦庸,在這一步注意了解以下幾點:
- 數(shù)據(jù)的維度
- 數(shù)據(jù)本身
- 統(tǒng)計所有的數(shù)據(jù)集屬性
- 根據(jù)不同類別進行數(shù)據(jù)細分
3.1數(shù)據(jù)的維度
#shape
Print(dataset.shape)
將得到150個實例和5個屬性(變量)
3.2 了解數(shù)據(jù)本身
# head
print(dataset.head(20))
將看到前20行的數(shù)據(jù)
sepal-length sepal-width petal-length petal-width class
0 5.1 3.5 1.4 0.2 Iris-setosa
1 4.9 3.0 1.4 0.2 Iris-setosa
2 4.7 3.2 1.3 0.2 Iris-setosa
3 4.6 3.1 1.5 0.2 Iris-setosa
4 5.0 3.6 1.4 0.2 Iris-setosa
5 5.4 3.9 1.7 0.4 Iris-setosa
6 4.6 3.4 1.4 0.3 Iris-setosa
7 5.0 3.4 1.5 0.2 Iris-setosa
8 4.4 2.9 1.4 0.2 Iris-setosa
9 4.9 3.1 1.5 0.1 Iris-setosa
10 5.4 3.7 1.5 0.2 Iris-setosa
11 4.8 3.4 1.6 0.2 Iris-setosa
12 4.8 3.0 1.4 0.1 Iris-setosa
13 4.3 3.0 1.1 0.1 Iris-setosa
14 5.8 4.0 1.2 0.2 Iris-setosa
15 5.7 4.4 1.5 0.4 Iris-setosa
16 5.4 3.9 1.3 0.4 Iris-setosa
17 5.1 3.5 1.4 0.3 Iris-setosa
18 5.7 3.8 1.7 0.3 Iris-setosa
19 5.1 3.8 1.5 0.3 Iris-setosa
3. 3. 統(tǒng)計所有的數(shù)據(jù)集屬性
接下來看看數(shù)據(jù)的屬性机蔗,包括樣本值,均值酸员,最小值蜒车,最大值讳嘱,以及百分比值幔嗦。可以看到所有的數(shù)值都有著相似的區(qū)間(0~8公分)
sepal-length sepal-width petal-length petal-width
count 150.000000 150.000000 150.000000 150.000000
mean 5.843333 3.054000 3.758667 1.198667
std 0.828066 0.433594 1.764420 0.763161
min 4.300000 2.000000 1.000000 0.100000
25% 5.100000 2.800000 1.600000 0.300000
50% 5.800000 3.000000 4.350000 1.300000
75% 6.400000 3.300000 5.100000 1.800000
max 7.900000 4.400000 6.900000 2.500000
3.4根據(jù)不同類別進行數(shù)據(jù)細分
按“class”統(tǒng)計行數(shù)沥潭,
# class distribution
print(dataset.groupby('class').size())
我們可以看到每種花的樣本數(shù)都是50
class
Iris-setosa 50
Iris-versicolor 50
Iris-virginica 50
dtype: int64
4 數(shù)據(jù)可視化
主要是兩種圖:
單變量圖用來更好的理解每個屬性
多變量圖用來更好的理解屬性間的關(guān)系
4.1 單變量圖
單變量圖邀泉,顧名思義,就是指每個圖對應(yīng)單個變量钝鸽,繪制箱線圖(box and whisker plots)
# box and whisker plots
dataset.plot(kind='box', subplots=True, layout=(2,2), sharex=False, sharey=False)
plt.show()
得到了一個直觀的屬性分布圖
還可以創(chuàng)建一個直方圖汇恤,便于對各屬性有個整體的認識
# histograms
dataset.hist()
plt.show()
看來似乎有兩個輸入變量呈高斯分布,這有助于以后我們用算法驗證它拔恰。
4.2 多變量圖
然后我們看看變量之間的關(guān)系
首先我們看素有屬性對之間的散點圖因谎,這有助于發(fā)現(xiàn)輸入變量之間的結(jié)構(gòu)化關(guān)系。
# scatter plot matrix
scatter_matrix(dataset)
plt.show()
值得注意的是颜懊,許多屬性之間的兩兩關(guān)系呈現(xiàn)出的對角線分布趨勢财岔,這提示著一種高相關(guān)性和可預(yù)測性的關(guān)系。
5 算法評估舉例
接下來創(chuàng)建一些模型河爹,并評估各算法的精度匠璧,包括以下幾步:
- 對驗證數(shù)據(jù)集進行分離
- 使用10折交叉驗證( cross validation)建立測試框架( test harness)
- 根據(jù)花的測量屬性建立5個不同的模型預(yù)測其的種類
- 選擇最好的模型
5.1 創(chuàng)建驗證數(shù)據(jù)集
使用統(tǒng)計學方法評估模型的精度。同時我們希望對其中的最優(yōu)模型得到一個更精確的估計咸这。
我們將把加載的數(shù)據(jù)集分為兩部分夷恍。80%用來訓練模型,20%留作驗證數(shù)據(jù)集媳维。
# Split-out validation dataset
array = dataset.values
X = array[:,0:4]
Y = array[:,4]
validation_size = 0.20
seed = 7
X_train, X_validation, Y_train, Y_validation = model_selection.train_test_split(X, Y, test_size=validation_size, random_state=seed)
然后就獲得了訓練數(shù)據(jù)X_train酿雪,Y_train
5.2 測試框架
將使用10折交叉驗證( cross validation)評估精度,就是說把數(shù)據(jù)集分成10份侄刽,輪流將其中9份作為訓練數(shù)據(jù)指黎,1份作為測試數(shù)據(jù),進行試驗唠梨。每次試驗都會得到相應(yīng)的正確率袋励。10次的結(jié)果的正確率的平均值作為對算法精度的估計。
# Test options and evaluation metric
seed = 7
scoring = 'accuracy'
這里使用'accuracy'作為評估模型的度量值。它是正確預(yù)測結(jié)果和全部用例數(shù)量的比值茬故,乘以100%的結(jié)果(例如95%)盖灸,接下來使用scoring變量評估每個模型。
5.3 建立模型
我們并不知道哪種模型在某個問題上是最好的也不知道該用什么樣的配置磺芭,但根據(jù)圖形可以看出某些分類在某些維度上是部份線性分離的赁炎,這可以幫助我們產(chǎn)生好的測試結(jié)果。
接下來我們評價6種不同的算法
- 邏輯回歸(LR, Logistic regression)
- 線性判別分析(LDA, Linear Discriminant Analysis)
- K-近鄰算法(KNN, K-Nearest Neighbors)
- 分類與回歸樹(CART, Classific and Regression Tree)
- 高斯樸素貝葉斯(NB, Gaussian Naive Bayes)
- 支持向量機(SVM, Support Vector Machines)
其中有簡單線性算法(LR和LDA)钾腺,非線性算法(KNN, CART, NB 和SVM)徙垫。我們在每次運行前重置隨機數(shù)種子來確保對算法的評估是基于完全相同的數(shù)據(jù)分支的。這確保了結(jié)果可以直接進行比較放棒。
接下來構(gòu)建和評估五個模型:
# Spot Check Algorithms
models = []
models.append(('LR', LogisticRegression()))
models.append(('LDA', LinearDiscriminantAnalysis()))
models.append(('KNN', KNeighborsClassifier()))
models.append(('CART', DecisionTreeClassifier()))
models.append(('NB', GaussianNB()))
models.append(('SVM', SVC()))
# evaluate each model in turn
results = []
names = []
for name, model in models:
kfold = model_selection.KFold(n_splits=10, random_state=seed)
cv_results = model_selection.cross_val_score(model, X_train, Y_train, cv=kfold, scoring=scoring)
results.append(cv_results)
names.append(name)
msg = "%s: %f (%f)" % (name, cv_results.mean(), cv_results.std())
print(msg)
5.4 選擇最好的模型
這樣就得到了6個模型和他們的精確度估計姻报,運行上面的代碼得到如下的結(jié)果:
LR: 0.966667 (0.040825)
LDA: 0.975000 (0.038188)
KNN: 0.983333 (0.033333)
CART: 0.966667 (0.040825)
NB: 0.975000 (0.053359)
SVM: 0.991667 (0.025000)
看起來KNN得到了最大的精度估計。
我們也可以創(chuàng)建一張圖表來反映模型評估的結(jié)果间螟,每種算法都被評估了10次(10折交叉驗證)
# Compare Algorithms
fig = plt.figure()
fig.suptitle('Algorithm Comparison')
ax = fig.add_subplot(111)
plt.boxplot(results)
ax.set_xticklabels(names)
plt.show()
然后得到了箱線圖:
可以看到很多算法的精度都比較高吴旋。
6 做出預(yù)測
根據(jù)測試,KNN算法是精度最高的厢破,然后我們想得到在驗證集上的準確性荣瑟。
這將是我們對最優(yōu)模型獨立性的一個最終確認。這樣做是有意義的摩泪,以防止訓練中出現(xiàn)的失誤笆焰,例如數(shù)據(jù)的過擬合或者數(shù)據(jù)泄露。這都會導致一個過于樂觀的結(jié)果见坑。
我們可以驗證數(shù)據(jù)集上直接運行KNN模型嚷掠,總結(jié)結(jié)果作為最終分數(shù),混淆矩陣(confusion matrix)和分類報告鳄梅。
# Make predictions on validation dataset
knn = KNeighborsClassifier()
knn.fit(X_train, Y_train)
predictions = knn.predict(X_validation)
print(accuracy_score(Y_validation, predictions))
print(confusion_matrix(Y_validation, predictions))
print(classification_report(Y_validation, predictions))
可以看到精確度是0.9或者說是90%叠国,混淆矩陣提示了三類錯誤。最后分類報告提供了每一類的準確率戴尸,召回率粟焊,F(xiàn)1值,并顯示了優(yōu)異的結(jié)果
0.9
[[ 7 0 0]
[ 0 11 1]
[ 0 2 9]]
precision recall f1-score support
Iris-setosa 1.00 1.00 1.00 7
Iris-versicolor 0.85 0.92 0.88 12
Iris-virginica 0.90 0.82 0.86 11
avg / total 0.90 0.90 0.90 30
這里補充一下:
precision 體現(xiàn)了模型對負樣本的區(qū)分能力孙蒙,precision越高项棠,說明模型對負樣本的區(qū)分能力越強。recall 體現(xiàn)了分類模型H對正樣本的識別能力挎峦,recall 越高香追,說明模型對正樣本的識別能力越強。F1-score 是兩者的綜合坦胶。F1-score 越高透典,說明分類模型越穩(wěn)健晴楔。
classification_repor的最后一行是用support 加權(quán)平均算出來的,如:
0.90 =( 1.007 + 0.8512 + 0.9*11) / 30
總結(jié)
這一節(jié)我們一步步的學習了如何使用Python完成一個簡單的機器學習工程峭咒。
從加載數(shù)據(jù)開始到預(yù)測結(jié)果的一個小的工程税弃,是熟悉一個新平臺的最佳途徑。
本人初學凑队,如有不足之處则果,好望高手們指教。