DecisionTreeClassifier的使用

DecisionTreeClassifier

    • 参数介绍
    • 重要属性介绍
    • 重要方法(接口)介绍
    • 调参
      • 利用学习曲线调参
        • 根据分数高低选择决策树的深度
        • 根据预测结果与实际结果比较判断过拟合还是欠拟合
      • 利用网格调参
    • 举例

参数介绍

clf = tree.DecisionTreeClassifier(criterion="entropy"   #不纯度的计算方法。"entropy"表示使用信息熵;"gini"表示使用基尼系数
                                  ,splitter="best"	#控制决策树中的随机选项。“best”表示在分枝时会优先选择重要的特征进行分枝;“random”表示分枝时会更加随机,常用来防止过拟合
                                  ,max_depth=10	#限制树的最大深度
                                  ,min_samples_split=5	#节点必须包含训练样本的个数
                                  ,min_samples_leaf=1	#叶子最少包含样本的个数
                                  ,min_weight_fraction_leaf=0.0
                                  ,max_features=None	#限制分枝的特征个数
                                  ,random_state=None	#输入任意数字会让模型稳定下来。加上random_state这个参数后,score就不会总是变化
                                  ,max_leaf_nodes=None
                                  ,min_impurity_decrease=0.0	#限制信息增益的大小,信息增益小于设定值分枝不会发生
                                  ,min_impurity_split=None	#结点必须含有最小信息增益再划分
                                  ,class_weight=None	#设置样本的权重,当正反样本差别较大时,又需要对少的样本进行精确估计时使用,搭配min_weight_fraction_leaf来剪枝
                                  ,presort=False
                                  )

重要属性介绍

clf.feature_importances_	#查看各特征对模型的重要性
feature_name = ['酒精','苹果酸','灰','灰的碱性','镁','总酚','类黄酮','非黄烷类酚类','花青素',\
                '颜色强度','色调','od280/od315稀释葡萄酒','脯氨酸']	#设置特征的名字
print(*zip(feature_name,clf.feature_importances_))	#将特征与特征名对应显示出来

重要方法(接口)介绍

clf = clf.fit(Xtrain,Ytrain)	#将实例化的模型应用在训练集上
score = clf.score(Xtest,Ytest)	#得到该模型的分数
clf.apply(Xtest)	#返回每个测试样本所在的叶子节点的索引
clf.predict(Xtest)	#返回每个测试样本所在的分类/回归结果

调参

利用学习曲线调参

根据分数高低选择决策树的深度

#打分,用于分数判断选择多长深度的决策数,并用折线图直观显示出来。
def show(Xtrain, Ytrain,Xtest, Ytest):
    test = []
    for i in range(10):
        clf = tree.DecisionTreeClassifier(max_depth=i + 1
        , criterion = "entropy"
        , random_state = 30
        , splitter = "random"
        )
        clf = clf.fit(Xtrain, Ytrain)
        score = clf.score(Xtest, Ytest)
        test.append(score)
    plt.plot(range(1, 11), test, color="red", label="max_depth")
    plt.legend()
    plt.show()

根据预测结果与实际结果比较判断过拟合还是欠拟合

def isOverFitting(Xtrain,Ytrain,x,y): #x为没有划分训练集和测试集的特征值,y为没有划分训练集和测试集的标签
    from sklearn.tree import DecisionTreeClassifier
    from sklearn.model_selection import cross_val_score
    import matplotlib.pyplot as plt
    tr = [] #用来存储训练集的分数
    te = [] #用来存储该模型交叉验证的分数
    for i in range(10):
		clf = DecisionTreeClassifier(random_state=25,max_depth=i+1,criterion="entropy")
        clf = clf.fit(Xtrain,Ytrain)
        score_tr = clf.score(Xtrain,Ytrain)
        score_te = cross_val_score(clf,x,y,cv=10).mean()    #将10此交叉验证结果的平均得分作为该深度数的得分
	    tr.append(score_tr)
	    te.append(score_te)
    print(max(te))  #输出最高得分
    plt.plot(range(1,11),tr,color = "red",label="train")
    plt.plot(range(1,11),te,color = "blue",label = "test")
    plt.legend()    #显示标签
    plt.show()  #显示图    

利用网格调参

def adujstParameter(Xtrain,Ytrain):
    import numpy as np
    from sklearn.tree import tree
    from sklearn.model_selection import GridSearchCV
    parameters = {'splitter':('best','random') #表示此参数可以选的值
                ,'criterion':("gini","entropy")
                ,"max_depth":[*range(1,10)]   #表示此参数可以选的整数为1-10之间
                ,'min_samples_leaf':[*range(1,50,5)]  #表示此参数可选的范围为1-50,每隔5个选一个
                ,'min_impurity_decrease':[*np.linspace(0,0.5,20)] #不纯度的选择范围为0-0.5之间20个数
                }#对需要调整参数的列举和取值范围设定
    clf = tree.DecisionTreeClassifier(random_state=25) #实例化模型
    GS = GridSearchCV(clf, parameters, cv=10) #将模型和参数代入
    GS.fit(Xtrain,Ytrain)  
    GS.best_params_    #得到最高得分的参数值
    GS.best_score_ #得到最高得分

举例

def decisionTree(Xtrain, Ytrain,Xtest, Ytest):
    clf = tree.DecisionTreeClassifier(
                                      # , random_state=30
                                       splitter='random'#有best和random两个可选项,random更加随机
                                      ,max_depth=10 #数的深度最多为10
									)
    clf = clf.fit(Xtrain,Ytrain) #第二部步模型导进去
    score = clf.score(Xtest,Ytest) #第三步,给模型打分
    return score

你可能感兴趣的:(#,sklearn,决策树)