前言
- 蛋肥使用員工離職數(shù)據(jù)集(包含14999個(gè)樣本以及10個(gè)特征)吧寺,通過現(xiàn)有員工是否離職的數(shù)據(jù)矩肩,建立決策樹模型預(yù)測(cè)有可能離職的員工铡原,最后嘗試對(duì)模型進(jìn)行評(píng)估與調(diào)優(yōu)纱新。
準(zhǔn)備
時(shí)間:2021/06/30
系統(tǒng)環(huán)境:Windows 10
所用工具:Jupyter Notebook\Python 3.0
涉及的庫(kù):pandas\train_test_split\DecisionTreeClassifier\accuracy_score\roc_curve\matplotlib.pyplot\roc_auc_score\export_graphviz\graphviz\os\GridSearchCV
搭建決策樹模型
#讀取數(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)練集、測(cè)試集窟却,測(cè)試集占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ù)測(cè)準(zhǔn)確度
蛋肥想法:通過測(cè)試集數(shù)據(jù)昼丑,檢驗(yàn)預(yù)測(cè)準(zhǔn)確度,測(cè)得準(zhǔn)確度為95.47%夸赫。
#預(yù)測(cè)結(jié)果評(píng)分
from sklearn.metrics import accuracy_score
Y_pred=model.predict(X_test)
score=accuracy_score(Y_pred,Y_test)
print(str(score))
獲取預(yù)測(cè)概率
#預(yù)測(cè)概率
Y_pred_=model.predict_proba(X_test)
data=pd.DataFrame(Y_pred_,columns=["不離職概率","離職概率"])
模型評(píng)估-ROC曲線
蛋肥想法:通過繪制ROC曲線菩帝,得出AUC值為0.966,表明預(yù)測(cè)效果不錯(cuò)。
#獲取不同閾值下的命中率(TPR)和假警報(bào)率(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曲線
特征重要性評(píng)估
蛋肥想法:特征重要性最高的是“satisfaction_level”呼奢,而“salary”在該模型中的特征重要性為0宜雀,并不符合實(shí)際(錢可太重要了~),應(yīng)該是因?yàn)閿?shù)據(jù)處理時(shí)單純將工資分為“高”“中”“低”3個(gè)檔次握础,使得該特征變量在決策樹模型中發(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時(shí)郎哭,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)勢(shì)夸研,如對(duì)異常值不敏感、可解釋性強(qiáng)等依鸥,也有一些缺點(diǎn)亥至,如結(jié)果不穩(wěn)定、容易造成過擬合等贱迟。
- 決策樹模型是很多重要集成模型的基礎(chǔ)姐扮。