用Python 自學資料科學與機器學習入門實戰:Scikit Learn 基礎 ...

文章推薦指數: 80 %
投票人數:10人

如何使用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



請為這篇文章評分?