1. 程式人生 > >機器學習分類演算法常用評價指標

機器學習分類演算法常用評價指標

# -*- coding: utf-8 -*-

import pandas as pd
from sklearn.ensemble import RandomForestClassifier
from sklearn import metrics
import matplotlib.pyplot as plt

"""
函式說明:檔案處理
Parameters:
     filename:資料檔案
Returns:
     list_datasets:資料集特徵列表
     category_labels:資料標籤列表
"""
def data_handle(filename):
    read_data = pd.read_csv(filename)
    list_datasets = []
    category_labels = []
    for i in range(len(read_data)):
        list_data = []
        for j in range(len(read_data.iloc[i, :]) - 1):
            row_data = read_data.iloc[i, j]  # 讀取每個樣本的每個資料
            list_data.append(row_data)  #將每個資料存入列表
        list_datasets.append(list_data)  #將每個樣本的資料存入列表

        row_data_label = read_data.iloc[i, len(read_data.iloc[i, :]) - 1]  # 讀取每個樣本的類別標籤
        if row_data_label == 'N':
            category_labels.append(0)  # 將二分類標籤轉化為0和1,0代表軟體正常,1代表軟體缺陷
        else:
            category_labels.append(1)
    return list_datasets, category_labels

"""
函式說明:繪製ROC曲線
Parameters:
     labels:測試標籤列表
     predict_prob:預測標籤列表
"""
def plot_roc(labels, predict_prob):
    false_positive_rate, true_positive_rate, thresholds = metrics.roc_curve(labels, predict_prob)
    roc_auc = metrics.auc(false_positive_rate, true_positive_rate)  #計算AUC值
    print('AUC=' + str(roc_auc))
    plt.title('PC5-ROC')
    plt.plot(false_positive_rate, true_positive_rate, 'b', label='AUC = %0.4f' % roc_auc)
    plt.legend(loc='lower right')
    plt.plot([0, 1], [0, 1], 'r--')
    plt.ylabel('TPR')
    plt.xlabel('FPR')
    # plt.savefig('figures/PC5.png') #將ROC圖片進行儲存
    plt.show()

if __name__ == '__main__':
    datasets, labels = data_handle('MDP/KC4.csv')  # 對資料集進行處理
    # 訓練集和測試集劃分
    X_train = datasets[:115]
    y_train = labels[:115]
    X_test = datasets[90:]
    y_test = labels[90:]
    # 隨機森林分類器
    clf = RandomForestClassifier()
    clf = RandomForestClassifier(n_estimators=200, random_state=0)
    clf.fit(X_train, y_train)  # 使用訓練集對分類器訓練
    y_predict = clf.predict(X_test)  # 使用分類器對測試集進行預測

    print('準確率:', metrics.accuracy_score(y_test, y_predict)) #預測準確率輸出
    print('巨集平均精確率:',metrics.precision_score(y_test,y_predict,average='macro')) #預測巨集平均精確率輸出
    print('微平均精確率:', metrics.precision_score(y_test, y_predict, average='micro')) #預測微平均精確率輸出
    print('巨集平均召回率:',metrics.recall_score(y_test,y_predict,average='macro'))#預測巨集平均召回率輸出
    print('平均F1-score:',metrics.f1_score(y_test,y_predict,average='weighted'))#預測平均f1-score輸出
    print('混淆矩陣輸出:',metrics.confusion_matrix(y_test,y_predict))#混淆矩陣輸出

    print('分類報告:', metrics.classification_report(y_test, y_predict))#分類報告輸出
    plot_roc(y_test, y_predict)  #繪製ROC曲線並求出AUC值