③机器学习分类算法之随机森林(集成学习算法)

简介: 机器学习分类算法之随机森林(集成学习算法)

min_samples_split优化

# min_samples_split优化
scorel = []
for i in range(2,20):
    RFC = RandomForestClassifier(max_depth=20,n_estimators=51,min_samples_leaf=1,min_samples_split=i,
                                 n_jobs=-1,
                                 random_state=90).fit(X_train,y_train)
    score = RFC.score(X_test,y_test)
    scorel.append(score)
print(max(scorel),([*range(2,20)][scorel.index(max(scorel))]))  #112是最优的估计器数量 #最优得分是0.951462
plt.figure(figsize=[20,5])
plt.plot(range(2,20),scorel) 
plt.show()


image.png


调整max_features及其他参数

## 调整max_features
param_grid = {'max_features':['auto', 'sqrt','log2']}
RFC = RandomForestClassifier(max_depth=20,n_estimators=51,min_samples_leaf=1,min_samples_split=2
                             )
GS = GridSearchCV(RFC,param_grid,cv=10)
GS.fit(X,y)
print(GS.best_params_ ) #最佳最大特征方法为log2  
print(GS.best_score_)
param_grid = {'criterion':['gini', 'entropy']}
RFC = RandomForestClassifier(max_depth=20,n_estimators=51,min_samples_leaf=1,min_samples_split=2,max_features='log2')
GS = GridSearchCV(RFC,param_grid,cv=10)
GS.fit(X,y)
print(GS.best_params_ )
print(GS.best_score_)
# 调整min_samples_leaf
param_grid = {'min_samples_leaf':np.arange(1, 11, 1)} 
RFC = RandomForestClassifier(max_depth=20,n_estimators=51,min_samples_leaf=1,min_samples_split=2,max_features='log2',criterion='gini')
GS = GridSearchCV(RFC,param_grid,cv=10)
GS.fit(X,y)
print(GS.best_params_ )
print(GS.best_score_)
scorel = []
for i in range(2,20):
    RFC = RandomForestClassifier(max_depth=20,n_estimators=51,min_samples_leaf=1,min_samples_split=2,max_features='log2',criterion='gini',
                                 n_jobs=-1,
                                 random_state=90).fit(X_train,y_train)
    score = RFC.score(X_test,y_test)
    scorel.append(score)
print(max(scorel),([*range(2,20)][scorel.index(max(scorel))]))  #112是最优的估计器数量 #最优得分是0.951462
plt.figure(figsize=[20,5])
plt.plot(range(2,20),scorel) 
plt.show()


image.png


网格搜索(电脑性能强)

#超参数配置
param_knn = {
'n_estimators': list(range(3,100,1)),
'max_depth':list(range(3,30,1)),
'max_features':['auto', 'sqrt','log2'],
'min_samples_leaf':list(range(1,20)),
'criterion':['gini', 'entropy'],
'min_samples_leaf':list(range(1,11))
}
#KNN的超参数
gsearch = GridSearchCV( model , param_grid = param_knn )
gsearch.fit( X_train, y_train )
gsearch.best_params_
gsearch.best_score_
best_=gsearch.best_estimator_
print(best_)

根据手动调参的测试,这里想要尝试一下网格搜索,但是我的机器无法完成,最后发现是内存不足,其次我去查询了一些资料,在随机森林中,一般是不需要做交叉验证的,这里的shift折交叉对电脑的显卡肯定要求严格,如果觉得自己的配置还可以的小伙伴,可以去测试一下这个代码。


随机森林做特征筛选(可视化)


feat_labels = df.columns[:-1]
# n_jobs  整数 可选(默认=1) 适合和预测并行运行的作业数,如果为-1,则将作业数设置为核心数
forest = RandomForestClassifier(max_depth=20,n_estimators=51,min_samples_leaf=1,min_samples_split=2,max_features='log2',criterion='gini',
                                random_state=0, n_jobs=-1)
forest.fit(X_train, y_train)
labe_name=[]
imports=[]
# 下面对训练好的随机森林,完成重要性评估
# feature_importances_  可以调取关于特征重要程度
importances = forest.feature_importances_
print("重要性:",importances)
x_columns =df.columns[:-1]
indices = np.argsort(importances)[::-1]
for f in range(X_train.shape[1]):
# 对于最后需要逆序排序,我认为是做了类似决策树回溯的取值,从叶子收敛
# 到根,根部重要程度高于叶子。
    print("%2d) %-*s %f" % (f + 1, 30, feat_labels[indices[f]], importances[indices[f]]))
    labe_name.append(feat_labels[indices[f]])
    imports.append(importances[indices[f]])
# # 筛选变量(选择重要性比较高的变量)
# threshold = 0.03
# x_selected = X_train.iloc[:,:-1][:,importances > threshold]
plt.figure(figsize=(10,8))
sns.barplot(imports,labe_name, orient='h')


image.png


虽然这里筛选的特征对我们的随机森林的模型没有什么提升,但是你可以依据该模型的特征筛选去做其他模型,比如支持向量机等


结论:随机森林在这个数据集上,只需要调节n_estimators即可,就可以达到最好的效果,虽然每个参数我都尝试去利用学习曲线做优化迭代,但是效果和默认值差不多,其次利用随机森林做特征筛选,将权重大的特征带入,效果并不好,最后我还发现一个问题,随机森林因为是又放回抽样,这里的特征顺序也会影响到模型的效果,当我们把特征按照权重顺序排列。


最佳模型代码

# 最终的模型效果和代码
# 导入数据 分割数据
df=pd.read_csv(r"\数据.csv")
X=df.iloc[:,:-1]
y=df.iloc[:,-1]
X_train, X_test, y_train, y_test = train_test_split(X,y,test_size=0.2,stratify=y,random_state=1)
# 导入模型
model=RandomForestClassifier(n_estimators=51,max_depth=20,max_features='sqrt',criterion='gini',n_jobs=-1,random_state=90)
# 训练模型
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))
# 这行代码在jupyter notebook 上面运行不起,内存不足,需要使用本地的pycharm,好像我的也跑不起
# score_pre = cross_val_score(model,X_test,y_test,cv=5).mean() #利用所有数据,进行交叉验证以后0.976变差了
# print("十折交叉验证的平均得分{}".format(score_pre))
# 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()

image.png

效果还是不错的,各个评估指标都比较的乐观


image.png


写到最后:

随机森林,一般还是不错的,至于参数调优,可以多测试几个版本,不管是网格搜索还是自定义迭代调参,还是先验知识,都应该跳出传统的思维,多去比较和测试,最后出来的效果才是你真正需要的,不要嫌麻烦,好的模型都是一步一步的调配出来的。

相关文章
|
1月前
|
机器学习/深度学习 算法 前端开发
【机器学习】Bagging和随机森林
【机器学习】Bagging和随机森林
|
2月前
|
机器学习/深度学习 存储 人工智能
文本情感识别分析系统Python+SVM分类算法+机器学习人工智能+计算机毕业设计
使用Python作为开发语言,基于文本数据集(一个积极的xls文本格式和一个消极的xls文本格式文件),使用Word2vec对文本进行处理。通过支持向量机SVM算法训练情绪分类模型。实现对文本消极情感和文本积极情感的识别。并基于Django框架开发网页平台实现对用户的可视化操作和数据存储。
50 0
文本情感识别分析系统Python+SVM分类算法+机器学习人工智能+计算机毕业设计
|
1月前
|
机器学习/深度学习 算法
【机器学习】迅速了解什么是集成学习
【机器学习】迅速了解什么是集成学习
|
2月前
|
机器学习/深度学习 人工智能 搜索推荐
如何让你的Uno Platform应用秒变AI大神?从零开始,轻松集成机器学习功能,让应用智能起来,用户惊呼太神奇!
【9月更文挑战第8天】随着技术的发展,人工智能与机器学习已融入日常生活,特别是在移动应用开发中。Uno Platform 是一个强大的框架,支持使用 C# 和 XAML 开发跨平台应用(涵盖 Windows、macOS、iOS、Android 和 Web)。本文探讨如何在 Uno Platform 中集成机器学习功能,通过示例代码展示从模型选择、训练到应用集成的全过程,并介绍如何利用 Onnx Runtime 等库实现在 Uno 平台上的模型运行,最终提升应用智能化水平和用户体验。
56 1
|
2月前
|
机器学习/深度学习 存储 数据采集
Elasticsearch 与机器学习的集成
【9月更文第3天】Elasticsearch 不仅仅是一个强大的分布式搜索和分析引擎,它还是一个完整的数据平台,通过与 Kibana、Logstash 等工具结合使用,能够提供从数据采集、存储到分析的一站式解决方案。特别是,Elasticsearch 集成了机器学习(ML)功能,使得在实时数据流中进行异常检测和趋势预测成为可能。本文将详细介绍如何利用 Elasticsearch 的 ML 功能来检测异常行为或预测趋势。
67 4
|
2月前
|
机器学习/深度学习 算法 前端开发
R语言基础机器学习模型:深入探索决策树与随机森林
【9月更文挑战第2天】决策树和随机森林作为R语言中基础且强大的机器学习模型,各有其独特的优势和适用范围。了解并熟练掌握这两种模型,对于数据科学家和机器学习爱好者来说,无疑是一个重要的里程碑。希望本文能够帮助您更好地理解这两种模型,并在实际项目中灵活应用。
|
3月前
|
机器学习/深度学习 存储 前端开发
实战揭秘:如何借助TensorFlow.js的强大力量,轻松将高效能的机器学习模型无缝集成到Web浏览器中,从而打造智能化的前端应用并优化用户体验
【8月更文挑战第31天】将机器学习模型集成到Web应用中,可让用户在浏览器内体验智能化功能。TensorFlow.js作为在客户端浏览器中运行的库,提供了强大支持。本文通过问答形式详细介绍如何使用TensorFlow.js将机器学习模型带入Web浏览器,并通过具体示例代码展示最佳实践。首先,需在HTML文件中引入TensorFlow.js库;接着,可通过加载预训练模型如MobileNet实现图像分类;然后,编写代码处理图像识别并显示结果;此外,还介绍了如何训练自定义模型及优化模型性能的方法,包括模型量化、剪枝和压缩等。
53 1
|
3月前
|
API UED 开发者
如何在Uno Platform中轻松实现流畅动画效果——从基础到优化,全方位打造用户友好的动态交互体验!
【8月更文挑战第31天】在开发跨平台应用时,确保用户界面流畅且具吸引力至关重要。Uno Platform 作为多端统一的开发框架,不仅支持跨系统应用开发,还能通过优化实现流畅动画,增强用户体验。本文探讨了Uno Platform中实现流畅动画的多个方面,包括动画基础、性能优化、实践技巧及问题排查,帮助开发者掌握具体优化策略,提升应用质量与用户满意度。通过合理利用故事板、减少布局复杂性、使用硬件加速等技术,结合异步方法与预设缓存技巧,开发者能够创建美观且流畅的动画效果。
80 0
|
3月前
|
开发者 算法 虚拟化
惊爆!Uno Platform 调试与性能分析终极攻略,从工具运用到代码优化,带你攻克开发难题成就完美应用
【8月更文挑战第31天】在 Uno Platform 中,调试可通过 Visual Studio 设置断点和逐步执行代码实现,同时浏览器开发者工具有助于 Web 版本调试。性能分析则利用 Visual Studio 的性能分析器检查 CPU 和内存使用情况,还可通过记录时间戳进行简单分析。优化性能涉及代码逻辑优化、资源管理和用户界面简化,综合利用平台提供的工具和技术,确保应用高效稳定运行。
84 0
|
3月前
|
机器学习/深度学习 TensorFlow 算法框架/工具
全面解析TensorFlow Lite:从模型转换到Android应用集成,教你如何在移动设备上轻松部署轻量级机器学习模型,实现高效本地推理
【8月更文挑战第31天】本文通过技术综述介绍了如何使用TensorFlow Lite将机器学习模型部署至移动设备。从创建、训练模型开始,详细演示了模型向TensorFlow Lite格式的转换过程,并指导如何在Android应用中集成该模型以实现预测功能,突显了TensorFlow Lite在资源受限环境中的优势及灵活性。
241 0