随机森林文本分类

article/2025/10/13 15:03:45

随机森林原理及代码实现

机器学习系列

第一章 随机森林原理及代码实现


文章目录

  • 随机森林原理及代码实现
  • 机器学习系列
  • 前言
  • 一、集成算法是什么?
  • 二、随机森林是什么
  • 三、 数据预处理
    • 3.1 先来看一下我们的文本数据
    • 3.2 预处理
    • 3.3 统计评论情感值积极与消极的占比
  • 二、使用步骤
    • 参数介绍(4个)
    • 属性
    • 1.模型构建
    • 2.参数调参方法
  • 总结


前言

例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。


一、集成算法是什么?

集成学习是通过在数据上构建多个模型,集成所有模型的建模结果,目的是获取比单个模型更好得到回归或分类现象。多个模型集成成为的模型叫做集成评估器(ensemble estimator),组成集成评估器的每个模型都叫做基评估器
(base estimator)。在这里,对于随机森林来说,它的基评估器就是决策树。
常见的集成算法有袋装法Bagging(举例随机森林)、提升法Boosting(举例梯度提升树 GBDT、Adaboost)和stacking。
在这里插入图片描述
袋装法是构建多个相互独立的评估器,然后对其预测的结果求平均值或多数表决原则。
可是,如果每个树模型都比较弱,整体平均完也还是会很弱,那么这时候提升法Boosting就登场了。
提升法是
每个基评估器都是相关的,是按照顺序一一构建的。核心思想就是在一次次的建模过程当中,逐渐将模型方向调整到对难以评估的样本进行强烈预测。简单来说就是,在先采样,即样本1,然后构建一个模型,即模型1,对于样本中预测错误的样本,在下一轮采样中会增加它们的权重,一直重复上述操作。

二、随机森林是什么

三、 数据预处理

3.1 先来看一下我们的文本数据

在这里插入图片描述

数据解读:
情感标注列:1表示文本内容为积极的,0表示文本内容为消极的
content:文本

3.2 预处理

将数据分成2列,一列评论,一列情感值,对文本列进行分词、去停用词
数据分列:

import random
import numpy as np
import csv
import jieba file_path = '224.csv'
jieba.load_userdict("dict/否定词.txt")   #用户词典,帮助分词更成功
jieba.load_userdict("dict/负面评价词语(中文).txt")
jieba.load_userdict("dict/负面情感词语(中文).txt")
jieba.load_userdict("dict/正面评价词语(中文).txt")
jieba.load_userdict("dict/正面情感词语(中文).txt")#加载文件
with open(file_path, 'r', encoding='UTF-8') as f:reader = csv.reader(f)rows = [row for row in reader]# 将读取出来的语料转为list
review_data = np.array(rows).tolist()# 打乱语料的顺序
random.shuffle(review_data)review_list = []
sentiment_list = []
# 第一列为差评/好评, 第二列为评论
for words in review_data:review_list.append(words[1])sentiment_list.append(words[0])

数据分词、去停用词:
在这里,由于此文本为知乎舆论文本,我获取不到知乎评论数据的分词词典,就用了现在主流的一些词典。
词典的获取链接:词典链接
提取码:pony

import re
import jiebastopword_path = 'D:/pythonzx/douban_sentiment_analysis-master/data/stopwords.txt'#加载停用词表
def load_stopwords(file_path):stop_words = []with open(file_path, encoding='UTF-8') as words:stop_words.extend([i.strip() for i in words.readlines()])return stop_words#分词、去停用词
def review_to_text(review):stop_words = load_stopwords(stopword_path)# 去除英文review = re.sub("[^\u4e00-\u9fa5^a-z^A-Z]", '', review)review = jieba.cut(review)# 去掉停用词if stop_words:all_stop_words = set(stop_words)words = [w for w in review if w not in all_stop_words]return words# 用于训练的评论,文字
review_train = [' '.join(review_to_text(review)) for review in review_list]
# 对于训练评论对应的好评/差评,01
sentiment_train = sentiment_list

查看预处理结果:
在这里插入图片描述

3.3 统计评论情感值积极与消极的占比

#训练的样本数中,积极评论占xx条
sum=0
for i in range(len(sentiment_train)):if sentiment_train[i] == "1":sum = sum + 1
print(sum)
#训练的样本数中,消极极评论占xx条
sum=0
for i in range(len(sentiment_train)):if sentiment_train[i] == "0":sum = sum + 1
print(sum)

为了训练模型构建的准确性,建议最好的积极消极各占一半

二、使用步骤

参数介绍(4个)

random_state:目的让模型稳定下来。
用来设置分枝中的随机模式的参数,默认None,在高维度时随机性会表现更明显,低维度的数据
(比如鸢尾花数据集),随机性几乎不会显现。输入任意整数,会一直长出同一棵树,让模型稳定下来。
n_estimators:控制森林中数目的数量。
这是森林中树木的数量,即基基评估器的数量。这个参数对随机森林模型的精确性影响是单调的,n_estimators
越大,模型的效果往往越好。

为了让每棵树(基分类器)尽量不一样,除了random_state,还有bootstarp。
bootstrap:默认True,代表采用这种有放回的随机抽样技术
在一个含有n个样本的原始训练集,我们进行随机采样,每次采样一个样本,并在抽取下一个样本的之前将这个样本放回原始训练集中,这样采集n次,最终得到一个和原始训练集一样大的,n个样本组成的自助集。
由于是随机采样,这样每次的自助集个原始数据集不同,它用来训练我们的基分类器。
oob_score:默认True,是否用袋外数据来测试我们的模型。当n和n_estimators足够大的时候,袋外数据约有37%的数据会被浪费掉。
37%怎么来的:
在一个自助集里一个样本会被抽到的概率:
在这里插入图片描述
概率收敛于1-(1/e),约等于0.632。
那么在一个自助集里一个样本不会被抽到的概率为:
1-0.632=0.368,约等于37%。

属性

estimators_:查看森林中数的情况
在这里插入图片描述
oob_score_:计算袋外数据的预测准确率
在这里插入图片描述

1.模型构建

代码如下(示例):

# 划分训练集、测试集
from sklearn.model_selection import train_test_split
Xtrain, Xtest, Ytrain, Ytest = train_test_split(xtrain_vec,sentiment_train,test_size=0.3)
# 模型训练
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier
clf = DecisionTreeClassifier(random_state=1)
rfc = RandomForestClassifier(random_state=1)
clf = clf.fit(Xtrain,Ytrain)
rfc = rfc.fit(Xtrain,Ytrain)
score_c = clf.score(Xtest,Ytest)
score_r = rfc.score(Xtest,Ytest)
print("Single Tree:{}".format(score_c),"Random Forest:{}".format(score_r))

2.参数调参方法

1、学习率曲线

# 这是森林中树木的数量,即基基评估器的数量。这个参数对随机森林模型的精确性影响是单调的
# n_estimators越大,模型的效果往往越好
# n_estimators的学习曲线
superpa = []
for i in range(200):rfc = RandomForestClassifier(n_estimators=i+1,n_jobs=-1,random_state=1)rfc_s = cross_val_score(rfc,xtrain_vec,sentiment_train,cv=10).mean()superpa.append(rfc_s)
# 打印分数最高时的分数和n_estimators的值
print(max(superpa),superpa.index(max(superpa))+1)
plt.figure(figsize=[20,5])
plt.plot(range(1,201),superpa)
plt.show()

在这里插入图片描述
可以看到此时n_estimators为138时,分数最高。
将上面n_estimators的最佳值放到下面的模型训练中去,寻找max_depth的最佳。

#  max_depth的学习曲线
superpa = []
for i in range(20):rfc = RandomForestClassifier(max_depth=i+1,n_jobs=-1,random_state=1,n_estimators=138)rfc_s = cross_val_score(rfc,xtrain_vec,sentiment_train,cv=10).mean()superpa.append(rfc_s)
# 打印分数最高时的分数和max_depth的值
print(max(superpa),superpa.index(max(superpa))+1)
plt.figure(figsize=[20,5])
plt.plot(range(1,21),superpa)
plt.show()

2、网格调优

from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import cross_val_score #K折交叉验证
from sklearn.model_selection import GridSearchCV  # 网格调参
from sklearn.model_selection import RandomizedSearchCV
#分类问题,先建立一个分类器
clf = RandomForestClassifier(n_estimators=20)#给定参数搜索范围
param_test={'max_depth':[i for i in range(1, 25, 2)],'n_estimators':[i for i in range(1, 150, 5)],"min_samples_split": [i for i in range(1, 10, 2)]}#RandomSearch+CV选取超参数
random_search = RandomizedSearchCV(clf,param_distributions =param_test,n_iter=20,cv=5)random_search.fit(xtrain_vec,sentiment_train)print("随机搜索最优得分:",random_search.best_score_)
print("随机搜索最优参数组合:\n",random_search.best_params_)

总结

本篇在这里介绍了对评论情感分类采用了随机森林的方法,感觉预测效果一般,仅有60%左右的正确率,排除是文本标签是人工标注所导致的误差,在后面我们采用别的机器学习模型尝试一下,像是朴素贝叶斯等。


http://chatgpt.dhexx.cn/article/S8kB5FX3.shtml

相关文章

随机森林

随机森林-----集成算法之一,分类,回归和特征选择 算法步骤: 1.用有抽样放回的方法(bootstrap)从样本集中选取n个样本作为一个训练集 2.用抽样得到的样本集生成一棵决策树。在生成的每一个结点: 1.随机不重复…

随机森林(Random Forest)简单介绍

文章目录 随机森林(Random Forest)简单介绍1. 介绍2. 工作原理2.1 随机森林的基本原理2.1.1 随机采样2.1.2. 随机选特征2.1.3. 多数表决 2.2 随机森林的建模过程2.2.1. 建立多颗决策树2.2.2. 特征随机选择2.2.3. 样本随机选择2.2.4. 决策树训练与生成2.2…

什么是随机森林?

什么是随机森林? 随机森林是一种有监督的机器学习算法。由于其准确性,简单性和灵活性,它已成为最常用的一种算法。事实上,它可以用于分类和回归任务,再加上其非线性特性,使其能够高度适应各种数据和情况。 …

[Machine Learning Algorithm] 随机森林(Random Forest)

1 什么是随机森林? 作为新兴起的、高度灵活的一种机器学习算法,随机森林(Random Forest,简称RF)拥有广泛的应用前景,从市场营销到医疗保健保险,既可以用来做市场营销模拟的建模,统计客户来源,保留和流失,也可用来预测疾病的风险和病患者的易感性。最初,我是在参加校…

随机森林算法

随机森林 1.1定义1.2随机森林的随机性体现的方面1.3 随机森林的重要作用1.4 随机森林的构建过程1.5 随机森林的优缺点2. 随机森林参数描述3. 分类随机森林的代码实现 1.1定义 随机森林是一种有监督学习算法,是以决策树为基学习器的集成学习算法。随机森林非常简单&…

机器学习-随机森林(RandomForest)详解

1.什么是随机森林 随机森林就是通过集成学习的思想将多棵树集成的一种算法,它的基本单元是决策树,而它的本质属于机器学习的一大分支——集成学习(Ensemble Learning)方法。 解读下上面的话: 1.随机森林属于集成算法&a…

机器学习之MATLAB代码--随机森林(一)

代码: %% 初始化数据 clc clear close all %% 导入数据 data xlsread(数据集.xlsx,Sheet1,A1:F100);%导入数据库%% 划分训练集和测试集 TE randperm(100);%将数据打乱,重新排序;PN data(TE(1: 80), 1: 5);%划分训练集输入 TN data(TE(1…

sklearn基础篇(七)-- 随机森林(Random forest)

上一节我们提到决策树的一个主要缺点在于经常对训练数据过拟合。随机森林是解决这个问题的一种方法。随机森林是属于集成学习,其核心思想就是集成多个弱分类器以达到一个强分类器的效果。 1 bagging的原理 随机森林采用Bagging的思想,所谓的Bagging可以…

机器学习5—分类算法之随机森林(Random Forest)

随机森林(Random Forest) 前言一、随机森林1.什么是随机森林2.随机森林的特点3.随机森林的生成 二、随机森林的函数模型三、随机森林算法实现1.数据的读取2.数据的清洗和填充3.数据的划分4.代码的实现 总结 前言 随机森林(Random Forest&…

随机森林(Random Forest)通俗教程

目录 1 什么是随机森林?2 随机森林的特点3 随机森林的相关基础知识4 随机森林的生成5 袋外错误率(oob error)6 随机森林工作原理解释的一个简单例子7 随机森林的Python实现8 参考内容 1 什么是随机森林? 作为新兴起的、高度灵活的…

机器学习算法系列(十八)-随机森林算法(Random Forest Algorithm)

阅读本文需要的背景知识点:决策树学习算法、一丢丢编程知识 最近笔者做了一个基于人工智能实现音乐转谱和人声分离功能的在线应用——反谱(Serocs),感兴趣的读者欢迎试用与分享,感谢您的支持!serocs.cn 一…

使用jvisualvm通过JMX的方式远程监控JVM的运行情况

公众号,欢迎关注 使用jvisualvm通过JMX的方式远程监控JVM的运行情况,步骤如下 远程服务器的配置 在启动java程序时加上如下几个参数 -Dcom.sun.management.jmxremote-Dcom.sun.management.jmxremote.sslfalse-Dcom.sun.management.jmxremote.authen…

JDK 中 jvisualvm 没有 VisualGC

1、图片描述问题 2、解决方法 (1)点击菜单栏中 工具 > 插件 (2)点击 可用插件 > 检查最新版本 出现如下情况表示不成功。 (3)点击 设置 > 编辑 链接: https://visualvm.github.io/…

JVisualVM 的使用教程

欢迎大家关注我的公众号【老周聊架构】,Java后端主流技术栈的原理、源码分析、架构以及各种互联网高并发、高性能、高可用的解决方案。 一、简介 Java VisualVM 是一个直观的图形用户界面,基于Java 的应用程序,在给定的 Java 虚拟机&#xf…

使用jvisualvm、jmc远程监控JVM

演示环境:jdk1.8 jvisualvm和jmc都是JDK自带的监控工具。jmc监控数据比jvisualvm更加丰富。它们都在JDK bin目录中 首先介绍jvisualvm的使用 打开bin/jvisualvm.exe 本地的JVM进程都已经识别出来了,直接点击即可监控。 为了使jvisualvm功能更加强大&a…

jvisualvm安装Visual GC插件

给jdk自带的jvisualvm安装Visual GC插件,遇到Were sorry the java.net site has closed(我们很抱歉java.net网站已经关闭) 1、找到新的更新地址 visualvm新访问地址:https://visualvm.github.io/index.html 进入“Plugins”&am…

用jvisualvm分析dump文件

最近有一个java服务的堆内存溢出,然后僵死了,在重启服务之前用jmap命令生成了一份dump文件便于后面分析。 生成dump文件的命令: jmap -dump:formatb,file20170307.dump 16048 file后面的是自定义的文件名,最后的数字是进程的pi…

JvisualVM使用教程

最近正在学习JvisualVm的使用,写一篇博客记录一下。 一 工具准备 1 软件 已经安装JDK及IDEA。 2 插件 2.1 Idea插件 在idea中按住快捷键 shift command A,输入plugins,搜索visualvm,如下图所示,安装插件。 安装…

Jvisualvm设置中文

从官网上下载的Jvisualvm.exe,一般启动后都为英文版。 如果本地电脑中有安装JDK,只要你使用的是JDK1.6 Update7之后的版本,那么它久已经在你的JDK bin目录里了。(该版本为中文版) 直接启动JDK中bin目录下的jvisualvm.exe即可。

Java VisualVM

文章目录 1.Java VisualVM简介(Introduction to Java VisualVM)1.1 Java VisualVM简介(Introduction to Java VisualVM)1.2 启动Java VisualVM(Starting Java VisualVM)1.2.1 Java VisualVM用户目录&#x…