数据集下载: 链接:https://pan.baidu.com/s/17EL37CQ-FtOXhtdZHQDPgw

提取码:0829

逻辑斯蒂回归

@

1.理论

1.1 多分类

若用logistc进行五分类,可以进行5次二分类,把情感标签当作5维向量。

softmax常用于多分类,当类别数为2时,和logistic等价。他把一些输入映射为0-1之间的实数,并且归一化保证和为1,因此多分类的概率之和也刚好为1。

而softmax是在输出层神经元输出结果\(X(x_1,x_2···x_n)\)之后,设\(p_i=\frac{e^{x_i}}{\sum_{i=1}^ne^{x_i}}\)

1.2 公式

\(sigmoid(x)=\frac{1}{1+e^{-z}}\)

\(softmax(x_i)=\frac{e^{x_i}}{\sum_j e^{x_j}}\)

\(Cost:J(θ)=-\frac{1}{m}[{\sum_{i=1}^m}((y^{(i)})logh_θ(x^{(i)})+(1-y^{(i)}))log(1-h_θ(x^{(i)}))+λ{\sum_{j=1}^nθ_j^2}]\)

\(hypothesis:h_θ(x)=sigmoid(θ^Tx)=\frac{1}{1+e^{-θ^Tx}}\)

\(gradient=\frac{\partial J(θ_0,θ_1)}{\partial θ_j}=\frac{1}{m}{\sum_{i=1}^m}[(h_θ(x^{(i)})-y^{(i)})x_j^{(i)}+λθ_j]\)

\(GradientDescent:θ_j=θ_j-α\frac{\partial J(θ_0,θ_1)}{\partial θ_j}=θ_j-\frac{α}{m}{\sum_{i=1}^m}[(h_θ(x^{(i)})-y^{(i)})x_j^{(i)}+λθ_j]\)

2.实验

2.1 实验步骤

  1. 读取数据
  2. 训练
    1. 构建词频矩阵,进行标准化
    2. 构建逻辑回归模型,自动拟合训练
  3. 测试

2.2 代码

本实验所用数据集已经过脱敏处理,所以可以直接使用,若在实际应用中对中英文文本进行分类,还需要进行数据预处理,将其转化为数字

  1. """
  2. Task: 基于逻辑斯蒂回归的文本分类
  3. Author: ChengJunkai @github.com/Cheng0829
  4. Email: chengjunkai829@gmail.com
  5. Date: 2022/09/03
  6. Reference: Tae Hwan Jung(Jeff Jung) @graykode
  7. """
  8. '''
  9. 数据集说明:
  10. train.csv结构:
  11. id article word_seg class
  12. 0 991700 509221 410256··· 816903 597526··· 14
  13. test.csv结构:
  14. id article word_seg
  15. 0 111111 222222 333333··· 444444 555555···
  16. 文章索引“id”、中文文字索引“article”、词语索引“word_seg”、文章类别“class”。
  17. 对于class,测试集是不包含该字段的,这就是我们需要分类的类别,也就是模型的输出y。
  18. 数据集都经过了脱敏处理,也就是说我们打开数据集文件看到的都是一些数字,
  19. 这些数字其实代表的就是一个字或词或标点符号。
  20. 本实验只从词的角度,只分析“word_seg”作为输入特征,“class”作为分类标记进行训练。不使用article字段
  21. '''
  22. import pandas as pd
  23. from sklearn.linear_model import LogisticRegression
  24. from sklearn.feature_extraction.text import CountVectorizer
  25. import time
  26. # 读取csv文件(前n行)
  27. def read(train_set_path, test_set_path):
  28. n = 100 # 只读前100行样本
  29. # 法1:选择性读取
  30. train_data = pd.read_csv(train_set_path, header=0, usecols=['word_seg', 'class'], nrows=n) # 训练集
  31. test_data = pd.read_csv(test_set_path, header=0, usecols=['id', 'word_seg'], nrows=n) # 测试集
  32. # 法2:读取数据,并删除不相关字段
  33. # train_data = pd.read_csv(train_set_path, nrows=n) #训练集
  34. # test_data = pd.read_csv(test_set_path, nrows=n) #测试集
  35. # train_data.drop(columns=['id','article'], inplace=True)
  36. # test_data.drop(columns=['article'], inplace=True) #保留id
  37. return train_data, test_data
  38. # 训练拟合模型
  39. def train(train_data):
  40. # 将文本中的词语转换为词频矩阵
  41. '''
  42. CountVectorizer是属于常见的特征数值计算类,是一个文本特征提取方法。
  43. 对于每一个训练文本,它只考虑每种词汇在该训练文本中出现的频率。
  44. CountVectorizer会将文本中的词语转换为词频矩阵,它通过fit_transform函数计算各个词语出现的次数。
  45. '''
  46. vectorizer = CountVectorizer(ngram_range=(1, 2), min_df=3, max_df=0.9, max_features=100000)
  47. '''
  48. ngram_range:词组切分的长度范围,ngram_range(1,2)是指将text根据N-gram规则,分别对每个词/每2个词进行划分
  49. min_df:单词出现次数小于这个值,则认为不是关键词(占比小,影响度小)
  50. max_df:表示有某单词出现的文档数与语料库文档数的最大百分比(太常见则没有区分度)
  51. stop_words:设置停用词
  52. # TF-IDF -> max_df, min_df
  53. max_features:默认为None,可设为int,对所有关键词的词频进行降序排序,只取前max_features个作为关键词集
  54. '''
  55. # CountVectorizer会将文本中的词语转换为词频矩阵,它通过fit_transform函数计算各个词语出现的次数。
  56. # 拟合生成标准化词频矩阵
  57. """
  58. fit_transform() = fit() + transform()
  59. fit():求得训练集X的均值,方差,最大值,最小值等属性 -> 和logistic.fit()不同
  60. transform():在fit的基础上,进行标准化,降维,归一化等操作
  61. Tips:正确做法:先对训练集用fit_transform进行fit,找到均值方差并标准化,然后在测试集中只transform,这样可以保证训练集和测试集的处理方式一样
  62. """
  63. # fit_transform()的作用就是先拟合数据,然后转化它将其转化为标准形式。相当于fit+transform
  64. x_train = vectorizer.fit_transform(train_data['word_seg'])
  65. """fit_transform/transform返回值的结构
  66. (sample_i,number_j) count
  67. 1.sample_i是第i个样本的序号,
  68. 2.number_j是该单词/词组在整个数据集单词/词组中的序号
  69. (对于不同样本文档中相同的单词/词组,它们的number_j相同,但不同的单词/词组的序号不重复)
  70. 在计算x_train.shape时,只会计算不同的单词/词组
  71. 3.count是该单词/词组在该样本文档的频数
  72. """
  73. y_train = train_data['class'] - 1 # 类别默认是从0开始的,所以这里需要-1
  74. # 构建逻辑回归模型
  75. logistic_model = LogisticRegression(C=4, dual=False)
  76. """LogisticRegression
  77. C:正浮点型.正则化强度的倒数(默认为1.0)
  78. dual = True则用对偶形式;dual = False则用原始形式(默认为False)
  79. """
  80. # 拟合,训练
  81. logistic_model.fit(x_train, y_train)
  82. """
  83. LogisticRegression.fit(x,y):根据给定的训练数据对模型进行拟合。
  84. 输入为样本的词频矩阵和样本类别
  85. """
  86. return vectorizer, logistic_model
  87. # 保存预测结果
  88. def save(test_data, y_test, save_path):
  89. # 保存结果
  90. y_test = y_test.tolist() # 把(n,)的一维矩阵y_test转化为矩阵列表形式存储
  91. test_data['class'] = y_test + 1 # 新建一个class列,存入类别值(类别还原+1)
  92. data_result = test_data.loc[:, ['id', 'class']] # 根据index索引所有行和id,class列
  93. """
  94. pandas的loc函数:locate定位函数.
  95. 1.定位行列:data.loc[行索引, 列名]
  96. 2.只定位行:data.loc[行索引]
  97. 3.只定位列:data.loc[:, 列名]
  98. """
  99. data_result.to_csv(save_path, index=False)
  100. if __name__=="__main__":
  101. chars = '*' * 20
  102. '''1.读取数据'''
  103. # old_time = time.time()
  104. train_data, test_data = read('./train_set.csv', './test_set.csv')
  105. # current_time = time.time()
  106. # print(chars + '读取完成!用时{}s'.format(round(current_time-old_time,2)) + chars + '\n')
  107. '''2.训练'''
  108. vectorizer, logistic_model = train(train_data)
  109. '''3.预测'''
  110. x_test = vectorizer.transform(test_data['word_seg']) # 矩阵标准化
  111. y_test = logistic_model.predict(x_test) # (n,)
  112. """
  113. LogisticRegression.predict(x,y):根据训练模型对测试集进行预测。
  114. 输入为测试样本的词频矩阵,输出为(n,)的一维矩阵
  115. """
  116. '''4.保存'''
  117. # save(test_data, y_test,save_path='./result.csv')
  118. print('Over!')

Tips:

  • 若用logistc进行五分类,可以进行5次二分类,把情感标签当作5维向量。

  • softmax常用于多分类,当类别数为2时,和logistic等价。他把一些输入映射为0-1之间的实数,并且归一化保证和为1,因此多分类的概率之和也刚好为1。

NLP之基于logistic回归的文本分类的更多相关文章

  1. 基于Spark Mllib的文本分类

    基于Spark Mllib的文本分类 文本分类是一个典型的机器学习问题,其主要目标是通过对已有语料库文本数据训练得到分类模型,进而对新文本进行类别标签的预测.这在很多领域都有现实的应用场景,如新闻网站 ...

  2. Spark2.0机器学习系列之4:Logistic回归及Binary分类(二分问题)结果评估

    参数设置 α: 梯度上升算法迭代时候权重更新公式中包含 α :  http://blog.csdn.net/lu597203933/article/details/38468303 为了更好理解 α和 ...

  3. 利用logistic回归解决多分类问题

    利用logistic回归解决手写数字识别问题,数据集私聊. from scipy.io import loadmat import numpy as np import pandas as pd im ...

  4. 基于Logistic回归和sigmoid函数的分类算法推导

    此部分内容是对机器学习实战一书的第五章的数学推导,主要是对5.2节代码实现中,有一部分省去了相关的公式推导,这里进行了推导,后续会将算法进行java实现.此部分同样因为公式较多,采用手写推导,拍照记录 ...

  5. 基于深度学习的文本分类案例:使用LSTM进行情绪分类

    Sentiment classification using LSTM 在这个笔记本中,我们将使用LSTM架构在电影评论数据集上训练一个模型来预测评论的情绪.首先,让我们看看什么是LSTM? LSTM ...

  6. 基于Naive Bayes算法的文本分类

    理论 什么是朴素贝叶斯算法? 朴素贝叶斯分类器是一种基于贝叶斯定理的弱分类器,所有朴素贝叶斯分类器都假定样本每个特征与其他特征都不相关.举个例子,如果一种水果其具有红,圆,直径大概3英寸等特征,该水果 ...

  7. 基于Text-CNN模型的中文文本分类实战 流川枫 发表于AI星球订阅

    Text-CNN 1.文本分类 转眼学生生涯就结束了,在家待就业期间正好有一段空闲期,可以对曾经感兴趣的一些知识点进行总结. 本文介绍NLP中文本分类任务中核心流程进行了系统的介绍,文末给出一个基于T ...

  8. 基于Text-CNN模型的中文文本分类实战

    Text-CNN 1.文本分类 转眼学生生涯就结束了,在家待就业期间正好有一段空闲期,可以对曾经感兴趣的一些知识点进行总结. 本文介绍NLP中文本分类任务中核心流程进行了系统的介绍,文末给出一个基于T ...

  9. Logistic回归分析之多分类Logistic回归

    Logistic回归分析(logit回归)一般可分为3类,分别是二元Logistic回归分析.多分类Logistic回归分析和有序Logistic回归分析.logistic回归分析类型如下所示. Lo ...

随机推荐

  1. 让Python更优雅更易读(第一集)

    变量和注释 1.变量 在编写变量尽量要让其清晰只给,让人清除搞清楚代码的意图 下方两段代码作用完全一样,但第二段代码是不是更容易让人理解 value = s.strip() username = in ...

  2. Java SE 9 多版本兼容 JAR 包示例

    Java SE 9 多版本兼容 JAR 包示例 作者:Grey 原文地址:Java SE 9 多版本兼容 JAR 包示例 说明 Java 9 版本中增强了Jar 包多版本字节码文件格式支持,也就是说在 ...

  3. mysql 重复执行创建表、新增字段脚本

    #bigint 可重复执行创建表脚本 1 Create Table If Not Exists `库名`.`表名`( 2 字段列表 3 ) ENGINE=InnoDB DEFAULT CHARSET= ...

  4. KingbaseESV8R6 垃圾回收原理以及如何预防膨胀

    背景 KingbaseESV8R6支持snapshot too old 那么实际工作中,经常看到表又膨胀了,那么我们讨论一下导致对象膨胀的常见原因有哪些呢? 未开启autovacuum 对于未开启au ...

  5. 【读书笔记】C#高级编程 第二十一章 任务、线程和同步

    (一)概述 所有需要等待的操作,例如,因为文件.数据库或网络访问都需要一定的时间,此时就可以启动一个新的线程,同时完成其他任务. 线程是程序中独立的指令流. (二)Paraller类 Paraller ...

  6. 2020年12月-第01阶段-前端基础-HTML CSS 项目阶段(三)

    品优购项目(三) 1. 首页制作 1). 楼层区 floor 注意这个floor 一个大盒子 包含, 不要给高度,内容有多少,算多少 2). 家用电器模块 这个模块 简单 不需要写样式 版心居中对齐 ...

  7. 算法:KMP, str1字符串是否包含str2字符串

    [普通解法]从左到右遍历str1的每一个字符,然后看如果 以当前字符作为第一个字符出发 是否匹配 str2字符串. [KMP算法] 1)生成一个nextArr数组,长度与str2字符串长度一样.i 的 ...

  8. Python数据科学手册-Pandas:层级索引

    一维数据 和 二维数据 分别使用Series 和 DataFrame 对象存储. 多维数据:数据索引 超过一俩个 键. Pandas提供了Panel 和 Panel4D对象 解决三维数据和四维数据. ...

  9. Python数据分析教程(一):Numpy

    原文链接:https://blog.onefly.top/posts/13140.html 数据的纬度 一维数据:列表和集合类型 二维数据:列表类型 多维数据:列表类型 高维数据:字典类型或数据表示格 ...

  10. 【学习笔记】 第05章 pandas入门

    前言 上一篇学习中学成的随笔是我的第一篇随笔,撰写中有颇多不足,比如事无巨细的写入学习过程反而像是在抄书,失去了很多可读性也不利于自己反过头来复习,本章节学习需要多加注意,尽量写下较为关键的内容,犯下 ...