决策树算法:用户分层:

    科技2022-08-16  111

    1.决策树概念及应用场景

    决策树概念 决策树是一种以树型结构形式表达的预测分析模型,一般一棵决策树包含一个根节点、若干个内部节点和叶节点;叶节点对应决策结果,其他每个节点对应于一个属性;每个节点包含的样本集合根据属性测试被划分到子节点中;根节点包含样本全集,从根节点到每个叶节点的路径对应了一个判定测试序列。 决策树种类有两种:分类树–对离散变量做决策树;回归树–对连续变量做决策树。 决策树常常用来解决分类和回归问题,在实际工作中基本应用于给人群分类,最好的应用场景是要把人群分为互斥的两类,并找到两类人群的不同特征。

    2.决策树原理

    决策树主要分为两部分:创建决策树、使用决策树模型进行预测,如下图所示。

    信息增益

    信息增益率

    基尼指数

    最小方差

    3. 示例:

    年龄 性别: (3)收入

    (4)婚姻

    如何确定第一个分支

    4.剪枝

    5.Python做决策树步骤

    1)建立树模型 2)剪枝 3)输出结果

    以分类树为基准: 各个参数的意思

    重要参数和剪枝

    ##6. SHAP

    :决策树一般用于变量选择,决策树是后续学习随机森林的基础。

    代码部分实操:

    #获取数据 from sklearn.tree import DecisionTreeClassifier import numpy as np import pandas as pd import matplotlib.pyplot as plt data = pd.read_table("C:/Users/lb/Desktop/test/gouwu.txt") #data = pd.read_table('C:/Users/dell/Desktop/gouwu.txt',sep='\t',engine="python",encoding = 'utf-8') data.columns.values data.head()

    from sklearn.model_selection import train_test_split data_x = data.drop(['留存标签'],axis=1) data_y = data['留存标签'] train_x,test_x,train_y,test_y = train_test_split(data_x,data_y,test_size = 0.1,random_state = 8)

    R^2

    clf = DecisionTreeClassifier(criterion='gini',max_depth = 2, min_samples_leaf=5, min_samples_split=2, random_state = 0) clf.fit(train_x,train_y) score = clf.score(test_x,test_y) score

    plt.rcParams['font.sans-serif']=['SimHei'] #显示中文标签 plt.rcParams['axes.unicode_minus']=False #用来正常显示负号

    树的可视化

    import pydotplus from IPython.display import display, Image dot_data = tree.export_graphviz(clf, out_file=None, feature_names=train_x.columns, class_names = ['留存','非留存'], filled = True, rounded =True ) graph = pydotplus.graph_from_dot_data(dot_data) display(Image(graph.create_png()))

    网格搜索调参

    #网格搜索 from sklearn.model_selection import cross_val_score,GridSearchCV paramaters = {'criterion': ('gini','entropy'), 'min_samples_split':[2,3,4,5], 'max_depth':range(1,5), 'class_weight':('balanced',None), 'presort':(False,True) } tr = tree.DecisionTreeClassifier() gsearch = GridSearchCV(tr,paramaters) gsearch.fit(train_x,train_y)

    model = gsearch.best_estimator_ model

    score = model.score(train_x,train_y) score

    调参过后由 72%提升到 76%

    model.feature_importances_

    [*zip(train_x.columns,clf.feature_importances_)]

    学习曲线确定数的深度:

    #用学习曲线确定最优max_depth取值 test = [] for i in range(100): clf = tree.DecisionTreeClassifier(max_depth=i+1 ,criterion="entropy" ,random_state=30 ,splitter="random" ) clf = clf.fit(train_x,train_y) score = clf.score(test_x,test_y) test.append(score) plt.plot(range(1,101),test,color="red",label="max_depth") plt.legend() plt.show()

    EIL5

    import eli5 from eli5.sklearn import PermutationImportance # 由⼤到⼩,进⾏降序 perm = PermutationImportance(model, random_state=1).fit(test_x, test_y) eli5.show_weights(perm, feature_names = test_x.columns.tolist())#把perm加载进来

    绿色表示特征越重要

    shap

    import shap explainer = shap.TreeExplainer(model) # # 传入特征矩阵X,计算SHAP值 shap_values = explainer.shap_values(train_x) print('*'*80) ##计算,⼀共是2⾏的数据, print(shap_values) shap.initjs()#显示格式转换

    #返回的SHAP values中包括了negative和positive两种情况,通常选择⼀种(positive)即可。

    #显示 shap.summary_plot(shap_values[1], train_x, plot_type="bar")

    shap.summary_plot(shap_values, train_x, plot_type="bar")

    #Summary Plots #my_model 最一开始训练的模型 explainer = shap.TreeExplainer(model) #val_X 表示测试集 shap_values = explainer.shap_values(train_x) #阳性 赢 shap.summary_plot(shap_values[1], train_x)

    这里用shap_values[1] 红色越多对模型(结果)的促进作用越强 +

    #随机森林 # 随机森林 from sklearn.ensemble import RandomForestClassifier from sklearn.metrics import roc_auc_score score = [] for i in range(1,500,10): model = RandomForestClassifier(n_estimators=i,criterion='gini',bootstrap=True) model.fit(train_x,train_y) rf_predictions = model.predict(test_x) rf_probs = model.predict_proba(test_x)[:,1] roc_value = roc_auc_score(test_y,rf_probs) score.append(roc_value) # 确定范围 import matplotlib.pyplot as plt print(max(score)) #找到使得最大时候的决策树数的数量 print(score.index(max(score))*10+1) plt.figure(figsize=[20,5]) plt.plot(range(1,500,10),score)

    roc_auc_score 概率作为输入 ROC曲线

    shap 可以得到方向性

    促进作用还是抑制作用

    Processed: 0.013, SQL: 9