Python數(shù)據(jù)分析(4)決策樹模型

前言

  • 蛋肥使用員工離職數(shù)據(jù)集(包含14999個樣本以及10個特征),通過現(xiàn)有員工是否離職的數(shù)據(jù),建立決策樹模型預(yù)測有可能離職的員工,最后嘗試對模型進(jìn)行評估與調(diào)優(yōu)。

準(zhǔn)備

時間:2021/06/30
系統(tǒng)環(huán)境:Windows 10
所用工具:Jupyter Notebook\Python 3.0
涉及的庫:pandas\train_test_split\DecisionTreeClassifier\accuracy_score\roc_curve\matplotlib.pyplot\roc_auc_score\export_graphviz\graphviz\os\GridSearchCV

搭建決策樹模型

參考資料
阿里云天池-員工離職數(shù)據(jù)

#讀取數(shù)據(jù)集
import pandas as pd
df=pd.read_csv(r"C:\Users\Archer\Desktop\HR_comma_sep.csv")
#將sales、salary轉(zhuǎn)化為數(shù)值
df=df.replace({"salary":{"low":1,"medium":2,"high":3},
               "sales":{"accounting":1,"hr":2,"IT":3,"management":4,"marketing":5,
                        "product_mng":6,"RandD":7,"sales":8,"support":9,"technical":10}})

#選取自變量、因變量
X=df.drop(columns="left")
Y=df["left"]

#劃分訓(xùn)練集、測試集,測試集占20%
from sklearn.model_selection import train_test_split
X_train,X_test,Y_train,Y_test=train_test_split(X,Y,test_size=0.2,random_state=1)

#搭建決策樹模型
from sklearn.tree import DecisionTreeClassifier
model=DecisionTreeClassifier(max_depth=3,random_state=1)
model.fit(X_train,Y_train)

獲取預(yù)測準(zhǔn)確度

蛋肥想法:通過測試集數(shù)據(jù),檢驗(yàn)預(yù)測準(zhǔn)確度,測得準(zhǔn)確度為95.47%。

#預(yù)測結(jié)果評分
from sklearn.metrics import accuracy_score
Y_pred=model.predict(X_test)
score=accuracy_score(Y_pred,Y_test)
print(str(score))

獲取預(yù)測概率

#預(yù)測概率
Y_pred_=model.predict_proba(X_test)
data=pd.DataFrame(Y_pred_,columns=["不離職概率","離職概率"])

模型評估-ROC曲線

蛋肥想法:通過繪制ROC曲線,得出AUC值為0.966,表明預(yù)測效果不錯。

#獲取不同閾值下的命中率(TPR)和假警報率(FPR)
from sklearn.metrics import roc_curve
fpr,tpr,thres=roc_curve(Y_test,Y_pred_[:,1])

#繪制ROC曲線
import matplotlib.pyplot as plt
plt.plot(fpr,tpr)
plt.savefig(r"C:\Users\Archer\Desktop\my_fig.png",dpi=500)
plt.show

#獲取模型AUC值
from sklearn.metrics import roc_auc_score
auc=roc_auc_score(Y_test,Y_pred_[:,1])
ROC曲線

特征重要性評估

蛋肥想法:特征重要性最高的是“satisfaction_level”,而“salary”在該模型中的特征重要性為0,并不符合實(shí)際(錢可太重要了~),應(yīng)該是因?yàn)閿?shù)據(jù)處理時單純將工資分為“高”“中”“低”3個檔次,使得該特征變量在決策樹模型中發(fā)揮的作用較小。

#獲取特征重要性
features=X.columns
imp=model.feature_importances_
imp_data=pd.DataFrame()
imp_data["特征名稱"]=features
imp_data["特征重要性"]=imp
imp_data.sort_values("特征重要性",ascending=False)

決策樹模型可視化

#決策樹模型可視化
from sklearn.tree import export_graphviz
import graphviz
import os
os.environ["PATH"]=os.pathsep+r"C:\Program Files\Graphviz\bin"
dot_data=export_graphviz(model,out_file=None,class_names=["0","1"])
graph=graphviz.Source(dot_data)
graph.render(r"C:\Users\Archer\Desktop\result")

參數(shù)調(diào)優(yōu)-GridSearch網(wǎng)格搜索

蛋肥想法:GridSearch網(wǎng)格搜索可以進(jìn)行單參數(shù)和多參數(shù)調(diào)優(yōu),蛋肥這里以max_depth參數(shù)來練習(xí)調(diào)優(yōu),得出'max_depth': 7時,AUC更好為0.985。

#單參數(shù)調(diào)優(yōu),cv=5為5折交叉驗(yàn)證
from sklearn.model_selection import GridSearchCV
parameters={"max_depth":[1,3,5,7,9,11]}
model=DecisionTreeClassifier()
grid_search=GridSearchCV(model,parameters,scoring="roc_auc",cv=5)

#輸出參數(shù)的最優(yōu)值
grid_search.fit(X_train,Y_train)
grid_search.best_params_

總結(jié)

  • 作為機(jī)器學(xué)習(xí)的經(jīng)典算法模型,決策樹模型具有獨(dú)特的優(yōu)勢,如對異常值不敏感、可解釋性強(qiáng)等,也有一些缺點(diǎn),如結(jié)果不穩(wěn)定、容易造成過擬合等。
  • 決策樹模型是很多重要集成模型的基礎(chǔ)。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容