【人工智能】随机森林(Random Forest)文本算法的精确率

23 篇文章 1 订阅
14 篇文章 0 订阅

0、推荐

无意中发现了一个巨牛的人工智能教程,忍不住分享一下给大家。教程不仅是零基础,通俗易懂,而且非常风趣幽默,像看小说一样!觉得太牛了,所以分享给大家。点这里可以跳转到教程。

1、背景

最近的项目中,用到了很多机器学习的算法,每个机器学习的算法在不同的样本下的精准率是不同的。为了验证每个算法在每种不同样本数量的能力,就做了一下实验,本文讲的是“随机森林”在文本算法中的精准率。

相关其它机器学习算法的精准率:
决策树:机器学习 之 决策树(Decision Tree)文本算法的精确率
逻辑回归:机器学习 之 逻辑回归(LogisticRegression)文本算法的精确率
支持向量机:机器学习 之 支持向量机(SupportVectorMachine)文本算法的精确率
K近邻:机器学习 之 K近邻(K-NearestNeighbor)文本算法的精确率
朴素贝叶斯:机器学习 之 朴素贝叶斯(Naive Bayesian Model)文本算法的精确率

机器学习各个算法对比:人工智能 之 机器学习常用算法总结 及 各个常用分类算法精确率对比

2、效果图

先看一下没有任何调参的情况下的效果吧!

随机森林:
在这里插入图片描述
通过以上数据可以看出数据量在小于5000时效果还不错,但数据量到达20000左右时,准确率已经达到了70%左右了。

3、本次实验整体流程

1、先把整体样本读到内存中

2、把整体样本按照8:2的比例,分为80%的训练集,20%的测试集

3、然后“训练集”的样本 先分词,再转换为词向量

4、接着把训练集的样本和标签统一的传入算法中,得到拟合后的模型

5、把“测试集”的样本 先分词,再得到词向量

6、把测试集得出的词向量丢到拟合后的模型中,看得出的结果

7、把结果转换为准确率的形式,最后做成表格形式以便观看

这里应该多跑几遍不同样本,然后把结果取平均值,每次的结果还是稍有不同的。

4、这里用词向量,而不是用TF-IDF预处理后的向量

这里我们直接取得词向量,而不是经过TF-IDF处理过的词向量。如果处理过,效果会不如现在的好。

TF-IDF(词频-逆文本频率),前面的TF也就是常说到的词频,我们之前做的向量化也就是做了文本中各个词的出现频率统计,并作为文本特征,这个很好理解。关键是后面的这个IDF,即“逆文本频率”如何理解。有些句子中的词,比如说“的”,几乎所有句子都会出现,词频虽然高,但是重要性却应该比 主语、宾语等低。IDF就是来帮助我们来反应这个词的重要性的,进而修正仅仅用词频表示的词特征值。
概括来讲, IDF反应了一个词在所有文本中出现的频率,如果一个词在很多的文本中出现,那么它的IDF值应该低

加了TF-IDF处理后的效果:
在这里插入图片描述
经过TF-IDF处理后的效果比不处理效果好。所以,这里就要经过TF-IDF处理了哈。
以下源码中,如果加TF-IDF处理,只需要在jiabaToVector()函数中增加True这个参数就OK了

    vector_train = jiabaToVector(m_text_train, False, True)
    ...
    ...
    vector_test = jiabaToVector(m_text_test, True, True)

5、源代码

import jieba
import datetime
# 向量\测试集\训练集\得分比对
from sklearn.model_selection  import train_test_split
from sklearn.feature_extraction.text import TfidfTransformer
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.metrics import accuracy_score
# 随机森林
from sklearn.ensemble import RandomForestClassifier

# 忽略警告
import warnings
warnings.filterwarnings("ignore", category=FutureWarning, module="sklearn", lineno=196)

m_count = [1000,3000,5000,8000,10000,15000,20000]

# all
m_list_allText = []
m_list_allL4ID = []
# 内容的训练集、测试集
m_text_test = []
m_text_train = []
m_label_test = []
m_label_train = []

m_map_all = []


# 读取文件里面数据,获取标签和内容
def getFile(filename, count):
    with open(filename, 'r' ,encoding='utf-8') as fp:
        global m_list_allL4ID,m_list_allText
        m_list_allL4ID = []
        m_list_allText = []
        for i in range(count):
            text = fp.readline()
            if ":" in text:
                L4ID = text.split(":")[-2]
                Msg = text.split(":")[-1]
                m_list_allL4ID.append(L4ID)
                m_list_allText.append(Msg)

# 随机分为 测试集 和 训练集 2-8分
def randomTestAndTrain():
    # 生成训练集和测试集
    global m_text_test, m_text_train, m_label_test, m_label_train
    m_text_train, m_text_test, m_label_train, m_label_test = train_test_split(m_list_allText, m_list_allL4ID, test_size=0.2, random_state=1)

def jiabaToVector(list, isTest, isTFIDF = False):
    tmp_list = []
    for sentence in list:
        tmp_list.append(" ".join(jieba.cut(sentence.strip())))
    # 利用TFIDF生成词向量
    transformer = TfidfTransformer()
    if isTest:
        if isTFIDF:
            tfidf = transformer.fit_transform(vectorizer.transform(tmp_list))
        else:
            tfidf = vectorizer.transform(tmp_list)
    else:
        if isTFIDF:
            tfidf = transformer.fit_transform(vectorizer.fit_transform(tmp_list))
        else:
            tfidf = vectorizer.fit_transform(tmp_list)
    return tfidf


# 创建默认参数
def predict_4(X, Y):
    clf = RandomForestClassifier()
    clf = clf.fit(X, Y)
    return clf

def test(count):
    # getFile("./rg_test.train", count)
    getFile("./rg_train_20190102_20181227114134.train", count)
    # print("获取全部已知数据的label和text")

    # 随机分为 测试集 和 训练集 2-8分
    randomTestAndTrain()

    global vectorizer
    # 全局向量
    vectorizer = CountVectorizer()

    # 生成训练向量
    vector_train = jiabaToVector(m_text_train, False)
    # 生成训练向量-tfidf
    # vector_train = jiabaToVector(m_text_train, False, True)

    # 数据大小
    lenall = len(m_list_allText)
    # print("总集大小:", lenall)
    print("总集大小:", lenall)

    # 训练
    startT_Train = datetime.datetime.now()
    clf = predict_4(vector_train, m_label_train)
    endT_Train = datetime.datetime.now()
    print("训练Time:", (endT_Train - startT_Train).microseconds)

    # 生成测试向量
    vector_test = jiabaToVector(m_text_test, True)
    # 生成测试向量-tfidf
    # vector_test = jiabaToVector(m_text_test, True, True)

    # 测试
    startT = datetime.datetime.now()
    result = clf.predict(vector_test)
    endT = datetime.datetime.now()
    print("测试Time:", (endT - startT).microseconds)

    # 计算百分比
    percent = accuracy_score(result, m_label_test)
    print("准确率:", round(percent, 3))

    map_all = {}
    map_all["精确率"]=round(percent, 3)
    map_all["数据量"]=lenall
    map_all["训练时间/us"]=(endT_Train - startT_Train).microseconds
    map_all["测试时间/us"]=(endT - startT).microseconds
    m_map_all.append(map_all)

if __name__ =="__main__":
    print ("-- 开始 --")
    for testC in m_count:
        test(testC)
    print ("-- 结束 --")

    # 打印表格
    print("数据量\t准确度\t训练时间/us\t测试时间/us")
    for key in m_map_all:
        print("%d\t%f\t%d\t%d"%(key["数据量"],key["精确率"],key["训练时间/us"],key["测试时间/us"]))

6、知识点普及

6.1随机森林优点

1、可以处理高维数据,不同进行特征选择(特征子集是随机选择)
2、模型的泛化能力较强
3、训练模型时速度快,成并行化方式,即树之间相互独立
4、模型可以处理不平衡数据,平衡误差
5、最终训练结果,可以对特种额排序,选择比较重要的特征
6、随机森林有袋外数据(OOB),因此不需要单独划分交叉验证集
7、对缺失值、异常值不敏感
8、模型训练结果准确度高
9、相对Bagging能够收敛于更小的泛化误差

6.2 随机森林缺点

1、当数据噪声比较大时,会产生过拟合现象
2、对有不同取值的属性的数据,取值划分较多的属性会对随机森林产生更大的影响

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

沙振宇

你的鼓励将是我创作的最大动力~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值