1. 程式人生 > 其它 >python 中任務 6.3 構建並評分分類模型 學習筆記3

python 中任務 6.3 構建並評分分類模型 學習筆記3

技術標籤:第6章 使用scikit-learn構建模型

文章目錄

任務6.3 構建並評價分類模型

6.3.1 使用sklearn 估計器構建分類模型

程式碼6-17 使用sklearn估計器構建SVM模型

在資料分析領域,分類演算法有很多,其原理千差萬別,有基於樣本距離的最近鄰演算法,有基於特徵資訊熵的決策樹,有基於bagging的隨機森林 ,有基於boosting的梯度提升分類樹 ,但其實現的過程相差不大。過程如圖所示。

%%html
<img style="float: left;" src="./image/6-17.png" width=300 height=400>

sklearn 庫常用分類演算法函式

sklearn中提供的分類演算法非常多,分別存在於不同的模組中。常用的分類演算法如下表所示。

%%html
<img style="float: left;" src="./image/6-17-2.png" width=400 height=400>
import numpy as np
from sklearn.datasets import load_breast_cancer
from sklearn.svm import SVC
from sklearn.model_selection import train_test_split#劃分資料
from sklearn.preprocessing import StandardScaler #標準差 cancer = load_breast_cancer() cancer_data = cancer['data'] cancer_target = cancer['target'] cancer_names = cancer['feature_names'] ## 將資料劃分為訓練集測試集 cancer_data_train,cancer_data_test, \ cancer_target_train,cancer_target_test = \ train_test_split(cancer_data,cancer_target, test_size = 0.2,random_state = 22) ## 資料標準化 stdScaler = StandardScaler().fit(cancer_data_train) cancer_trainStd = stdScaler.transform(cancer_data_train) cancer_testStd = stdScaler.transform(cancer_data_test) ## 建立SVM模型 svm = SVC().fit(cancer_trainStd,cancer_target_train) print('建立的SVM模型為:\n',svm) # 預測訓練結果 cancer_target_pred = svm.predict(cancer_testStd) print('預測前20個結果為: \n',cancer_target_pred[:20])
建立的SVM模型為:
 SVC(C=1.0, break_ties=False, cache_size=200, class_weight=None, coef0=0.0,
    decision_function_shape='ovr', degree=3, gamma='scale', kernel='rbf',
    max_iter=-1, probability=False, random_state=None, shrinking=True,
    tol=0.001, verbose=False)
預測前20個結果為: 
 [1 0 0 0 1 1 1 1 1 1 1 1 0 1 1 1 0 0 1 1]

程式碼 6-18 分類結果的混淆矩陣與準確率

true = np.sum(cancer_target_pred == cancer_target_test)
print('預測對的結果數目為:', true)
print('預測錯的的結果數目為:', cancer_target_test.shape[0]-true)
print('預測結果準確率為:', true/cancer_target_test.shape[0])
預測對的結果數目為: 111
預測錯的的結果數目為: 3
預測結果準確率為: 0.9736842105263158

SVM模型預測結果的準確率約為97.4%,只有3個測試樣本識別錯誤,說明了整體模型效果理想

6.3.2 評價分類模型

分類模型對測試集進行預測而得出的準確率並不能很好地反映模型的效能,為了有效判斷一個預測模型的效能表現,需要結合真實值,計算出精確率、召回率、F1值和Cohen’s Kappa係數等指標來衡量。常規分類模型的評價指標如表所示。分類模型評價方法前4種都是分值越高越好,其使用方法基本相同。
sklearn的metrics模組還提供了一個能夠輸出分類模型評價報告的函式classfication_report。

%%html
<img style="float: left;" src="./image/6-19.png" width=600 height=400>

程式碼6-19 分類模型常用評價方法

from sklearn.metrics import accuracy_score,precision_score, \
recall_score,f1_score,cohen_kappa_score
print('使用SVM預測breast_cancer資料的準確率為:',
      accuracy_score(cancer_target_test,cancer_target_pred))
print('使用SVM預測breast_cancer資料的精確率為:',
      precision_score(cancer_target_test,cancer_target_pred))
print('使用SVM預測breast_cancer資料的召回率為:',
      recall_score(cancer_target_test,cancer_target_pred))
print('使用SVM預測breast_cancer資料的F1值為:',
      f1_score(cancer_target_test,cancer_target_pred))
print('使用SVM預測breast_cancer資料的Cohen’s Kappa係數為:',
      cohen_kappa_score(cancer_target_test,cancer_target_pred))
使用SVM預測breast_cancer資料的準確率為: 0.9736842105263158
使用SVM預測breast_cancer資料的精確率為: 0.9594594594594594
使用SVM預測breast_cancer資料的召回率為: 1.0
使用SVM預測breast_cancer資料的F1值為: 0.9793103448275862
使用SVM預測breast_cancer資料的Cohen’s Kappa係數為: 0.9432082364662903

程式碼6-20 分類模型評價報告

from sklearn.metrics import classification_report
print('使用SVM預測iris資料的分類報告:','\n',
     classification_report(cancer_target_test,
                          cancer_target_pred))
使用SVM預測iris資料的分類報告: 
               precision    recall  f1-score   support

           0       1.00      0.93      0.96        43
           1       0.96      1.00      0.98        71

    accuracy                           0.97       114
   macro avg       0.98      0.97      0.97       114
weighted avg       0.97      0.97      0.97       114

程式碼6-21 繪製ROC曲線

from sklearn.metrics import roc_curve
import matplotlib.pyplot as plt
## 求出ROC曲線的x軸和y軸
fpr ,tpr ,thresholds = \
roc_curve(cancer_target_test,cancer_target_pred)
plt.figure(figsize=(10,6))
plt.xlim(0,1)  ##設定x軸的範圍
plt.ylim(0.0,1.1)  # 設定y軸的範圍
plt.xlabel('False Postive Rate') #偽陽性率
plt.ylabel('True Postive Rate')  #真陽性率
plt.plot(fpr,tpr,linewidth=2,linestyle='-',color='red')
plt.show()

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-Rh53V5bk-1608692846401)(output_17_0.png)]

ROC曲線

除了使用數值,表格形式評估分類模型的效能,還可通過繪製ROC曲線的方式來評估分類模型。
ROC曲線橫縱座標範圍為[0,1],通常情況下ROC曲線與X軸形成的面積越大,表示模型效能越好。但是當ROC曲線處於下圖中藍色虛線的位置,就表明了模型的計算結果基本都是隨機得來的,在此種情況下模型起到的作用幾乎為零。故在實際中ROC曲線離圖中藍色虛線越遠表示模型效果越好。

6.3.3 任務實現

常規的鮑魚的年齡是通過顯微鏡檢視切割,染色後的外殼上環的數量得到的,十分耗時.一些常規的物理量(如性別,長度,寬度,殼體重量等)的測量十分容易獲取,若能夠使用這些物理量預測年齡,將節省大量時間

使用sklearn構建鮑魚年齡預測的步驟如下

1 構建SVM分類模型

程式碼 6-22 鮑魚年齡預測

import pandas as pd
from sklearn.svm import SVC
from sklearn.metrics import classification_report
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
abalone = pd.read_csv('../data/abalone.data',sep=',')
# 將資料和標籤拆開
abalone_data = abalone.iloc[:,:8]
abalone_target = abalone.iloc[:,8]
#連續型特徵離散化
sex = pd.get_dummies(abalone_data['sex'])
abalone_data = pd.concat([abalone_data,sex],axis=1)
abalone_data.drop('sex',axis = 1,inplace =True)
# 劃分訓練集,測試集
abalone_train,abalone_test,\
abalone_target_train,abalone_target_test = \
train_test_split(abalone_data,abalone_target,
                train_size = 0.8,random_state = 42)
# 標準化
stdScaler = StandardScaler().fit(abalone_train)
abalone_std_train = stdScaler.transform(abalone_train)
abalone_std_test = stdScaler.transform(abalone_test)
## 建模
svm_abalone = SVC().fit(abalone_std_train,abalone_target_train)
print('建立的SVM模型為:','\n',svm_abalone)
建立的SVM模型為: 
 SVC(C=1.0, break_ties=False, cache_size=200, class_weight=None, coef0=0.0,
    decision_function_shape='ovr', degree=3, gamma='scale', kernel='rbf',
    max_iter=-1, probability=False, random_state=None, shrinking=True,
    tol=0.001, verbose=False)

2. 評價構建的SVM分類模型

程式碼 6-23 評價構建的SVM分類模型

程式碼6-23 的結果顯示了本次模型每個類別的精確率,召回率和F1值,其中除了對鮑魚年齡為4的預測結果較好外,其他的預測結果欠佳,後期還需要仔細調整

abalone_target_pred = svm_abalone.predict(abalone_std_test)
print('abalone資料集的SVM分類報告為: \n',
     classification_report(abalone_target_test,abalone_target_pred))
abalone資料集的SVM分類報告為: 
               precision    recall  f1-score   support

           3       0.00      0.00      0.00         3
           4       0.45      0.69      0.55        13
           5       0.54      0.22      0.31        32
           6       0.40      0.33      0.36        48
           7       0.41      0.44      0.42        84
           8       0.37      0.36      0.37        99
           9       0.28      0.57      0.38       142
          10       0.24      0.33      0.28       139
          11       0.25      0.25      0.25        93
          12       0.00      0.00      0.00        51
          13       0.00      0.00      0.00        31
          14       0.00      0.00      0.00        26
          15       0.00      0.00      0.00        21
          16       0.00      0.00      0.00        13
          17       0.00      0.00      0.00         8
          18       0.00      0.00      0.00        12
          19       0.00      0.00      0.00         7
          20       0.00      0.00      0.00         4
          21       0.00      0.00      0.00         3
          22       0.00      0.00      0.00         3
          23       0.00      0.00      0.00         4

    accuracy                           0.31       836
   macro avg       0.14      0.15      0.14       836
weighted avg       0.25      0.31      0.26       836



D:\Study\anaconda\lib\site-packages\sklearn\metrics\_classification.py:1272: UndefinedMetricWarning: Precision and F-score are ill-defined and being set to 0.0 in labels with no predicted samples. Use `zero_division` parameter to control this behavior.
  _warn_prf(average, modifier, msg_start, len(result))