目录
1.防止分类模型的过拟合问题
过拟合通俗点讲就是在做分类训练时面模型由于过度学习了训练集的特征,使得训练集的准确率非常高,测试集的准确率却很差。因此,避免过拟合是分类模型中的一个重要任务。一般可以通过以下途径避免过度拟合。
(1)使用更多的数据:导致过拟合的根本原因是训练集和测试集的特征存在较大差异,导致原本完美拟合的模型无法对新数据集产生良好的效果;通过增加数据集,可能会增加训练集和测试集的特征相似度,这样会使得分类结果在新数据集上表现更好。
(2)降维:通过维度选择或转换的方式,降低参与分类模型的维度数量,能有效防止原有数据集中的“噪音”,对模型的影响,从而达到避免过拟合的目的。
(3)使用正则化方法:正则化会通过定义不同特征的参数来保证每个特征有一定的效用,不会使某一个特征特别重要。例如SVM有L2正则项参数,可以在目标函数中对模型进行限制,通过最优化过程中尽量追求小的L2值提高泛化能力,也就抑制了过拟合的问题。
(4)使用组合方法:例如,随机森林。adaboost不容易产生过拟合问题
2.如何选择分类分析算法
在面对不同场景时,可参考以下因素:
(1)文本分类时,用到的最多是朴素贝叶斯,例如电子邮件的垃圾邮件识别
(2)如果训练集比较少,那么选择高偏差且低方差的分类算法则效果更好,例如朴素贝叶斯、支持向量机,因为这类算法不容易过拟合。
(3)如果训练集较大,那么不管选择哪种方法,都不会显著影响分类准确度。
(4)如果关注的是算法模型的计算时间和模型易用性,那么选择支持向量机、人工神经网路不是好的选择。
(5)如果重视算法的准确率,那么应选择算法精度较高的方法,例如支持向量机,随机森林。
(6)如果想要得到有关预测结果的概率信息,然后基于预测概率做进一步应用,使用逻辑回归是比较好的选择。
(7)如果担心离群点或数据不可分,并且需要清晰的决策规则,那么选择决策树。
3.python分类分析
1.导入库
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn import tree
from sklearn.metrics import accuracy_score,auc,confusion_matrix,f1_score,precision_score,recall_score,roc_curve
import prettytable
import pydotplus
import matplotlib.pyplot as plt
2.数据准备
raw_data=np.loadtxt('F:\\小橙书\\chapter4\\classification.csv',delimiter=',',skiprows=1)
x=raw_data[:,:-1]
y=raw_data[:,-1]
x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=0.3,random_state=0)
3.训练分类模型
model_tree=tree.DecisionTreeClassifier(random_state=420)
model_tree.fit(x_train,y_train)
pre_y=model_tree.predict(x_test)
4.混淆矩阵
confusion_m=confusion_matrix(y_test,pre_y) #获得混淆矩阵
confusion_matrix_table=prettytable.PrettyTable()
confusion_matrix_table.add_row(confusion_m[0,:])
confusion_matrix_table.add_row(confusion_m[1,:])
print(confusion_matrix_table)
5.评估指标
y_score=model_tree.predict_proba(x_test) #获得决策树的预测概率
fpr,tpr,thresholds=roc_curve(y_test,y_score[:,1]) #ROC
auc_s=auc(fpr,tpr) #AUC
accuracy_s=accuracy_score(y_test,pre_y) #准确率
precision_s=precision_score(y_test,pre_y) #精确度
recall_s=recall_score(y_test,pre_y) #召回率
f1_s=f1_score(y_test,pre_y) #F1得分
core_metrics=prettytable.PrettyTable()
core_metrics.field_names=['auc','accuracy','precision','recall','f1']
core_metrics.add_row([auc_s,accuracy_s,precision_s,recall_s,f1_s])
core_metrics
auc | accuracy | precision | recall | f1 |
---|---|---|---|---|
0.7462284235613215 | 0.9098647210822314 | 0.5696 | 0.5235294117647059 | 0.5455938697318008 |
6.模型效果可视化
name_list=['age','gender','income','rfm_score']
color_list=['r','c','b','g']
plt.figure(figsize=(15,8))
plt.subplot(1,2,1)
plt.plot(fpr,tpr,label='ROC')
plt.plot([0,1],[0,1],linestyle='--',color='k',label='random chance') #随机状态下的准确率线
plt.title('ROC')
plt.xlabel('false positive rate')
plt.ylabel('true positive rate')
plt.legend(loc=0)
feature_importance=model_tree.feature_importances_
plt.subplot(1,2,2)
plt.bar(np.arange(feature_importance.shape[0]),feature_importance,tick_label=name_list,color=color_list)
plt.title('feature importance')
plt.xlabel('features')
plt.ylabel('importance')
plt.suptitle('classification result')
plt.show()
7.保存决策树规则图
dot_data=tree.export_graphviz(model_tree,out_file=None,max_depth=5,feature_names=name_list,filled=True,rounded=True)
graph=pydotplus.graph_from_dot_data(dot_data)
graph.write_pdf('4,3分类分析-tree.pdf')
4.相关知识点
混淆矩阵:混淆矩阵是作分类算法效果评估的基本方法,它是监督式学习中的一种可视化工具,主要用于比较分类结果和实例的真实信息。矩阵中的4个区域,分别代表了TP、FP、FN、TN。
真正(True Positive,TP):本来是正例,分类成正例。
真负(True Neigative,TN):本来是负例,分类成负例。
假正(False Positive,FP):本来是负例,分类成正例。
假负(False Negative,FN):本来是正例,分类成负例。
AUC:ROC曲线下的面积。ROC曲线一般位于y=x上方,因此AUC的取值范围一般在0.5和1之间。AUC越大,分类效果越好。
准确率(accuracy):分类模型的预测结果中将正例预测为正例,负例预测为负例的比例。公式为:A=(TP+TN)/(TP+FN+FP+TN),取值范围为[0,1],值越大说明分类结果越准确。
精确度(precision):分类模型的预测结果中将正例预测为正例的比例。公式为:P=TP/(TP+FP),取值范围为[0,1],值越大说明分类结果越准确。
召回率(recall):分类模型的预测结果被正确预测为正例占总的比例。公式为:R=TP/(TP+FN),取值范围为[0,1],值越大说明分类结果越准确。
F1得分(F-score):准确度和召回率的调和均值,公式为:,取值范围为[0,1],值越大说明分类结果越准确。
从上述指标可以看出整个模型效果一般,一方面,在建立模型时没有对决策树剪枝,这会导致决策树的过拟合问题;另一方面,原始数据中,存在明显样本不均衡问题,也导致了模型效果不是很理想。