首页 > 编程语言 >机器学习 之 逻辑回归(LogisticRegression)文本算法的精确率

机器学习 之 逻辑回归(LogisticRegression)文本算法的精确率

时间:2022-10-31 20:36:20浏览次数:71  
标签:LogisticRegression text list IDF 算法 train test 文本 向量


目录

  • ​​0、推荐​​
  • ​​1、背景​​
  • ​​2、效果图​​
  • ​​3、本次实验整体流程​​
  • ​​4、这里用词向量,而不是TF-IDF预处理后的向量​​
  • ​​5、源代码​​
  • ​​6、知识点普及​​
  • ​​6.1逻辑回归优点​​
  • ​​6.2逻辑回归缺点​​

0、推荐

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

1、背景

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

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

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

2、效果图

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

逻辑回归:

机器学习 之 逻辑回归(LogisticRegression)文本算法的精确率_LogisticRegression


通过以上数据可以看出逻辑回归在样本数量较低的情况下还不错的,但是到达20000的时候,准确率已经在78%左右了。相比决策树,效果较理想。

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处理后的效果:

机器学习 之 逻辑回归(LogisticRegression)文本算法的精确率_机器学习_02


经过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.linear_model import LogisticRegression

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):
lr = LogisticRegression()
lr = lr.fit(X, Y)
return lr

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, False)

# 数据大小
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, False)

# 测试
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)预测结果是界于0和1之间的概率;

2)可以适用于连续性和类别性自变量;

3)容易使用和解释;

6.2逻辑回归缺点

1)对模型中自变量多重共线性较为敏感,例如两个高度相关自变量同时放入模型,可能导致较弱的一个自变量回归符号不符合预期,符号被扭转。需要利用因子分析或者变量聚类分析等手段来选择代表性的自变量,以减少候选变量之间的相关性;

2)预测结果呈“S”型,因此从log(odds)向概率转化的过程是非线性的,在两端随着log(odds)值的变化,概率变化很小,边际值太小,slope太小,而中间概率的变化很大,很敏感。 导致很多区间的变量变化对目标概率的影响没有区分度,无法确定阀值。


标签:LogisticRegression,text,list,IDF,算法,train,test,文本,向量
From: https://blog.51cto.com/u_15854865/5811168

相关文章

  • 机器学习 之 决策树(Decision Tree)文本算法的精确率
    目录​​0、推荐​​​​1、背景​​​​2、效果图​​​​3、本次实验整体流程​​​​4、这里用词向量,而不是TF-IDF预处理后的向量​​​​5、源代码​​​​6、知识点普......
  • 人工智能 之 自然语言处理(NLP)算法分类总结
    目录文章目录​​目录​​​​〇、推荐​​​​一、人工智能学习算法分类​​​​1.纯算法类​​​​2.建模方面​​​​二、详细算法​​​​1.分类算法​​​​2.回归算......
  • html-文本格式化标签
    <p>段落标签</p>换行标签<br/> 我是<strong>加粗</strong>的文字  <br/>我是<b>加粗  </b>的文字  我是<em>倾斜</em>的文字<br/>  我是<i>倾斜</i......
  • Dijkstra最短路径算法
    概念是从一个顶点到其余各顶点的最短路径算法,解决的是有权图中最短路径问题。迪杰斯特拉算法主要特点是从起始点开始,采用贪心算法的策略,每次遍历到始点距离最近且未访问过......
  • 实验二:逻辑回归算法实验
    实验二:逻辑回归算法实验|博客班级|https://edu.cnblogs.com/campus/czu/classof2020BigDataClass3-MachineLearning||----|----|----||作业要求|https://edu.cnblogs.co......
  • PHP 动态规划算法
    动态规划实现背包问题题目假设6个物品最大容量10重量分别是【4,2,6,5,3】价值分别【6,3,5,4,6】算法利用贪心思路准备准备10个桶【0,0,0,0,0,0,0,0,0......
  • 常见排序算法总结(不详细)
    常见的排序算法有如下几种:插入排序直接插入排序折半插入排序希尔排序选择排序简单选择排序堆排序交换排序冒泡排序快速排序二路归并排序基数排序外部排序直接插......
  • 传统图像分割算法-基于区域的分割算法
    这类方法按照图像的相似性准则划分不同的区域块。其中较为典型的方法优:种子区域生长法、分水岭法、区域分裂合并法。种子区域生长法:首先通过一组表示不同区域的种子像素开......
  • 随机化算法解决圆排列问题 - python解法
    问题描述给定n个大小不等的圆,现要将这n个圆排进一个矩形框中,且要求各圆与矩形框的底边相切。圆排列问题要求从n个圆的所有排列中找出有最小长度的圆排列。例如,当n=3,且所给......
  • 字符串匹配算法-Sunday
    以往不论是上课还是各种资料书上,看到关于字符串匹配的算法,大抵都是KMP了。然而KMP的next数组理解起来颇为费劲,且容易忘记。在LeetCode刷题中偶然发现了一个叫Sunday的算法,不......