二、模型评估方法
IDE為Jupyter Notebook
scikit-learn官網
scikit-learn是一個專門用于機器學習的工具包
運用到啥函數不知道咋使用?戳它–>scikit-learn工具包的API文檔
不知道用啥模板?戳它–>scikit-learn樣例模型
| Classification | 分類 |
| Regression | 回歸 |
| Clustering | 聚類 |
| Dimensionality reduction | 降維算法 |
| Model selection | 模型選擇 |
| Preprocessing | 數據預處理 |
一、首先導入相關的工具包,以及x軸y軸字體大小設置
import numpy as np import os %matplotlib inline import matplotlib import matplotlib.pyplot as plt plt.rcParams['axes.labelsize'] = 14 plt.rcParams['xtick.labelsize'] = 12 plt.rcParams['ytick.labelsize'] = 12 import warnings warnings.filterwarnings('ignore') np.random.seed(42)二、數據集讀取
使用的數據集是sklearn內置數據集,MNIST手寫數字識別數據集,70000張灰度圖像的數字,大小為(28,28,1),28 * 28 * 1=784,每一個圖像樣本都有784個像素點,可以的等價于784個特征。
免費MNIST手寫數字識別數據集下載
將下載好的mnist-original放到C:\Users\MyPC\scikit_learn_data下創建一個mldata文件夾
三、交叉驗證
由上幾步可得,將數據集的前6w為訓練集training,后1w為測試集testing
首先:將整個數據集分為兩部分訓練集和測試集,其中測試集相當于高考,測試集是非常非常寶貴的東西,僅此一次。故為了效果更好,需要中途在進行幾次模擬考試類似期中期末考試,這時候需要從訓練集中再抽取出一部分充當期中期末考試,即驗證集validation。
例如:training中有5份樣本,交叉驗證就是將這5份打亂,依次從中隨機抽取1份為validation,剩下的為training。然后每次通過模型去訓練,得出一個預測結果,求取平均值即可。
SGDClassifier的方法詳細參數
#SGDClassifier 梯度下降分類器 from sklearn.linear_model import SGDClassifier sgd_clf = SGDClassifier(max_iter=5,random_state=42)#max_iter最大迭代次數;random_state隨機種子,每次隨機策略都一樣 sgd_clf.fit(X_train,y_train_5)#通過SGD訓練分類器 ''' SGDClassifier(alpha=0.0001, average=False, class_weight=None,early_stopping=False, epsilon=0.1, eta0=0.0, fit_intercept=True,l1_ratio=0.15, learning_rate='optimal', loss='hinge', max_iter=5,n_iter=None, n_iter_no_change=5, n_jobs=None, penalty='l2',power_t=0.5, random_state=42, shuffle=True, tol=None,validation_fraction=0.1, verbose=0, warm_start=False) ''' #訓練完成之后,對該分類器進行測試,預測35000這個樣本是5,為啥?然后進行通過索引查下是否是5 sgd_clf.predict([X[35000]])#array([ True]) #通過索引驗證下35000樣本是否是5 y[35000]#5.0Ⅰ交叉驗證的實現
cross_val_score方法的詳細參數
""" 參數一:將訓練的模型傳入進來 參數二:傳入當前的訓練數據 參數三:當前的標簽 參數四:cv=3表示把數據集切分成3分,最后進行3次交叉驗證,會輸出3個交叉驗證的結果 參數五:使用什么指標進行評估得分,accuracy表示使用準確率來進行評估 """ from sklearn.model_selection import cross_val_score cross_val_score(sgd_clf,X_train,y_train_5,cv=3,scoring='accuracy')#array([0.9502 , 0.96565, 0.96495]) X_train.shape#(60000, 784)#訓練的時候傳入了6w個樣本 y_train_5.shape#(60000,)Ⅱ自己對數據集進行切分訓練預測
StratifiedKFold方法的詳細參數
clone方法的詳細參數
因為把數據集切分為多份,每一份都需要用的和原來一樣的分類器,相同的模型,相同的參數。
交叉驗證為了保證公平,每次傳入的參數都是相同的。為了保證公平,使用了clone方法。
四、Confusion Matrix-混淆矩陣
已知條件:一個班100人,男80,女20。
目標:找出所有女生。
結果:從班里面找了50人,其中20個女的,30個男的。
| 被檢索到Retrieved | True Positives,TP正類判定為正類,即準確判斷出這是為女生 | False Positives,FP負類判定為正類,“存偽”,即分明是男生,卻判斷出是女生 |
| 沒被檢索到NotRetrieved | False Negatives,FN正類判定為負類,“去真”,即分明是女生,卻判斷出是男生 | True Negatives,TN負類判定為負類,即一個男生被判定是男生 |
故TP=20;FP=30;FN=0;TN=50
cross_val_predict方法的詳細參數
confusion_matrix方法的詳細參數
對于array數組中參數分析:
五、Precision精度 and Recall召回率
Positives:==5
Negatives: ≠5
precision_score方法的詳細參數
recall_score方法的詳細參數
將Precision 和 Recall結合到一個稱為F1 score 的指標,調和平均值給予低值更多權重。 因此,如果召回和精確度都很高,分類器將獲得高F 1分數。
f1_score方法的詳細參數
六、閾值對結果的影響
decision_function方法的詳細參數
Scikit-Learn不允許直接設置閾值,但它可以得到決策分數,調用其decision_function()方法,而不是調用分類器的predict()方法,該方法返回每個實例的分數,然后使用想要的閾值根據這些分數進行預測:
y_scores = cross_val_predict(sgd_clf, X_train, y_train_5, cv=3, method="decision_function") y_scores[:10] """ array([ -434076.49813641, -1825667.15281624, -767086.76186905,-482514.55006702, -466416.8082872 , -311904.74603814,-582112.5580173 , -180811.15850786, -442648.13282116,-87710.09830358]) """ from sklearn.metrics import precision_recall_curve precisions, recalls, thresholds = precision_recall_curve(y_train_5, y_scores) y_train_5.shape#(60000,)#6w個樣本 thresholds.shape#(59698,)#59698個閾值 precisions[:10] """ array([0.09080706, 0.09079183, 0.09079335, 0.09079487, 0.09079639,0.09079792, 0.09079944, 0.09080096, 0.09080248, 0.090804 ]) """ precisions.shape#(59699,)#59699個閾值 recalls.shape#(59699,)#59699個閾值對于不同的閾值,隨著閾值的變換,精度和召回率變換的情況如下:
def plot_precision_recall_vs_threshold(precisions,recalls,thresholds):plt.plot(thresholds,precisions[:-1],"b--",label="Precision")plt.plot(thresholds,recalls[:-1],"g-",label="Recall")plt.xlabel("Threshold",fontsize=16)plt.legend(loc="upper left",fontsize=16)plt.ylim([0,1])plt.figure(figsize=(8, 4)) plot_precision_recall_vs_threshold(precisions,recalls,thresholds) plt.xlim([-700000, 700000]) plt.show()
隨著Recall的變換,Precision的變換如下:
七、ROC curves(常用)
receiver operating characteristic (ROC) 曲線是二元分類中的常用評估方法
①它與精確度/召回曲線非常相似,但ROC曲線不是繪制精確度與召回率,而是繪制true positive rate(TPR) 與false positive rate(FPR)
②要繪制ROC曲線,首先需要使用roc_curve()函數計算各種閾值的TPR和FPR:
TPR = TP / (TP + FN) (Recall)
FPR = FP / (FP + TN)
虛線表示純隨機分類器的ROC曲線; 一個好的分類器盡可能遠離該線(朝左上角)。
比較分類器的一種方法是測量曲線下面積(AUC)。完美分類器的ROC AUC等于1,而純隨機分類器的ROC AUC等于0.5。 Scikit-Learn提供了計算ROC AUC的函數:
from sklearn.metrics import roc_auc_scoreroc_auc_score(y_train_5, y_scores)#0.9624496555967156總結
- 上一篇: 颐和园几点关门
- 下一篇: 三、线性回归实验分析