Python数据分析案例13——文本特征抽取(TfidfVectorizer)

news2024/11/18 11:44:53

在做机器学习的时候,构建特征变量有很多时候都是文本型的,比如电影分类的时候的电影标题,房价预测的时候房子地址,股吧评论等......都是文本类型的数据。

文本型数据怎么构建特征,它又不是分类变量不能直接独立热编码或者生成虚拟变量。

NLP深度学习领域早就发明了将文本进行向量化的方法,将文本进行词嵌入变为张量。

但是这一般要借助深度学习的框架才能实现,很多同学不懂深度学习,也没时间装框架。

如果不用深度学习领域的方法,只用sklearn库接口,也是可以处理文本的,将文本变为数值型的特征变量,然后再去进行分类回归等监督学习。

本次带来的案例就是做一个股吧情感预测的文本分类模型,自动预测一个股吧评论是正面情感还是负面情感。是一个典型的2分类问题。


数据展示

如图两个文本文件,一个全是正面情感评论,一个是负面情感评论。

 

 一行代表一个样本,即一个评论。文本已经进行过了停用词去除,分词等处理。

如果是原始的文本数据,不知道怎么进行分词操作,可以看我之前这篇文章的前面的文本数据分词操作处理。

Python深度学习14——Keras实现Transformer中文文本十分类


数据读取

导入常用的包

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
plt.rcParams['font.sans-serif'] = ['KaiTi']  #指定默认字体 SimHei黑体
plt.rcParams['axes.unicode_minus'] = False   #解决保存图像是负号'

按行读取数据,去掉换行符。变为数据框,并且打上相应的标签。

pos_df = pd.DataFrame([line.replace('\n', '') for line in open('positive.txt',encoding='utf-8').readlines()],columns=['text'])
pos_df['label']=1    #正面标签为1
neg_df = pd.DataFrame([line.replace('\n', '') for line in open('negtive.txt',encoding='utf-8').readlines()],columns=['text'])
neg_df['label']=0    #负面标签为0

查看正面情感数据

pos_df.head()

查看负面情感数据 

neg_df.head()

 

 将数据进行合并,然后查看不同标签样本的数量

#合并
df = pd.concat([pos_df, neg_df]).reset_index(drop=True)
#标签0和标签1的数量
sns.countplot(x=df['label'])
#显示图像
plt.show()

 可以看到正面1和负面0都是4000多个样本,很平衡。


词向量化

这里使用TF-idf一种优化了的词频统计向量化的方法,具体原理不多解释,总之就是一种把文本变为数值数据的方法,直接用就行。

取出X和y,对X进行词向量化处理


from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.model_selection import train_test_split
#取出X和y
X = df['text']
y = df['label']
#创建一个TfidfVectorizer的实例
vectorizer = TfidfVectorizer()
#使用Tfidf将文本转化为向量
X = vectorizer.fit_transform(X)
#看看特征形状
X.shape

 可以看到,X原来是一列文本,现在变成了14503列特征变量,而且都是数值型,可以直接用来建模计算。

查看哪些词语的TF-idf值高:

data1 = {'word': vectorizer.get_feature_names_out(),
        'tfidf': X.toarray().sum(axis=0).tolist()}
df1 = pd.DataFrame(data1).sort_values(by="tfidf" ,ascending=False,ignore_index=True) 
df1.head(10)

 可以简单的理解为TF-idf值越高,这个词汇出现的次数越多,也越重要。可以看到这个股吧评论数据集里面的词汇都是这些‘涨停’,‘大盘’,‘跌停’这些股民常用词汇。


机器学习

划分训练集和测试集

X_train, X_test, y_train, y_test =train_test_split(X,y,test_size=0.2,stratify=y,random_state = 0)
#可以检查一下划分后数据形状
X_train.shape,X_test.shape, y_train.shape, y_test.shape

 7371个训练集,1843个测试集。

模型选择

#采用十种模型,对比测试集精度
from sklearn.linear_model import LogisticRegression
from sklearn.naive_bayes import MultinomialNB
from sklearn.neighbors import KNeighborsClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.ensemble import GradientBoostingClassifier
from xgboost.sklearn import XGBClassifier
from lightgbm import LGBMClassifier
from sklearn.svm import SVC
from sklearn.neural_network import MLPClassifier

生成上面10中模型的实例

#逻辑回归
model1 =  LogisticRegression(C=1e10,max_iter=10000)

#朴素贝叶斯
model2 = MultinomialNB()

#K近邻
model3 = KNeighborsClassifier(n_neighbors=50)

#决策树
model4 = DecisionTreeClassifier(random_state=77)

#随机森林
model5= RandomForestClassifier(n_estimators=500,  max_features='sqrt',random_state=10)

#梯度提升
model6 = GradientBoostingClassifier(random_state=123)

#极端梯度提升
model7 =  XGBClassifier(use_label_encoder=False,eval_metric=['logloss','auc','error'],
                        objective='binary:logitraw',random_state=0)
#轻量梯度提升
model8 = LGBMClassifier(n_estimators=200,random_state=2)

#支持向量机
model9 = SVC(kernel="rbf", random_state=77)

#神经网络
model10 = MLPClassifier(hidden_layer_sizes=(16,8), random_state=77, max_iter=10000)

model_list=[model1,model2,model3,model4,model5,model6,model7,model8,model9,model10]
model_name=['逻辑回归','朴素贝叶斯','K近邻','决策树','随机森林','梯度提升','极端梯度提升','轻量梯度提升','支持向量机','神经网络']

分别进行训练和测试,计算他们在测试集上的准确率

scores=[]
for i in range(len(model_list)):
    model_C=model_list[i]
    name=model_name[i]
    model_C.fit(X_train, y_train)
    s=model_C.score(X_test, y_test)
    scores.append(s)
    print(f'{name}方法在测试集的准确率为{round(s,3)}')

画图查看:

plt.figure(figsize=(7,3),dpi=128)
sns.barplot(y=model_name,x=scores,orient="h")
plt.xlabel('模型准确率')
plt.ylabel('模型名称')
plt.xticks(fontsize=10,rotation=45)
plt.title("不同模型文本分类准确率对比")
plt.show()

 

可以看到朴素贝叶斯的准确率最好。事实上这种高度稀疏的数据,朴素贝叶斯的精度都还不错。


ROC曲线

 二分类问题可以画出ROC曲线,计算 对应的AUC值:

from sklearn.metrics import RocCurveDisplay
model=MultinomialNB()
model.fit(X_train, y_train)
RocCurveDisplay.from_estimator(model, X_test, y_test)
x = np.linspace(0, 1, 100)
plt.plot(x, x, 'k--', linewidth=1)
plt.title('ROC Curve (Test Set)')

 AUC值为0.93,最大为1,说明模型效果很不错。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/129808.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【再学Tensorflow2】TensorFlow2的模型训练组件(2)

TensorFlow2的模型训练组件(2)损失函数损失函数和正则化项Tensorflow2内置的损失函数自定义损失函数评估指标常用的内置评估指标自定义评估指标优化器优化器的使用使用optimizer.apply_gradients使用optimizer.minimize使用model.fitTensorflow2内置的优…

【nowcoder】笔试强训Day14

目录 一、选择题 二、编程题 2.1计算日期到天数转换 2.2幸运的袋子 一、选择题 1.定义学生、教师和课程的关系模式 S (S#,Sn,Sd,Dc,SA )(其属性分别为学号、姓名、所在系、所在系的系主任、年龄); C ( C#,Cn,P# &…

ansible的安装以及实例

目录 ansible的安装: 一、配置centos8基本源 二、配置epel 三、安装ansible 四、查看ansible是否安装以及版本 实例: 实例一:控制主机和受控主机通过root用户免密验证远程控制主机实施对应任务 实例二:控制主机连接受控主机…

SSH协议理论讲解

目录 基本概念 SSH协议的组成 SSH工作原理 SSH版本协商阶段(确定V1版本或V2版本) 算法协商阶段 密钥交换阶段 用户认证阶段 会话交互阶段 基本概念 SSH(Secure Shell)安全外壳协议,是一种用于在不安全网络上进…

Redisson实现延迟队列

k8s部署单点Redis (1)k8s部署redis的yaml文件 apiVersion: apps/v1 kind: Deployment metadata:creationTimestamp: nulllabels:app: redisname: redis spec:replicas: 1selector:matchLabels:app: redisstrategy: {}template:metadata:creationTimestamp: nulllabels:app: r…

Jmeter系统学习

Jmeter体系结构 Jmeter概念: 元件:每一个功能,例如Http请求,响应断言等。 组件:每一类元件的组合,例如采样器,配置元件。 Jmeter体系可以分为3个维度: X1--X5:负载模…

(二十八)Vue之组件化编码流程

文章目录组件化编码流程拆分静态组件实现动态组件实现交互实现添加实现勾选实现删除实现全选与全不选实现清除已完成任务TodoList案例小细节Vue学习目录上一篇:(二十七)Vue组件的样式 先看一个需求:TodoList案例 功能&#xff1a…

c# http请求使用multipart/form-data 方式上传文件及其他参数

这次的需求是请求java那边的一个excel批量上传的接口。但是他们的接口要求是这样的 于是自己写了个方法: 调用: 控制器层 var file this.HttpContext.Request.Files[0];//获取前端传来的文件 var fileName file.FileName; //注意&…

控制RK3568的GPIO

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言一、设备树中是如何描述引脚的?1.pinctrl子系统2.gpio子系统二、使用步骤总结前言 RK3568的引脚资源还是相当多的,一共有5组GPIO&#x…

数图互通高校房产管理——房屋修缮管理

数图互通房产管理系统在这方面做得比较全面; 实现房屋修缮改造、装修维护、零星维修线上管理,建立机制规范管理,避免私自改扩建。 建筑物立项审批全流程资料和过程管理,建筑物修建施工、维修审批流程管理。整套系统包含了建筑物从…

链下签名实现

什么是签名 比如我们在使用 opensea 的时候,经常会提示我们进行数字签名,如下图: 用户进行 sign 确认,即用自己的私钥对一段数据进行签名,得到一个 signature,其他人可以使用你私钥对应的公钥&#xff0c…

推荐5款Windows桌面效率工具

今天我想分享一些自己比较喜欢的桌面端软件,还请大家包涵指正。如果你曾搜索过 Windows 效率工具推荐,对下文的软件或许有所了解。不过为了凑字数,我还是会再介绍一遍。 1.文件定位——Listary Listary 是我使用频率最高的软件之一&#xf…

Java重点源码回顾——HashMap1.8

1. 概述 在之前的文章中,我们介绍了HashMap1.7的源码,今天我们来看下HashMap1.8的源码。HashMap1.8相比于1.7最大的改变就是改变了1.7中采用数组链表的方式存储键值对,转而由数组链表红黑树的方式来存储键值对。HashMap1.8的底层结构如下图所…

RPC 好,还是 RESTful 好

OSI网络七层模型 RPC服务 RPC架构 同步调用与异步调用 流行的RPC框架 HTTP服务 总之 RPC主要是基于TCP/IP协议的,而HTTP服务主要是基于HTTP协议的,我们都知道HTTP协议是在传输层协议TCP之上的,所以效率来看的话,RPC当然是要更…

【python】py课后作业程序题5「PTA」

py字典合集7-1 Python猜数游戏7-2 jmu-python-分段函数7-3 循环求e的近似值(高教社,《Python编程基础及应用》习题6-7)7-4 jmu-python-判断是否构成三角形7-5 jmu-python-输入输出-计算字符串中的数7-6 jmu-python-随机生成密码7-7 jmu-pytho…

vscode使用CMake Tool插件构建第一个CMake的helloworld工程

vscode使用CMake Tool插件构建第一个CMake的helloworld工程一、linux环境准备1.1 CMake安装1.2 gcc/g的安装二、vscode 插件安装2.1 C扩展2.2 CMake Tool三、使用CMake构建第一个工程3.1 创建工程目录3.2 使用CMake Tool创建第一个Project3.3 Configure 第一个project四、构建工…

Java中序列化接口Serializable的serialVersionUID的作用

原文网址:Java中序列化接口Serializable的serialVersionUID的作用_IT利刃出鞘的博客-CSDN博客 简介 本文介绍Java中序列化接口Serializable的serialVersionUID的作用。 序列化与反序列化 含义 序列化:将java对象转化为字节序列。反序列化&#xff1a…

【mysql】索引的基本使用

文章目录1. 索引的声明与使用1.1 索引的分类1.2 创建索引1.2.1 创建表的时候创建索引(隐式)1.2.2 在已经存在的表上创建索引(显式)1、创建普通索引2、创建唯一索引3、主键索引4、创建单列索引5、创建联合索引6、创建全文索引7、创…

33、基于STM32的计时器(Proteus仿真+程序)

编号:33 基于STM32的计时器 功能描述: 使用proteus 软件设计一个基于STM32的家用计时器,该系统包含多个按键、LED运行灯和时间显示(时间显示是LCD1602) 其功能如下: 1、利用按键实现设置计时时间功能,时间格式:AB:CD:E 例如01:5…

【攻防世界】江苏工匠杯 Web easyphp

打开页面是一个代码审计的题目&#xff0c;是我不太熟悉的东西&#xff0c;但是没关系&#xff0c;我们可以学是吧&#xff0c;以下为源代码 <?php highlight_file(__FILE__); $key1 0; $key2 0;$a $_GET[a]; $b $_GET[b];if(isset($a) && intval($a) > 60…