日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

二、模型评估方法

發布時間:2023/12/1 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 二、模型评估方法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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文件夾

#查看下路徑 from sklearn.datasets.base import get_data_home print (get_data_home())#C:\Users\MyPC\scikit_learn_data from sklearn.datasets import fetch_openml mnist = fetch_openml("mnist_784")#手寫數字識別數據集,量少好觀察 print(mnist) #數據集中,X是mnist,里面存放類似字典的結構,里面所有數據的key是data;y是標簽存放target #X=mnist將data傳入;y=mnist將target傳入 X, y = mnist["data"], mnist["target"] X.shape#(70000, 784) 當前樣本數量一共7w個,784=28*28*1 y.shape#(70000,) 第一行標簽為0,第二行標簽為1,以此類推,共70000行

#前6w張當作訓練集training,后1w張當作測試集testing #1-6w 這6w個樣本為訓練集training、6w到最后7w 這1w個樣本為testing測試集 X_train, X_test, y_train, y_test = X[:60000], X[60000:], y[:60000], y[60000:] # 因為是數據之間是獨立的,故需要洗牌操作,將training訓練集和testing測試集打亂順序 import numpy as npshuffle_index = np.random.permutation(60000)#打算數據集的index X_train, y_train = X_train[shuffle_index], y_train[shuffle_index]#回傳給數據集,相當于洗牌打亂操作 #原始index值為0,1,2,...,打亂順序之后的index如下所示 shuffle_index#array([12628, 37730, 39991, ..., 860, 15795, 56422])

三、交叉驗證

由上幾步可得,將數據集的前6w為訓練集training,后1w為測試集testing

首先:將整個數據集分為兩部分訓練集和測試集,其中測試集相當于高考,測試集是非常非常寶貴的東西,僅此一次。故為了效果更好,需要中途在進行幾次模擬考試類似期中期末考試,這時候需要從訓練集中再抽取出一部分充當期中期末考試,即驗證集validation。

例如:training中有5份樣本,交叉驗證就是將這5份打亂,依次從中隨機抽取1份為validation,剩下的為training。然后每次通過模型去訓練,得出一個預測結果,求取平均值即可。

# 為了簡單起見,這里只判斷樣本是否是5 y_train_5 = (y_train==5)#是否是5 y_test_5 = (y_test==5)#將10分類轉換為2分類進行演示 #訓練集前十個樣本是不是5 y_train_5[:10]#array([False, False, False, False, False, False, False, False, False, True])

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方法。

from sklearn.model_selection import StratifiedKFold from sklearn.base import cloneskflods = StratifiedKFold(n_splits=3,random_state=42)#將數據集分成3分,隨機種子這里設置的為42 for train_index,test_index in skflods.split(X_train,y_train_5):#對每一份數據集進行fit操作,split方法,切分數據集和標簽clone_clf = clone(sgd_clf)#克隆分類器X_train_folds = X_train[train_index]#通過索引找圖片樣本y_train_folds = y_train_5[train_index]#這三類訓練和測試數據都要來源于trainingX_test_folds = X_train[test_index]y_test_folds = y_train_5[test_index]clone_clf.fit(X_train_folds,y_train_folds)y_pred = clone_clf.predict(X_test_folds)n_correct = sum(y_pred == y_test_folds)print(n_correct/len(y_pred)) """ 0.9502 0.96565 0.96495 """

四、Confusion Matrix-混淆矩陣

已知條件:一個班100人,男80,女20。
目標:找出所有女生。
結果:從班里面找了50人,其中20個女的,30個男的。

相關Relevant,正類無關NonRelevant,負類
被檢索到RetrievedTrue Positives,TP正類判定為正類,即準確判斷出這是為女生False Positives,FP負類判定為正類,“存偽”,即分明是男生,卻判斷出是女生
沒被檢索到NotRetrievedFalse Negatives,FN正類判定為負類,“去真”,即分明是女生,卻判斷出是男生True Negatives,TN負類判定為負類,即一個男生被判定是男生

故TP=20;FP=30;FN=0;TN=50


cross_val_predict方法的詳細參數

""" 參數一:分類器的名稱 參數二:訓練集 參數三:標簽 參數四:分成幾份 """ from sklearn.model_selection import cross_val_predict y_train_pred = cross_val_predict(sgd_clf,X_train,y_train_5,cv=3) y_train_pred.shape#(60000,)#訓練的時候傳入了6w個樣本,得到6w個樣本的預測結果 X_train.shape#(60000, 784)


confusion_matrix方法的詳細參數

""" 一般的混淆矩陣參數為2×2 參數一:訓練值 參數二:實際預測結果 """ from sklearn.metrics import confusion_matrix confusion_matrix(y_train_5,y_train_pred) """ array([[53272, 1307],[ 1077, 4344]], dtype=int64) """

對于array數組中參數分析:

五、Precision精度 and Recall召回率



Positives:==5
Negatives: ≠5


precision_score方法的詳細參數

recall_score方法的詳細參數

from sklearn.metrics import precision_score,recall_score precision_score(y_train_5,y_train_pred)#0.7687135020350381 recall_score(y_train_5,y_train_pred)#0.801328168234643

將Precision 和 Recall結合到一個稱為F1 score 的指標,調和平均值給予低值更多權重。 因此,如果召回和精確度都很高,分類器將獲得高F 1分數。


f1_score方法的詳細參數

from sklearn.metrics import f1_score f1_score(y_train_5,y_train_pred)#0.7846820809248555

六、閾值對結果的影響


decision_function方法的詳細參數

y_scores = sgd_clf.decision_function([X[35000]]) y_scores#array([43349.73739616]) t = 50000 y_pred = (y_scores > t)#設置閾值 y_pred#array([False])

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的變換如下:

def plot_precision_vs_recall(precisions, recalls):plt.plot(recalls, precisions, "b-", linewidth=2)plt.xlabel("Recall", fontsize=16)plt.ylabel("Precision", fontsize=16)plt.axis([0, 1, 0, 1])plt.figure(figsize=(8, 6)) plot_precision_vs_recall(precisions, recalls) plt.show()

七、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)

from sklearn.metrics import roc_curve fpr, tpr, thresholds = roc_curve(y_train_5, y_scores) def plot_roc_curve(fpr, tpr, label=None):plt.plot(fpr, tpr, linewidth=2, label=label)plt.plot([0, 1], [0, 1], 'k--')plt.axis([0, 1, 0, 1])plt.xlabel('False Positive Rate', fontsize=16)plt.ylabel('True Positive Rate', fontsize=16)plt.figure(figsize=(8, 6)) plot_roc_curve(fpr, tpr) plt.show()


虛線表示純隨機分類器的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

總結

以上是生活随笔為你收集整理的二、模型评估方法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。