之前写了一个贝叶斯分类的问题,这次使用LR实现一个分类问题(调库实现),首先就是收集数据,这次使用的是一个某简书大佬的一个小项目的数据集(也可以自己收集一个数据集,进行分类),格式如下:

1    今天早盘带学员以15元左右买入《300223北京君正》明天有望大涨,请关注 勿追买!金股热线:400-6289775现代投资【国富咨询】
0   您尾号7544卡13日14:26网上银行支出(消费)158元。【工商银行】

步骤如下:数据预处理(此过程可以代码实现,也可以自己提前手动处理好,本次使用的数据集格式都和无效数据、乱码数据都清理掉了)->将数据拆分为训练集、测试集、预测集->将数据生成词频字典->提取特征,将文本特征进行数值化->训练LR模型->模型评估->进行预测

这里简单说一下独热码:假设词库是 我\爱\你\中国,则独热码位数为4位,其实我爱你为1110,我爱中国1101。(1代表存在,0代表不存在)(1110其实就代表 有我、爱、你的意思)

文件结构如下:数据文件为train.txt、predict.txt,代码文件为model.py文件

1.首先,加载需要库文件

import collections
import itertools
import operator
import array
import jieba
import sklearn
import sklearn.linear_model as linear_model

2.写一个分离数据标签和内容的数据处理函数(该函数test_size参数同时也是一个标志,为0则不划分,否则划分)

# 对文本进行标签和文本的分离,并划分训练集和测试集
def data_xy(data_path, test_size):assert test_size >= 0 and test_size < 1.0, '0 <= test_size < 1'# 列表:y是标签,x是文本y = list()x = list()for line in open(data_path, "r").readlines():# line[:-1]除去最后一个元素(换行符),split('\t', 1)按\t进行分割,为什么这样哪,具体请看数据集label, text = line[:-1].split('\t', 1)# 使用jieba分词工具进行分词x.append(list(jieba.cut(text)))y.append(int(label))# 参数test_size为0代表不进行划分if test_size == 0:return x, y# 参数test_size为0-1时,利用sklearn包划分数据集# train_test_split()具体参考:https://blog.csdn.net/zhuqiang9607/article/details/83686308return sklearn.model_selection.train_test_split(x, y, test_size=test_size, random_state=1028)

3.建立词频字典,并过滤低频词的函数

# 创建词频字典,并过滤低频词
def build_dict(text_list, min_freq):# 根据传入的文本列表,创建一个最小频次为min_freq的字典,并返回字典word -> wordidassert min_freq >= 0 and min_freq < 100, '请输入合理的最小词频'# collections.Counter快速的统计一个字典里面每个元素出现的次数,参数必须是一维的listfreq_dict = collections.Counter(itertools.chain(*text_list))# 按词频排序freq_list = sorted(freq_dict.items(), key=operator.itemgetter(1), reverse=True)# 过滤低频词words, _ = zip(*filter(lambda wc: wc[1] >= min_freq, freq_list))return dict(zip(words, range(len(words))))

4.将文本转成独热码的函数

# 将传入的文本转化为向量/独热码
def text2vect(text_list, word2id):# 返回结果大小为[n_samples, dict_size]X = list()for text in text_list:# 创建数组长度,长度[0] * len(word2id)vect = array.array('l', [0] * len(word2id))for word in text:if word not in word2id:continuevect[word2id[word]] = 1X.append(vect)return X

5.关于模型的各种评估结果的函数

def evaluate(model, X, y):# 评估数据集,并返回评估结果,包括:正确率、AUC值accuracy = model.score(X, y)fpr, tpr, thresholds = sklearn.metrics.roc_curve(y, model.predict_proba(X)[:, 1], pos_label=1)return accuracy, sklearn.metrics.auc(fpr, tpr)

主函数

# 主函数
if __name__ == "__main__":# 有监督模型,标签0-->正常短信,标签1-->垃圾短信data = "train.txt"predict = "predict.txt"# step 1:分词并拆分成训练集train和测试集test,预测集predictX_train, X_test, Y_train, Y_test = data_xy(data, 0.2)X_predict, Y_predict = data_xy(predict, 0)# step 2:创建字典word2id = build_dict(X_train, min_freq=5)# step 3:抽取特征,文本特征的数值化,这里使用了Bag-of-words模型,常用的方式是还有TF-IDF、word2vec等X_train = text2vect(X_train, word2id)X_test = text2vect(X_test, word2id)X_predict = text2vect(X_predict, word2id)# step 4:训练模型,我们使用逻辑回归模型来解决这个二分类的问题,直接调用sklearn中封装好LR的模型,# 详细参数说明请查询skilearn的官网APIlr = linear_model.LogisticRegression(C=1)lr.fit(X_train, Y_train)# step 5:训练集模型评估accuracy, auc = evaluate(lr, X_train, Y_train)print("训练集正确率:", accuracy * 100)print("训练集AUC值:", auc)# step 6:测试集模型评估accuracy, auc = evaluate(lr, X_test, Y_test)print("测试集正确率:", accuracy * 100)print("测试AUC值:", auc)# step 7:进行预测,并输出预测结果和实际结果label_predict = lr.predict(X_predict)# 输出的label_predict和Y_predict格式不统一,很难受,输出一下数据类型看一下,然后进行统一# print(type(label_predict),type(Y_predict))# <class 'numpy.ndarray'> <class 'list'>print("模型预测标签:", label_predict.tolist())print("数据实际标签:", Y_predict)

完整代码如下:

import collections
import itertools
import operator
import array
import jieba
import sklearn
import sklearn.linear_model as linear_model
# 对文本进行标签和文本的分离,并划分训练集和测试集
def data_xy(data_path, test_size):assert test_size >= 0 and test_size < 1.0, '0 <= test_size < 1'# 列表:y是标签,x是文本y = list()x = list()for line in open(data_path, "r").readlines():# line[:-1]除去最后一个元素(换行符),split('\t', 1)按\t进行分割,为什么这样哪,具体请看数据集label, text = line[:-1].split('\t', 1)# 使用jieba分词工具进行分词x.append(list(jieba.cut(text)))y.append(int(label))# 参数test_size为0代表不进行划分if test_size == 0:return x, y# 参数test_size为0-1时,利用sklearn包划分数据集# train_test_split()具体参考:https://blog.csdn.net/zhuqiang9607/article/details/83686308return sklearn.model_selection.train_test_split(x, y, test_size=test_size, random_state=1028)
# 创建词频字典,并过滤低频词
def build_dict(text_list, min_freq):# 根据传入的文本列表,创建一个最小频次为min_freq的字典,并返回字典word -> wordidassert min_freq >= 0 and min_freq < 100, '请输入合理的最小词频'# collections.Counter快速的统计一个字典里面每个元素出现的次数,参数必须是一维的listfreq_dict = collections.Counter(itertools.chain(*text_list))# 按词频排序freq_list = sorted(freq_dict.items(), key=operator.itemgetter(1), reverse=True)# 过滤低频词words, _ = zip(*filter(lambda wc: wc[1] >= min_freq, freq_list))return dict(zip(words, range(len(words))))
# 将传入的文本转化为向量/独热码
def text2vect(text_list, word2id):# 返回结果大小为[n_samples, dict_size]X = list()for text in text_list:# 创建数组长度,长度[0] * len(word2id)vect = array.array('l', [0] * len(word2id))for word in text:if word not in word2id:continuevect[word2id[word]] = 1X.append(vect)return X
def evaluate(model, X, y):# 评估数据集,并返回评估结果,包括:正确率、AUC值accuracy = model.score(X, y)fpr, tpr, thresholds = sklearn.metrics.roc_curve(y, model.predict_proba(X)[:, 1], pos_label=1)return accuracy, sklearn.metrics.auc(fpr, tpr)# 主函数
if __name__ == "__main__":# 有监督模型,标签0-->正常短信,标签1-->垃圾短信data = "train.txt"predict = "predict.txt"# step 1:分词并拆分成训练集train和测试集test,预测集predictX_train, X_test, Y_train, Y_test = data_xy(data, 0.2)X_predict, Y_predict = data_xy(predict, 0)# step 2:创建字典word2id = build_dict(X_train, min_freq=5)# step 3:抽取特征,文本特征的数值化,这里使用了Bag-of-words模型,常用的方式是还有TF-IDF、word2vec等X_train = text2vect(X_train, word2id)X_test = text2vect(X_test, word2id)X_predict = text2vect(X_predict, word2id)# step 4:训练模型,我们使用逻辑回归模型来解决这个二分类的问题,直接调用sklearn中封装好LR的模型,# 详细参数说明请查询skilearn的官网APIlr = linear_model.LogisticRegression(C=1)lr.fit(X_train, Y_train)# step 5:训练集模型评估accuracy, auc = evaluate(lr, X_train, Y_train)print("训练集正确率:", accuracy * 100)print("训练集AUC值:", auc)# step 6:测试集模型评估accuracy, auc = evaluate(lr, X_test, Y_test)print("测试集正确率:", accuracy * 100)print("测试AUC值:", auc)# step 7:进行预测,并输出预测结果和实际结果label_predict = lr.predict(X_predict)# 输出的label_predict和Y_predict格式不统一,很难受,输出一下数据类型看一下,然后进行统一# print(type(label_predict),type(Y_predict))# <class 'numpy.ndarray'> <class 'list'>print("模型预测标签:", label_predict.tolist())print("数据实际标签:", Y_predict)

运行结果:

训练集正确率: 99.40760993392573
训练集AUC值: 0.9995892953795253
测试集正确率: 96.81093394077449
测试AUC值: 0.9925394550652651
模型预测标签: [0, 1, 0, 0, 1, 0, 1, 0, 0]
数据实际标签: [0, 1, 0, 0, 1, 0, 1, 1, 0]

(以上代码可以直接运行,对应数据,可以自己爬取,格式按照样例即可)

NLP逻辑回归模型(LR)实现分类问题实例详解相关推荐

  1. R语言分类模型:逻辑回归模型LR、决策树DT、推理决策树CDT、随机森林RF、支持向量机SVM、Rattle可视化界面数据挖掘、分类模型评估指标(准确度、敏感度、特异度、PPV、NPV)

    R语言分类模型:逻辑回归模型LR.决策树DT.推理决策树CDT.随机森林RF.支持向量机SVM.Rattle可视化界面数据挖掘.分类模型评估指标(准确度.敏感度.特异度.PPV.NPV) 目录

  2. 逻辑回归(LR实则分类)的损失函数

    原文链接:https://blog.csdn.net/CTTACM/article/details/91472794 逻辑回归是在线性函数的基础上,经过激活函数后产生的0~1之间的概率值. 设x为特征 ...

  3. 机器学习之逻辑回归模型

    文章目录 分类思想 逻辑回归模型公式 公式推导 sigmoid函数 避免过拟合 降低模型复杂度 加入L1/L2正则项 正则化的作用 增加训练数据 使用逻辑回归模型进行多分类的几种方式 One vs O ...

  4. 逻辑回归(LR)算法预测患有疝气病症病马的死亡率

    数据描述: 数据集来源 Horse Colic Data Set 数据预处理: 经过缺失值处理以及数据的类别标签整理后,实际使用的特征为20个,类别标签为存活和未存活 1和0 缺失值特征使用0值填充, ...

  5. python建立逻辑回归模型

    利用Scikit-Learn对数据进行逻辑回归分析 1.特征选择(1)给出各个特征的F值和p值,选出F值大的或者p值小的(2)递归特征消除 Scikit-Learn提供了RFE包,还有RFECV,利用 ...

  6. 逻辑回归模型(Logistic Regression, LR)基础

    逻辑回归模型(Logistic Regression, LR)基础 逻辑回归(Logistic Regression, LR)模型其实仅在线性回归的基础上,套用了一个逻辑函数,但也就由于这个逻辑函数, ...

  7. 逻辑回归模型(Logistic Regression, LR)基础 - 文赛平

     逻辑回归模型(Logistic Regression, LR)基础 - 文赛平 时间 2013-11-25 11:56:00 博客园精华区 原文  http://www.cnblogs.com/ ...

  8. AI上推荐 之 逻辑回归模型与GBDT+LR(特征工程模型化的开端)

    1. 前言 随着信息技术和互联网的发展, 我们已经步入了一个信息过载的时代,这个时代,无论是信息消费者还是信息生产者都遇到了很大的挑战: 信息消费者:如何从大量的信息中找到自己感兴趣的信息? 信息生产 ...

  9. DSML_分类算法笔记之逻辑回归模型

    其他相关文章 DS&ML_关联分析笔记 DS&ML_分类算法笔记之支持自动机SVM模型 DS&ML_分类算法笔记之随机森林.梯度提升树.XGBoost模型 DS&ML_ ...

最新文章

  1. nginx rewrite 参数和例子
  2. c语言 printf右对齐,杨辉三角右对齐
  3. 波士顿动力机器狗化身警犬入宅执法,网友:我不想生活在《黑镜》里
  4. C#中的is和as操作符
  5. 第1章 ASP.NET 3.5与开发工具
  6. mac系统pycharm配置python环境_Python--在Mac下安装PyQt5环境并配合pycharm(全部使用当前最新版)...
  7. CleanCodeHandbook Chapter 2: Math(17-19)
  8. 桥接模式Bridge
  9. html 加粗_一篇文章带你了解HTML格式化元素
  10. 数字图像处理:图像与编码
  11. 计算机结构系统的发展趋势,计算机体系结构的现状及发展趋势.docx
  12. CRMEB二次开发基础接口
  13. conda冗余package的清理(.conda/pkgs)
  14. GSM系统信令接续流程(一)(转)
  15. OpenStack官方认证(COA)正式回归!
  16. 如何通过chrome来找到猫眼电影评论url
  17. 继续学习kvm虚拟机化
  18. 神经科学探索脑第二章答案
  19. consul:健康检查
  20. [ CTF ] WriteUp- 2022年第三届“网鼎杯”网络安全大赛(玄武组)

热门文章

  1. Guides-旅游类App原型分享
  2. prim算法之处女作
  3. 用jQuery实现旋转木马效果(带前后按钮和索引按钮)
  4. 字节跳动校招提前批前端一面总结
  5. 17 Flask mega-tutorial 第17章 在Linux上部署(腾讯云 Ubuntu)【极其详细的部署过程】
  6. 仅逗oier们一笑(不定期更新中)
  7. VS2015远程白屏的解决办法——亲测可用
  8. 【软件】Chrome收藏夹本地位置
  9. 在Ubuntu中使用Tomcat的小tips_codestorm_新浪博客
  10. android ems具体意义?