用Python 自學資料科學與機器學習入門實戰:Scikit Learn 基礎 ...
文章推薦指數: 80 %
如何使用Python 學習機器學習(Machine Learning). 引入模組 # 引入numpy、pd 和sklearn(scikit-learn) 模組 import numpy as np import pandas as ...
TechBridge技術共筆部落格
Menu
Home
About
Tags
Archives
RSS
SignIn
前言
本系列文章將透過Python及其資料科學與機器學習生態系(Numpy、Scipy、Pandas、scikit-learn、Statsmodels、Matplotlib、Scrapy、Keras、TensorFlow等)來系統性介紹資料科學與機器學習相關的知識。
在這個單元中我們將介紹scikit-learn這個機器學習和資料分析神兵利器和基本的機器學習工作流程。
接下來我們的範例將會使用Ananconda、Python3和JupyterNotebook開發環境進行,若還沒安裝環境的讀者記得先行安裝。
首先我們先來認識一下基本機器學習工作流程,讓讀者對於機器學習工作流有基本而全面的認識。
基本機器學習工作流程(MachineLearningWorkflow)
明確定義問題(ProblemDefinition)
獲取資料與探索性資料分析(GetData&ExploratoryDataAnalysis)
資料預處理與特徵工程(DataClean/Preprocessing&FeatureEngineering)
訓練模型與校調(ModelTraining)
模型驗證(ModelPredict&Testing)
模型優化(ModelOptimization)
上線運行(DeployModel)
明確定義問題(ProblemDefinition)
明確定義問題是進行機器學習工作流的第一步。
由於機器學習和一般的Web網頁應用程式開發比較不一樣,其需要的運算資源和時間成本比較高,若能一開始就定義好問題並將問題抽象為數學問題將有助於我們要蒐集的資料集和節省工作流程的時間。
舉例來說,本篇文章範例希望預測Iris鳶尾花屬於哪一個類別(setosa山鳶尾、versicolor變色鳶尾、virginica維吉尼亞鳶尾),這邊我們就可以決定是要進行有對應結果的監督式學習:二元分類問題(binaryclassification)、多類別分類問題(multi-classification)還是連續量的迴歸問題(regression),或是沒有標籤結果的非監督式學習(例如:clustering)等,我們這邊假設這是一個多類別分類問題:給定未知資料希望能預測花朵屬於哪一類。
換句話說,就是說我們先定義好我們想要解決或是預測的問題,然後去蒐集對應的資料。
獲取資料與探索性資料分析(GetData&ExploratoryDataAnalysis)
基本上資料集的完整性某種程度決定了預測結果是否能發揮模型最大功效。
由於我們是教學文章,這邊我們的範例使用scikit-learn內建的玩具資料集Iris(鳶尾花)的花萼、花蕊長寬進行花朵類別判別(setosa山鳶尾、versicolor變色鳶尾、virginica維吉尼亞鳶尾)。
在這個資料集中已經幫我們標註好每筆資料對應的類別,所以我們可以視為多類別分類問題(multi-classification)。
引入模組
#引入numpy、pd和sklearn(scikit-learn)模組
importnumpyasnp
importpandasaspd
fromsklearnimportdatasets
#引入train_test_split分割方法,注意在sklearnv0.18後train_test_split從sklearn.cross_validation子模組搬到sklearn.model_selection中
fromsklearn.model_selectionimporttrain_test_split
#引入KNeighbors模型
fromsklearn.neighborsimportKNeighborsClassifier
fromsklearn.svmimportLinearSVC
引入資料集並進行探索性資料分析
#引入iris資料集
raw_iris=datasets.load_iris()
#探索性分析Exploratorydataanalysis,了解資料集內容
#先印出key值,列出有哪些值:['data','target','target_names','DESCR','feature_names']
print(raw_iris.keys())
#印出feature值
print(raw_iris['data'])
#印出目標值,分別對應的是三種花的類別:['setosa山鳶尾''versicolor變色鳶尾''virginica維吉尼亞鳶尾']
print(raw_iris['target'])
#印出目標標籤,三種花的類別:['setosa''versicolor''virginica']
print(raw_iris['target_names'])
#印出資料集內容描述
print(raw_iris['DESCR'])
#印出屬性名稱,['sepallength花萼長度(cm)','sepalwidth花萼寬度(cm)','petallength花蕊長度(cm)','petalwidth花蕊寬度(cm)']
print(raw_iris['feature_names'])
#類別種類
print(np.unique(raw_iris.target))
dict_keys(['data','target','target_names','DESCR','feature_names'])
[[5.13.51.40.2]
[4.93.1.40.2]
[4.73.21.30.2]
[4.63.11.50.2]
[5.3.61.40.2]
[5.43.91.70.4]
[4.63.41.40.3]
[5.3.41.50.2]
[4.42.91.40.2]
[4.93.11.50.1]
[5.43.71.50.2]
[4.83.41.60.2]
[4.83.1.40.1]
[4.33.1.10.1]
[5.84.1.20.2]
[5.74.41.50.4]
[5.43.91.30.4]
[5.13.51.40.3]
[5.73.81.70.3]
[5.13.81.50.3]
[5.43.41.70.2]
[5.13.71.50.4]
[4.63.61.0.2]
[5.13.31.70.5]
[4.83.41.90.2]
[5.3.1.60.2]
[5.3.41.60.4]
[5.23.51.50.2]
[5.23.41.40.2]
[4.73.21.60.2]
[4.83.11.60.2]
[5.43.41.50.4]
[5.24.11.50.1]
[5.54.21.40.2]
[4.93.11.50.1]
[5.3.21.20.2]
[5.53.51.30.2]
[4.93.11.50.1]
[4.43.1.30.2]
[5.13.41.50.2]
[5.3.51.30.3]
[4.52.31.30.3]
[4.43.21.30.2]
[5.3.51.60.6]
[5.13.81.90.4]
[4.83.1.40.3]
[5.13.81.60.2]
[4.63.21.40.2]
[5.33.71.50.2]
[5.3.31.40.2]
[7.3.24.71.4]
[6.43.24.51.5]
[6.93.14.91.5]
[5.52.34.1.3]
[6.52.84.61.5]
[5.72.84.51.3]
[6.33.34.71.6]
[4.92.43.31.]
[6.62.94.61.3]
[5.22.73.91.4]
[5.2.3.51.]
[5.93.4.21.5]
[6.2.24.1.]
[6.12.94.71.4]
[5.62.93.61.3]
[6.73.14.41.4]
[5.63.4.51.5]
[5.82.74.11.]
[6.22.24.51.5]
[5.62.53.91.1]
[5.93.24.81.8]
[6.12.84.1.3]
[6.32.54.91.5]
[6.12.84.71.2]
[6.42.94.31.3]
[6.63.4.41.4]
[6.82.84.81.4]
[6.73.5.1.7]
[6.2.94.51.5]
[5.72.63.51.]
[5.52.43.81.1]
[5.52.43.71.]
[5.82.73.91.2]
[6.2.75.11.6]
[5.43.4.51.5]
[6.3.44.51.6]
[6.73.14.71.5]
[6.32.34.41.3]
[5.63.4.11.3]
[5.52.54.1.3]
[5.52.64.41.2]
[6.13.4.61.4]
[5.82.64.1.2]
[5.2.33.31.]
[5.62.74.21.3]
[5.73.4.21.2]
[5.72.94.21.3]
[6.22.94.31.3]
[5.12.53.1.1]
[5.72.84.11.3]
[6.33.36.2.5]
[5.82.75.11.9]
[7.13.5.92.1]
[6.32.95.61.8]
[6.53.5.82.2]
[7.63.6.62.1]
[4.92.54.51.7]
[7.32.96.31.8]
[6.72.55.81.8]
[7.23.66.12.5]
[6.53.25.12.]
[6.42.75.31.9]
[6.83.5.52.1]
[5.72.55.2.]
[5.82.85.12.4]
[6.43.25.32.3]
[6.53.5.51.8]
[7.73.86.72.2]
[7.72.66.92.3]
[6.2.25.1.5]
[6.93.25.72.3]
[5.62.84.92.]
[7.72.86.72.]
[6.32.74.91.8]
[6.73.35.72.1]
[7.23.26.1.8]
[6.22.84.81.8]
[6.13.4.91.8]
[6.42.85.62.1]
[7.23.5.81.6]
[7.42.86.11.9]
[7.93.86.42.]
[6.42.85.62.2]
[6.32.85.11.5]
[6.12.65.61.4]
[7.73.6.12.3]
[6.33.45.62.4]
[6.43.15.51.8]
[6.3.4.81.8]
[6.93.15.42.1]
[6.73.15.62.4]
[6.93.15.12.3]
[5.82.75.11.9]
[6.83.25.92.3]
[6.73.35.72.5]
[6.73.5.22.3]
[6.32.55.1.9]
[6.53.5.22.]
[6.23.45.42.3]
[5.93.5.11.8]]
[0000000000000000000000000000000000000
0000000000000111111111111111111111111
1111111111111111111111111122222222222
2222222222222222222222222222222222222
22]
['setosa''versicolor''virginica']
IrisPlantsDatabase
====================
Notes
-----
DataSetCharacteristics:
:NumberofInstances:150(50ineachofthreeclasses)
:NumberofAttributes:4numeric,predictiveattributesandtheclass
:AttributeInformation:
-sepallengthincm
-sepalwidthincm
-petallengthincm
-petalwidthincm
-class:
-Iris-Setosa
-Iris-Versicolour
-Iris-Virginica
:SummaryStatistics:
======================================================
MinMaxMeanSDClassCorrelation
======================================================
sepallength:4.37.95.840.830.7826
sepalwidth:2.04.43.050.43-0.4194
petallength:1.06.93.761.760.9490(high!)
petalwidth:0.12.51.200.760.9565(high!)
======================================================
:MissingAttributeValues:None
:ClassDistribution:33.3%foreachof3classes.
:Creator:R.A.Fisher
:Donor:MichaelMarshall(MARSHALL%[email protected])
:Date:July,1988
ThisisacopyofUCIMLirisdatasets.
http://archive.ics.uci.edu/ml/datasets/Iris
ThefamousIrisdatabase,firstusedbySirR.AFisher
Thisisperhapsthebestknowndatabasetobefoundinthe
patternrecognitionliterature.Fisher'spaperisaclassicinthefieldand
isreferencedfrequentlytothisday.(SeeDuda&Hart,forexample.)The
datasetcontains3classesof50instanceseach,whereeachclassreferstoa
typeofirisplant.Oneclassislinearlyseparablefromtheother2;the
latterareNOTlinearlyseparablefromeachother.
References
----------
-Fisher,R.A."Theuseofmultiplemeasurementsintaxonomicproblems"
AnnualEugenics,7,PartII,179-188(1936);alsoin"Contributionsto
MathematicalStatistics"(JohnWiley,NY,1950).
-Duda,R.O.,&Hart,P.E.(1973)PatternClassificationandSceneAnalysis.
(Q327.D83)JohnWiley&Sons.ISBN0-471-22361-1.Seepage218.
-Dasarathy,B.V.(1980)"NosingAroundtheNeighborhood:ANewSystem
StructureandClassificationRuleforRecognitioninPartiallyExposed
Environments".IEEETransactionsonPatternAnalysisandMachine
Intelligence,Vol.PAMI-2,No.1,67-71.
-Gates,G.W.(1972)"TheReducedNearestNeighborRule".IEEETransactions
onInformationTheory,May1972,431-433.
-Seealso:1988MLCProceedings,54-64.Cheesemanetal"sAUTOCLASSII
conceptualclusteringsystemfinds3classesinthedata.
-Many,manymore...
['sepallength(cm)','sepalwidth(cm)','petallength(cm)','petalwidth(cm)']
[012]
資料預處理與特徵工程(DataClean/Preprocessing&FeatureEngineering)
良好的資料輸入取決於資料預處理與特徵工程,而好的輸入將大大影響到模型是否可以發揮其理論正常水準。
以下把資料轉成DataFrame格式方便進行操作。
由於這邊的資料集已經是相當完整的資料集,所以我們這邊就不用特別進行資料預處理和特徵工程的部份,然而在真實世界中,真正在進行機器學習工作流程的時候資料預處理往往是最花時間的部份。
同時為了方便模型的校調,我們這邊把資料集分為70%訓練資料,30%驗證資料。
#將資料轉為pandasDataFrame
#data為觀察目標變數
df_X=pd.DataFrame(raw_iris.data)
#target為預測變數
df_y=pd.DataFrame(raw_iris.target)
#將資料切分為trainingdata和testingdata,其中random_state若設為0或不設則即便實例不同但因種子相同產生同樣隨機編號,若設為1則每次隨機產生不同編號
#test_size為切分trainingdata和testingdata的比例
X_train,X_test,y_train,y_test=train_test_split(df_X,df_y,test_size=0.3)
#印出所有資料集筆數
print(len(df_y))
150
#印出切分y_train的數量為所有資料集的70%,共105筆
print(y_train)
print(len(y_train))
0
390
1062
991
00
160
1182
801
290
110
1042
1002
721
1082
420
200
310
1152
1112
891
831
1302
410
661
1202
1132
60
1262
621
230
971
....
100
761
1292
1442
1372
120
791
1232
1272
360
741
370
1312
1102
220
320
1472
1342
1022
751
881
1482
330
561
280
901
821
250
1212
130
[105rowsx1columns]
105
#印出切分的y_test資料為所有資料集的30%,共45筆
print(y_test)
print(len(y_test))
0
1022
531
1432
701
611
671
240
1242
360
921
1142
310
1202
871
741
470
691
561
931
160
1442
1332
290
571
1162
501
861
440
30
210
821
991
1342
1112
1352
40
20
911
851
1222
1272
110
270
791
511
45
訓練模型與校調(ModelTraining)
上面是scikit-learn提供的演算法cheat-sheet,當你面對琳琅滿目的模型一開始不知道要選擇什麼的話可以按圖索驥參考,另外這邊提供大圖支援連結。
這邊我們參考上圖來選擇適合模型:
樣本資料是否大於50筆:範例資料集總共有150筆資料,大於50
是否為分類問題:Iris花朵類別預測是多類別分類問題
是否有標籤好的資料:已經有label資料
樣本資料是否小於100K:資料小於100K
選擇LinearSVC模型(第一個選擇的模型)
是否是文字資料:不是
選擇KNeighborsClassifier模型(第二個選擇的模型)
後續優化/SVC/Ensemble
#初始化LinearSVC實例
lin_clf=LinearSVC()
#使用fit來建置模型,其參數接收trainingdatamatrix,testingdataarray,所以進行y_train.values.ravel()DataFrame轉換
lin_clf.fit(X_train,y_train.values.ravel())
LinearSVC(C=1.0,class_weight=None,dual=True,fit_intercept=True,
intercept_scaling=1,loss='squared_hinge',max_iter=1000,
multi_class='ovr',penalty='l2',random_state=None,tol=0.0001,
verbose=0)
#初始化KNeighborsClassifier實例
knn=KNeighborsClassifier()
#使用fit來建置模型,其參數接收trainingdatamatrix,testingdataarray,所以進行y_train.values.ravel()轉換
knn.fit(X_train,y_train.values.ravel())
KNeighborsClassifier(algorithm='auto',leaf_size=30,metric='minkowski',
metric_params=None,n_jobs=1,n_neighbors=5,p=2,
weights='uniform')
模型驗證(ModelPredict&Testing)
監督式學習的分類問題通常會分為訓練模型和驗證模型,這邊我們使用predict去產生對應的目標值,此時和正確答案(已經標籤好的目標值)比較可以知道模型預測的正確率。
我們可以看到KNeighborsClassifier在正確率(accuracy)表現上相對比較好一點(0.98比0.93)。
#使用X_test來預測結果
print(lin_clf.predict(X_test))
[1102120112210200212001202120001021100
01012211]
#印出預測準確率
print(lin_clf.score(X_test,y_test))
0.933333333333
#使用X_test來預測結果
print(knn.predict(X_test))
[1101120112210200212001202120001011100
01012211]
#印出testingdata預測標籤機率
print(knn.predict_proba(X_test))
[[0.1.0.]
[0.1.0.]
[1.0.0.]
[0.0.80.2]
[0.1.0.]
[0.0.1.]
[1.0.0.]
[0.1.0.]
[0.1.0.]
[0.0.1.]
[0.0.1.]
[0.1.0.]
[1.0.0.]
[0.0.1.]
[1.0.0.]
[1.0.0.]
[0.0.1.]
[0.1.0.]
[0.0.1.]
[1.0.0.]
[1.0.0.]
[0.1.0.]
[0.0.1.]
[1.0.0.]
[0.0.20.8]
[0.1.0.]
[0.0.1.]
[1.0.0.]
[1.0.0.]
[1.0.0.]
[0.1.0.]
[1.0.0.]
[0.1.0.]
[0.1.0.]
[0.1.0.]
[1.0.0.]
[1.0.0.]
[1.0.0.]
[0.0.60.4]
[1.0.0.]
[0.1.0.]
[0.0.1.]
[0.0.1.]
[0.1.0.]
[0.1.0.]]
#印出預測準確率
print(knn.score(X_test,y_test))
0.977777777778
模型優化(ModelOptimization)
由於本文是簡易範例,這邊就沒有示範如何進行模型優化(這邊可以嘗試使用SVC和Ensemble方法)。
不過一般來說在分類模型優化上,讓模型預測表現的更好的方法大約有幾種:
特徵工程:選擇更適合特徵值或是更好的資料清理,某種程度上很需要專業知識的協助(domainkonwledge)去發現和整合出更好的feature
調整模型參數:調整模型的參數
模型融合:結合幾個弱分類器結果來變成強的分類器
上線運行(DeployModel)
當模型優化完畢就可以進行上線運行,其中Python比R更具優勢的地方,那就是Python很容易跟現有的系統進行整合,Python也有許多好用的Web框架可以使用,也因為Python是膠水語言,若要進行效能優化也可以很容易呼叫C/C++進行操作,提昇執行效能。
總結
以上用一個簡單的範例介紹了Python機器學習套件ScikitLearn的基本功能和機器學習整個基本Workflow。
由於是基礎範例所以省略一些比較繁瑣的資料處理部分,事實上,真實世界資料大多是非結構化資料的髒資料,而資料分析的過程往往需要花上許多時間進行資料預處理和資料清理上。
接下來我們將介紹其他Python資料科學和機器學習生態系和相關工具。
延伸閱讀
机器学习实战之kNN分类
MachineLearningWorkflow
Kaggle机器学习之模型融合(stacking)心得
Python資料視覺化
Train&Predictworkflow
SampleClassificationPipelineworkflow
【机器学习】模型融合方法概述
關於作者:
@kdchang文藝型開發者,夢想是做出人們想用的產品和辦一所心目中理想的學校。
AStarter,SoftwareEngineer&Maker.JavaScript,Python&Arduino/Androidlover.InterestedinInternet,AIandBlockchain.:)
(imageviamedium、mapr、silvrback、camo、scipy、mirlab、concreteinteractive、sndimg)
#Python
#machinelearning
#機器學習
#AI
#artificialintelligence
#NLP
#DataMining
#人工智慧
#監督式學習
#Supervisedlearning
#從零開始學資料科學
#Numpy
#資料科學
#datascience
#datascientist
#pandas
KDChang
Follow
Following
Founder@TechBridge/CoderBridge
AStarter,SoftwareEngineer&Maker.JavaScript&Pythonlover.:)
工程師/創業者/教育者/寫作者
Facebook
RelatedPosts
筆記、View/Storedprocedure/trigger
s103071049
[筆記]HTML-tag基礎標籤
krebikshaw
第二週(04/19~04/25):程式基礎(上)
Torai
Newsletter
Subscribe
Comments
Submit
SignIntojoininthediscussion.
Edit
Submit
Edit
Submit
Reply
Submit
延伸文章資訊
- 1使用scikit-learn进行机器学习的简介
在scikit-learn中,分类的估计量是一个实现 fit(X, y) 方法和 predict(T) 方法的Python对象。 一个估计量的例子是实现了支持向量分类 的 sklearn.svm...
- 2簡介Scikit-learn 機器學習
對於初學者,最建議的方式是直接下載Anaconda Python (https://www.continuum.io/downloads)。同時支援 Windows / OSX/ Linux 等...
- 3機器學習筆記: 初探scikit-learn 套件 - 小狐狸事務所
Scikit-learn 套件沒有自訂資料類別, 完全使用Python 本身的資料結構與Numpy 陣列, 並在其所有實作的演算法中提供了一致的呼叫介面, 只要修改幾行程式碼即 ...
- 4精通機器學習:使用Scikit-Learn, Keras與TensorFlow 第二版
這本暢銷書新版本使用具體的案例、精簡的理論,以及Python準生產框架,協助你直觀地認識智慧系統的概念與建構工具。 你將學到可快速上手的技術,只要具備程式編寫經驗,就 ...
- 5Python機器學習-使用Scikit-Learn - 恆逸教育訓練中心
Python機器學習-使用Scikit-Learn. Introduction to Machine Learning–Using Python Scikit-Learn. 時數:21小時; 費...