1. 程式人生 > >機器學習:sklearn模型指標和特徵貢獻度檢視

機器學習:sklearn模型指標和特徵貢獻度檢視

模型訓練完成後,即使模型評估很好,各項指標都很到位,業務人員肯定也是心裡沒底的,哪怕有模型公式,他們也看不懂啊。咋整,當然是先把模型的重要評估指標列印給他們看,再把特徵貢獻度從大到小,畫成圖給他們看啦。今天就通過sklearn實現模型評估指標和特徵貢獻度的圖形檢視。

本文的資料集採用泰坦尼克號倖存者資料。使用sklearn的決策樹進行預測,然後檢視模型的評估指標,最後將特徵的貢獻度從大到小以柱狀圖展示。

直接上程式碼:

# -*- coding: utf-8 -*-
# @Time    : 2018/12/13 上午10:30
# @Author  : yangchen
# @FileName: featureimportance.py
# @Software: PyCharm
# @Blog    :https://blog.csdn.net/opp003/article

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score, precision_recall_fscore_support
from sklearn.model_selection import train_test_split

#匯入資料
df = pd.read_csv('processed_titanic.csv', header=0)

#設定y值
X = df.drop(["survived"], axis=1)
y = df["survived"]

#訓練集和測試集劃分
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=0, shuffle=True)

#訓練模型
dtree = DecisionTreeClassifier(criterion="entropy", random_state=123,
                               max_depth=4,
                               min_samples_leaf=5)
dtree.fit(X_train, y_train)

# 預測
pred_train = dtree.predict(X_train)
pred_test = dtree.predict(X_test)

#準確率
train_acc = accuracy_score(y_train, pred_train)
test_acc = accuracy_score(y_test, pred_test)
print ("訓練集準確率: {0:.2f}, 測試集準確率: {1:.2f}".format(train_acc, test_acc))

#其他模型評估指標
precision, recall, F1, _ = precision_recall_fscore_support(y_test, pred_test, average="binary")
print ("精準率: {0:.2f}. 召回率: {1:.2f}, F1分數: {2:.2f}".format(precision, recall, F1))

#特徵重要度
features = list(X_test.columns)
importances = dtree.feature_importances_
indices = np.argsort(importances)[::-1]
num_features = len(importances)

#將特徵重要度以柱狀圖展示
plt.figure()
plt.title("Feature importances")
plt.bar(range(num_features), importances[indices], color="g", align="center")
plt.xticks(range(num_features), [features[i] for i in indices], rotation='45')
plt.xlim([-1, num_features])
plt.show()

#輸出各個特徵的重要度
for i in indices:
    print ("{0} - {1:.3f}".format(features[i], importances[i]))

核心程式碼:

importances = dtree.feature_importances_
indices = np.argsort(importances)[::-1]

第一行,是通過模型的feature_importances_方法獲取特徵貢獻度。使用sklearn的演算法都有這個方法。然後使用argsort對其進行排序,由於argsort排序是從小到大的,因此要用[::-1]進行倒序,得到從大到小的排序。

整個程式碼執行得到輸出如下:

訓練集準確率: 0.80, 測試集準確率: 0.79
精準率: 1.00. 召回率: 0.70, F1分數: 0.82
sex - 0.543
age - 0.247
fare - 0.211
embarked - 0.000
parch - 0.000
sibsp - 0.000
pclass - 0.000

特徵貢獻度圖形如下:

 

另外,也可以使用score方法獲取模型得分,但是引數得換下:

train_acc = dtree.score(X_train, y_train)
test_acc = dtree.score(X_test, y_test)