目录
前言
我做的是一个多分类问题,特征有55列,标签1列,共有15000条数据。(由于某些原因,不方便展示数据集)
一、问题详细描述
1.项目介绍
如上图,A18列是标签列,前面的都是属性列。且已经经过数据处理(无空缺值和异常值)。
训练集、测试集比为8:2。这是我建立RF后,多次调参,所表现出的最佳性能。RF模型表明在测试集上的准确率为72%,AUC为0.85。
2.调参尝试
我刚遇到这个问题的时候,以为是模型参数导致没有很好的训练,因此我根据一系列步骤 合理地调参,想法设法地提高其准确率。其调参过程如下:
下面是我调试一个参数n_estimators的代码,仅供参考。
accurancyList = {
'params':[],
'precision':[]
}
def tune_rf(Xtrain,Ytrain,parameters):
rf = RandomForestClassifier(
n_estimators = parameters['n_estimators'],
max_leaf_nodes = parameters['max_leaf_nodes'],
max_depth = parameters['max_depth'],
min_samples_split = parameters['min_samples_split'],
min_samples_leaf = parameters['min_samples_leaf'],
min_weight_fraction_leaf = parameters['min_weight_fraction_leaf'],
max_features = parameters['max_features'],
criterion = parameters['criterion']
)
# 模型训练
rf.fit(Xtrain, Ytrain)
return accuracy_score(Ytest,rf.predict(Xtest))
parameters = {
'n_estimators':20,
'max_leaf_nodes':20,
'max_depth':20,
'min_samples_split':20,
'min_samples_leaf':20,
'min_weight_fraction_leaf':0.03,
'max_features':30,
'criterion':'entropy'
}
for n in range(1,201):
parameters['n_estimators'] = n
accurancyList['params'].append(parameters)
# 将更新后的paramseters投入训练
accurancyList['precision'].append(tune_rf(Xtrain,Ytrain,parameters))
# 绘制图像
plt.plot(range(1,201),accurancyList['precision'])
plt.xlabel('n')
plt.ylabel('accurancy')
plt.title('Accurancy@n_estimator')
plt.show()
二、分析原因
1.观察稀疏矩阵
2.解决方案
方案一 处理数据
方案二 改进模型
方案三 调整评价指标
我最近想到了以上的解决方案,具体代码还在测试中~~~~。先挖一个坑,下次补上。
总结
最后补充一些我的一些思考:
@模型调参的过程是构造一个函数F(theta1,theta2,theta3···)=Accurancy,输出值可以是准确率,参数是随机森林的参数(以随机森林举例)。调参的本质是通过修改参数值,降低函数值——>转化成了 最优化 问题。而且,不能使用最优化常用的梯度下降(难以求得梯度)法。
@集成方法是框架,模型融合是方式,我们可以把集成模型融合起来而不是再次集成。因为影响准确率的原因不是模型不好,而是在这种多分类不平衡的情况下,“集成”更倾向于犯错小的方向,因此,必须选用与集成对立的算法融合起来,才能将错误的分类给拉回来。