相关系数
plt.subplots(figsize=(10, 15)) sns.heatmap(df.corr()[['n23']].sort_values(by="n23",ascending=False), annot=True, vmax=1, square=True, cmap="Blues") plt.rcParams['axes.unicode_minus']=False # plt.rcParams['font.sans-serif']=['HeiTi'] plt.show() X_name=df.corr()[["n23"]].sort_values(by="n23",ascending=False).iloc[1:7].index.values.astype("U") print(X_name)
这种方法是基于数学理论知识进行匹配的,一共选取了6种重要的特征
轻量级的高效梯度提升树特征选取
from sklearn.model_selection import train_test_split,cross_val_score #拆分训练集和测试集 import lightgbm as lgbm #轻量级的高效梯度提升树 X_train, X_test, y_train, y_test = train_test_split(X,y,test_size=0.2,stratify=y,random_state=1) lgbm_class = lgbm.LGBMClassifier(max_depth=5,num_leaves=25,learning_rate=0.005,n_estimators=1000,min_child_samples=80, subsample=0.8,colsample_bytree=1,reg_alpha=0,reg_lambda=0) lgbm_class.fit(X_train, y_train) #选择最重要的20个特征,绘制他们的重要性排序图 lgbm.plot_importance(lgbm_reg, max_num_features=14) ##也可以不使用自带的plot_importance函数,手动获取特征重要性和特征名,然后绘图 feature_weight = lgbm_class.feature_importances_ feature_name = lgbm_class.feature_name_ feature_sort = pd.Series(data = feature_weight ,index = feature_name) feature_sort = feature_sort.sort_values(ascending = False) # plt.figure(figsize=(10,8)) # sns.barplot(feature_sort.values,feature_sort.index, orient='h') lgbm_name=feature_sort.index[:8].tolist() lgbm_name
再次带入模型进行训练
把刚刚用相关系数所选取的6个特征带入模型进行训练,再次查看效果
# 加载模型 model = DecisionTreeClassifier(criterion='gini',max_depth=5, splitter= 'random') # 训练模型 model.fit(X_train,y_train) # 预测值 y_pred = model.predict(X_test) ''' 评估指标 ''' # 求出预测和真实一样的数目 true = np.sum(y_pred == y_test ) print('预测对的结果数目为:', true) print('预测错的的结果数目为:', y_test.shape[0]-true) # 评估指标 from sklearn.metrics import accuracy_score,precision_score,recall_score,f1_score,cohen_kappa_score print('预测数据的准确率为: {:.4}%'.format(accuracy_score(y_test,y_pred)*100)) print('预测数据的精确率为:{:.4}%'.format( precision_score(y_test,y_pred)*100)) print('预测数据的召回率为:{:.4}%'.format( recall_score(y_test,y_pred)*100)) # print("训练数据的F1值为:", f1score_train) print('预测数据的F1值为:', f1_score(y_test,y_pred)) print('预测数据的Cohen’s Kappa系数为:', cohen_kappa_score(y_test,y_pred)) # 打印分类报告 print('预测数据的分类报告为:','\n', classification_report(y_test,y_pred))
现在发现,效果明显的提升了,准确率达到了93%,召回率也比较的高
决策树可视化
import graphviz from IPython.display import Image dot_data = tree.export_graphviz(model ,feature_names= ["签署知情同意书","认知功能","自理能力三级","行动能力","有无管道","身体攻击行为"] #'n22' 'n8' 'n10new' 'MOBILITY' 'n19f1' 'n13' ,class_names=["不需要","需要"] ,filled=True ,rounded = True ,out_file =None#图片保存路径 ) graph = graphviz.Source(dot_data.replace('helvetica','"Microsoft YaHei"'), encoding='utf-8') graph.view()
这就是决策树模型下的可视化,可以高效率的展示出分类过程,其中
ROC曲线AUC
from sklearn.metrics import precision_recall_curve from sklearn import metrics # 预测正例的概率 y_pred_prob=model.predict_proba(X_test)[:,1] # y_pred_prob ,返回两列,第一列代表类别0,第二列代表类别1的概率 #https://blog.csdn.net/dream6104/article/details/89218239 fpr, tpr, thresholds = metrics.roc_curve(y_test,y_pred_prob, pos_label=2) #pos_label,代表真阳性标签,就是说是分类里面的好的标签,这个要看你的特征目标标签是0,1,还是1,2 roc_auc = metrics.auc(fpr, tpr) #auc为Roc曲线下的面积 # print(roc_auc) plt.figure(figsize=(8,6)) plt.plot([0, 1], [0, 1], color='navy', lw=2, linestyle='--') plt.plot(fpr, tpr, 'r',label='AUC = %0.2f'% roc_auc) plt.legend(loc='lower right') # plt.plot([0, 1], [0, 1], 'r--') plt.xlim([0, 1.1]) plt.ylim([0, 1.1]) plt.xlabel('False Positive Rate') #横坐标是fpr plt.ylabel('True Positive Rate') #纵坐标是tpr plt.title('Receiver operating characteristic example') plt.show()
这就是决策树下的预测分类,在本次模型中,首先采取的模型参数调优,然后进行的特性选取,一般来说首先应该进行特征选取然后去进行参数调优,通过验证,本次数据集下的模型效果一致。
主要的max depth=5,是符合模型的最优选择的
总结
如前所述,控制决策树模型复杂度的参数是预剪枝参数,它在树完全展开之前停止树的构造。通常来说,选择一种预剪枝策略(设置 max_depth、 max_leaf_nodes 或 min_samples_leaf)足以防止过拟合。
与前面讨论过的许多算法相比,决策树有两个优点:一是得到的模型很容易可视化,非专家也很容易理解(至少对于较小的树而言);二是算法完全不受数据缩放的影响。由于每个特征被单独处理,而且数据的划分也不依赖于缩放,因此决策树算法不需要特征预处理,比如归一化或标准化。特别是特征的尺度完全不一样时或者二元特征和连续特征同时存在时,决策树的效果很好。
决策树的主要缺点在于,即使做了预剪枝,它也经常会过拟合,泛化性能很差。因此,在
大多数应用中,往往使用后续的随机森林,介绍的集成方法来替代单棵决策树。