1. 程式人生 > 其它 >scikit基礎與機器學習入門(3)機器學習任務的一般流程——以鳶尾花分類為例

scikit基礎與機器學習入門(3)機器學習任務的一般流程——以鳶尾花分類為例

機器學習任務的一般流程

本文以鳶尾花資料集為例,對機器學習人物的一般步驟進行了梳理

下面是baseline

資料的獲取/匯入

首先匯入有關的庫

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
from sklearn import datasets

這裡匯入iris庫

iris =  datasets.load_iris()

匯入後的資料庫是一個字典,其中data類為內容,feature_names為特徵名,target為分類

利用內容和特徵名構建DataFrame

data = pd.DataFrame(iris.data, columns=iris.feature_names)

可以進行簡單的視覺化

data.plot()

資料的預處理

一般包括資料標準化,資料歸一化,資料二值化,非線性轉換,資料特徵編碼,處理缺失值等

from sklearn import preprocessing
scaler = preprocessing.MinMaxScaler()    #將樣本特徵值縮放到0,1之間
scaler.fit(iris.data)    #先fit
data = scaler.transform(iris.data)     #再transform,得到輸入模型的資料

和前面講的一樣對於這種API都是先fit再transform

被縮放後的資料如圖所示

target = iris.target  #作為特徵備用

模型的訓練

根據問題特點選擇適當的估計器estimater模型

  • 分類
  • 迴歸
  • 聚類
  • 降維

資料集的劃分

首先進行資料集的劃分

from sklearn.model_selection import train_test_split

劃分資料集的方法在model_selection模組中

X_train,X_test,Y_train,Y_test = train_test_split(data,target,test_size=1/3)

引數指測試集所佔比例

模型的訓練

匯入支援向量機進行分類

from sklearn import svm
clf = svm.SVC(kernel = 'linear',C = 1,probability=True)    #匯入支援向量機,設定引數
clf.fit(X_train,Y_train)

用這種方法簡單地檢查一下正確率,為零的就是判斷無誤的

可以用get_params方法獲取模型有關引數

clf.get_params()

也可以獲取每一種可能的概率,此時需要匯入模型時的probability=True

clf.predict_proba(X_test)

利用cf.score對模型進行評分

clf.score(X_test,Y_test)
#對不同型別的模型有不同的評分演算法,由score內部決定

模型的評估

模型的評估和模型的優化相關功能再sklearn.model_selection中 除了使用estimator的score函式簡單評估之外,在sklearn.metrics模組提供了各種評估指標並且可以建立使用者自定義的評估值

詳細的評估方法

from sklearn.metrics import classification_report
print(classification_report(target,clf.predict(data),target_names = iris.target_names))

多折交叉驗證

from sklearn.model_selection import cross_val_score
scores = cross_val_score(clf, data, target, cv=5)    # cv後的數目是折數
scores

得到一個數組,分別是每次交叉驗證的值

所以可得到結論

print('Accuracy: %0.2f(+/-%0.2f)'%(scores.mean(),scores.std()*2))

假設結果呈正態分佈

模型的優化

優化模型的方法包括:網格搜尋法,隨機搜尋法,模型特定交叉驗證,資訊準則優化

網格搜尋法在指定的超引數空間中對每一種可能的情況進行交叉驗證評分並選出最好的超引數組合

這裡用網格搜尋法來搜尋最佳引數

from sklearn import svm
from sklearn.model_selection import GridSearchCV
svc = svm.SVC()   #注意,這裡沒有引數

設定備擇引數

param_grid = [{'C':[0.1, 1, 10, 100, 1000],'kernel':['linear']},
             {'C':[0.1, 1, 10, 100, 1000],'gamma':[0.001,0.01],'kernel':['rbf']}]

設定尋優標準

scoring = 'accuracy'

然後進行網格搜尋

clf = GridSearchCV(svc, param_grid,scoring = scoring, cv=10)
clf.fit(data,target)

得到的是一個優化的分類器

clf.predict(data)

可以利用get_params()進行引數查詢

{'cv': 10,
'error_score': nan,
'estimator__C': 1.0,
'estimator__break_ties': False,
'estimator__cache_size': 200,
'estimator__class_weight': None,
'estimator__coef0': 0.0,
'estimator__decision_function_shape': 'ovr',
'estimator__degree': 3,
'estimator__gamma': 'scale',
'estimator__kernel': 'rbf',
'estimator__max_iter': -1,
'estimator__probability': False,
'estimator__random_state': None,
'estimator__shrinking': True,
'estimator__tol': 0.001,
'estimator__verbose': False,
'estimator': SVC(),
'iid': 'deprecated',
'n_jobs': None,
'param_grid': [{'C': [0.1, 1, 10, 100, 1000], 'kernel': ['linear']},
 {'C': [0.1, 1, 10, 100, 1000], 'gamma': [0.001, 0.01], 'kernel': ['rbf']}],
'pre_dispatch': '2*n_jobs',
'refit': True,
'return_train_score': False,
'scoring': 'accuracy',
'verbose': 0}

利用best_params_和best_score_進行最優引數的搜尋

clf.best_params_
clf.best_score_

模型持久化

對於儲存的模型,如果要儲存,通常採取以下方式

import pickle
s = pickle.dumps(clf) #儲存模型為字串
clf2 = pickle.loads(s) #從字串中載入模型

其中s是一個字串

利用第三方庫一般是這種流程,可以用這個過程做一個模板,具體問題進行具體修改

很喜歡聽到一個老師說的“半年理論”,現在做出的努力,一般要在半年的沉澱之後,才能出結果,所以在遇到瓶頸之時,不妨再努力半年