爬虫后的数据处理与使用(使用篇--实现分类预测)
()紧接上文,在完成基本的数据处理后,接下来就是正常的使用了。当然怎么用,确实需要好好思考一下~
上文:爬虫后的数据处理与使用(处理篇)
前言:
一般来说,我们费劲得到如此多的信息,总不能说直接导入系统就完事了吧,真要这样,那就大炮打蚊子了。不妨扩展下思维,比如依据这些数据做一些分析,或者把它转换一下格式,分下类,作为模型训练的数据。正好,依据当下热门的AI,我们不妨做个“小模型”,这样放到论文里,那妥妥的创新点!
但是,由于上一篇文章运行后的结果(聚类的结果显示集中在一种分类,无法实现分类的预期),实在不如意。因此有了以下猜想,既然要做,为什么不试试监督学习呢!。而上篇的尝试就当作初步的数据筛选(就是把距离中心最远的数据去除掉,作为数据清洗)。
在初筛数据后,我的数据有一部分是从贴吧爬取的,有的是我们从最基本的分类上做起吧~
推荐配置:
数据量 > 4000条,手工标注量 > 400条
python 3.11
Jupyter
一、数据的分类划分
1、制定规则,确定分类依据。
按照你的需求来,比如你数据库设计中有许多标签分类,那按照它来就行。
如果不知道自己的需求,可以想一下自己要做啥,进而推导出自己要的数据,还有分类要求。
比如我这个,分类划分为:杂谈1、互助2、生活分享3、交流合作4、闲置5,共计5个分类。
2、手工标注,尽量多些
如图,对数据进行手工标注,我这儿是标注了600多条(如果觉得麻烦,可以分点给你的小伙伴……),数据越多预测结果相对也更准确一点。
二、模型选择与比较
1、基于XGBoost的文本分类模型
(1)代码:
直接上代码了,
import matplotlib
import pandas as pd
import re
import nltk
from nltk.corpus import stopwords
from nltk.stem import WordNetLemmatizer
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.pipeline import Pipeline
from sklearn.metrics import classification_report, confusion_matrix
from imblearn.over_sampling import SMOTE
import matplotlib.pyplot as plt
import seaborn as sns
from xgboost import XGBClassifier
# 设置字体为支持中文的字体
matplotlib.rcParams['font.sans-serif'] = ['SimHei']
matplotlib.rcParams['axes.unicode_minus'] = False
# 下载停用词和词形还原器
nltk.download('stopwords')
nltk.download('wordnet')
# 定义数据预处理函数
def preprocess_text(text):# 小写化text = text.lower()# 去除特殊字符和数字text = re.sub(r'[^a-zA-Z\u4e00-\u9fa5]', ' ', text) # 保留汉字和英文字符# 分词words = text.split()# 去除停用词words = [word for word in words if word not in stopwords.words('chinese')]# 词形还原lemmatizer = WordNetLemmatizer()words = [lemmatizer.lemmatize(word) for word in words]# 返回处理后的文本return ' '.join(words)# 读取数据集
df = pd.read_excel('tieba.xlsx') # 替换为你的文件名# '标题' 是要识别的文本列,'分类(杂谈1、互助2、生活分享3、交流合作4、闲置5)' 列是标注的数据列
texts = df['标题'].tolist()
labels = df['分类(杂谈1、互助\t2、生活分享3、交流合作4、闲置5)'].tolist()# 数据预处理
processed_texts = [preprocess_text(text) for text in texts]# 选择手动标注的数据
labeled_texts = [text for text, label in zip(processed_texts, labels) if pd.notna(label)]
labeled_labels = [int(label) - 1 for label in labels if pd.notna(label)] # 将标签转换为整数并减去 1# 将手动标注的数据划分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(labeled_texts, labeled_labels, test_size=0.2, random_state=42, stratify=labeled_labels)# 将未标注的数据分开
unlabeled_texts = [text for text, label in zip(processed_texts, labels) if pd.isna(label)]# 使用SMOTE进行过采样
vectorizer = TfidfVectorizer(max_features=10000, ngram_range=(1, 2))
X_train_vect = vectorizer.fit_transform(X_train)
X_test_vect = vectorizer.transform(X_test)smote = SMOTE(random_state=42)
X_train_balanced, y_train_balanced = smote.fit_resample(X_train_vect, y_train)# 创建一个流水线并进行网格搜索以调整超参数
pipeline = Pipeline([('clf', XGBClassifier(eval_metric='mlogloss', n_jobs=-1)) # 移除 use_label_encoder 参数
])# 定义参数网格
param_grid = {'clf__max_depth': [5, 10, 15],'clf__n_estimators': [50, 100, 150],'clf__learning_rate': [0.01, 0.1, 0.2],
}grid_search = GridSearchCV(pipeline, param_grid, cv=5)
grid_search.fit(X_train_balanced, y_train_balanced)# 获取最佳参数和分数
print("最佳参数:", grid_search.best_params_)
print("最佳分数:", grid_search.best_score_)# 预测测试集的分类
y_pred = grid_search.predict(X_test_vect)# 打印分类报告
print("分类报告:")
print(classification_report(y_test, y_pred))# 绘制混淆矩阵
conf_matrix = confusion_matrix(y_test, y_pred)
plt.figure(figsize=(10, 7))
sns.heatmap(conf_matrix, annot=True, fmt='d', cmap='Blues',xticklabels=grid_search.best_estimator_.classes_, yticklabels=grid_search.best_estimator_.classes_)
plt.title('混淆矩阵')
plt.xlabel('预测分类')
plt.ylabel('真实分类')
plt.show()# 预测未标注数据的分类
X_unlabeled_vect = vectorizer.transform(unlabeled_texts)
predicted_labels = grid_search.predict(X_unlabeled_vect)# 将预测结果存储到一个 DataFrame 中
predicted_df = pd.DataFrame({'标题': unlabeled_texts,'预测分类': predicted_labels + 1 # 预测结果转换回原始标签(1-5)
})# 将结果保存到 Excel 文件
predicted_df.to_excel('预测结果.xlsx', index=False)print("预测结果已保存到 '预测结果.xlsx' 文件中。")
(2)结果如下:
整体来看,效果不怎么样,看来这种模型效果不佳,我们可以换一个。
(3)解释:
-
Precision(精确率):所有预测为正类的样本中,实际上是正类的比例。(正类就是随机指定的一种分类,比如“1”)
-
Recall(召回率):所有真实为正类的样本中,模型能够正确识别为正类的比例。
-
F1-score:精确率和召回率的调和平均值,综合考虑了精确率和召回率。
-
Support(支持度):每个类别在测试集中出现的样本数。
-
准确率(Accuracy) = 0.52:模型的总体准确率是 52%。即 52% 的样本被正确分类。
-
宏平均(Macro Avg):对各类别的精确率、召回率和 F1-score 进行平均(不考虑样本的不平衡):
- Precision = 0.24
- Recall = 0.21
- F1-score = 0.15
- 说明了这些值较低,说明模型的表现较差,尤其是在少数类(类别 0、3、4)上。
-
加权平均(Weighted Avg):根据每个类别的样本数加权计算:
- Precision = 0.44
- Recall = 0.52
- F1-score = 0.37
- 这些值相较于宏平均更高,说明模型对类别 1 和类别 2 的表现稍好。
2、transformer 模型
(1)代码:
import pandas as pd
import re
import nltk
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report
from transformers import BertTokenizer, BertForSequenceClassification
from transformers import Trainer, TrainingArguments
import torch# 下载停用词
nltk.download('stopwords')# 定义数据预处理函数
def preprocess_text(text):# 小写化text = text.lower()# 去除特殊字符和数字,保留汉字和英文字符text = re.sub(r'[^a-zA-Z\u4e00-\u9fa5]', ' ', text)return text# 读取数据集
df = pd.read_excel('tieba.xlsx') # 替换为你的文件名# 这些行基本和上文一致
texts = df['标题'].tolist()
labels = df['分类(杂谈1、互助\t2、生活分享3、交流合作4、闲置5)'].tolist()# 数据预处理
processed_texts = [preprocess_text(text) for text in texts]# 将标签转换为整数并减去 1
labeled_labels = [int(label) - 1 for label in labels if pd.notna(label)]
labeled_texts = [text for text, label in zip(processed_texts, labels) if pd.notna(label)]# 确保文本和标签的长度一致
assert len(labeled_texts) == len(labeled_labels), "文本和标签长度不一致"# 将手动标注的数据划分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(labeled_texts, labeled_labels, test_size=0.2, random_state=42, stratify=labeled_labels)# 加载BERT分词器
tokenizer = BertTokenizer.from_pretrained('bert-base-chinese')# 对文本进行编码
train_encodings = tokenizer(X_train, truncation=True, padding=True, max_length=128)
test_encodings = tokenizer(X_test, truncation=True, padding=True, max_length=128)# 创建数据集类
class TextDataset(torch.utils.data.Dataset):def __init__(self, encodings, labels):self.encodings = encodingsself.labels = labelsdef __getitem__(self, idx):item = {key: torch.tensor(val[idx]) for key, val in self.encodings.items()}item['labels'] = torch.tensor(self.labels[idx])return itemdef __len__(self):return len(self.labels)# 创建训练集和测试集
train_dataset = TextDataset(train_encodings, y_train)
test_dataset = TextDataset(test_encodings, y_test)# 加载BERT模型
model = BertForSequenceClassification.from_pretrained('bert-base-chinese', num_labels=5)# 设置训练参数
training_args = TrainingArguments(output_dir='./results2', #定义模型存放位置num_train_epochs=4, #设置训练的 epoch 数,即重复学习次数,初始为3,当调整为10时,在第五次后出现了过拟合现象,所以采用:4次# 这里的epoch数,需要验证一下,总之多试几次……per_device_train_batch_size=16,per_device_eval_batch_size=64,warmup_steps=500, #定义学习率预热的步骤数weight_decay=0.01, #权重衰减系数(也称为 L2 正则化),用于防止过拟合logging_dir='./logs',logging_steps=10,eval_strategy="epoch",
)# 使用Trainer API进行训练
trainer = Trainer(model=model,args=training_args,train_dataset=train_dataset,eval_dataset=test_dataset,
)# 训练模型
trainer.train()# 预测测试集的分类
predictions, labels, _ = trainer.predict(test_dataset)
predicted_labels = predictions.argmax(-1)# 打印分类报告
print("分类报告:")
print(classification_report(y_test, predicted_labels))# 将预测的标签和原始文本保存到 DataFrame 中
output_df = pd.DataFrame({'标题': X_test,'真实标签': y_test,'预测标签': predicted_labels
})# 将结果保存到 Excel 文件
output_df.to_excel('prediction_results.xlsx', index=False)print("预测结果已保存到 'prediction_results.xlsx'")# 对未标注的数据进行预测并保存# 提取未标注的数据
unlabeled_texts = df[df['分类(杂谈1、互助\t2、生活分享3、交流合作4、闲置5)'].isna()]['标题'].tolist()# 打印未标注的数据数量和内容,确保数据被正确提取
print(f"未标注的数据数量: {len(unlabeled_texts)}")
# print(f"未标注的文本数据: {unlabeled_texts}")# 如果有未标注的数据,进行处理
if len(unlabeled_texts) > 0:# 对未标注的文本进行编码unlabeled_encodings = tokenizer(unlabeled_texts, truncation=True, padding=True, max_length=128)# 创建未标注数据集class UnlabeledTextDataset(torch.utils.data.Dataset):def __init__(self, encodings):self.encodings = encodingsdef __getitem__(self, idx):item = {key: torch.tensor(val[idx]) for key, val in self.encodings.items()}return itemdef __len__(self):return len(self.encodings['input_ids'])# 创建未标注数据集unlabeled_dataset = UnlabeledTextDataset(unlabeled_encodings)# 使用训练好的模型对未标注数据进行预测predictions, _, _ = trainer.predict(unlabeled_dataset)predicted_labels = predictions.argmax(-1)# 将预测的标签和未标注文本保存到 DataFrame 中unlabeled_df = pd.DataFrame({'标题': unlabeled_texts,'预测标签': predicted_labels})# 将未标注数据的预测结果填充到原始 DataFrame 中对应的位置df.loc[df['分类(杂谈1、互助\t2、生活分享3、交流合作4、闲置5)'].isna(), '分类(杂谈1、互助\t2、生活分享3、交流合作4、闲置5)'] = predicted_labels + 1# 将包含预测结果的原始数据保存到 Excel 文件df.to_excel('预测数据.xlsx', index=False)print("未标注数据的预测结果已保存到 '预测数据.xlsx'")
else:print("没有未标注的数据。")
(2)结果如下:
结果显示,该模型的总体准确率为 76%,整体差强人意吧。反正够凑合着用了,hhhh
在完成之后,会生成一个文件夹,那个就是模型
(3)预测示例:
以下是结果图,整体还算可以。
好了,以上就是对数据的应用的示例啦,希望可以给到各位启发,欢迎留言讨论哦~
项目地址:https://github.com/blhqwjs/spider
相关文章:

爬虫后的数据处理与使用(使用篇--实现分类预测)
()紧接上文,在完成基本的数据处理后,接下来就是正常的使用了。当然怎么用,确实需要好好思考一下~ 上文:爬虫后的数据处理与使用(处理篇) 前言: 一般来说,我…...

arcgis提取不规则栅格数据的矢量边界
效果 1、准备数据 栅格数据:dem或者dsm 2、栅格重分类 分成两类即可 3、新建线面图层 在目录下选择预先准备好的文件夹,点击右键,选择“新建”→“Shapefile”,新建一个Shapefile文件。 在弹出的“新建Shapefile”对话框内“名称”命名为“折线”,“要素类型”选…...
python milvus 如何检查有多少个collection 以及多少个index,多少个database
在 Milvus 中,可以通过 Python 客户端(`pymilvus`)来检查当前有多少个集合(Collection)、索引(Index)和数据库(Database)。以下是具体的方法: --- ### 1. 检查有多少个集合(Collection) 使用 `list_collections()` 方法可以列出当前连接的所有集合。 ```python…...

2006-2020年各省工业增加值数据
2006-2020年各省工业增加值数据 1、时间:2006-2020年 2、来源:国家统计局、统计年鉴 3、指标:行政区划代码、地区名称、年份、工业增加值 4、范围:31省 5、指标解释:工业增加值是指工业企业在一定时期内以货币形式…...

【MySQL】使用C语言链接
🌈 个人主页:Zfox_ 🔥 系列专栏:MySQL 目录 一:🔥 MySQL connect 🦋 Connector / C 使用🦋 mysql 接口介绍🦋 完整代码样例 二:🔥 共勉 一&#…...

Vue篇-07
Vue UI组件库 一、移动端常用的UI组件库 1.1、Vant 1.2、Cube UI 1.3、Mint UI 二、PC端常用的UI组件库 2.1、Element UI Element - The worlds most popular Vue UI framework 安装: 按需引入: 135_尚硅谷Vue技术_element-ui按需引入_哔哩哔哩_b…...
使用 LLaMA-Factory 微调大模型
本文将介绍如下内容: 一、搭建 Docker Container 环境二、配置大模型训练环境三、构建、配置数据集四、训练大模型 一、搭建 Docker Container 环境 笔者此前多篇文章说明,此处不再赘述,可参考:NGC容器中快速搭建Jupyter环境 E…...
数据仓库的复用性:模型层面通用指标体系、参数化模型、版本化管理
在数据仓库设计中,复用性 是一个关键原则,它不仅能提升数据资产的使用效率,还能降低开发成本、优化系统运维。下面将从 模型层面的复用性、通用指标体系、参数化模型、版本化管理 四个方面进行详细介绍,并提供可落地的设计方案。 …...
Web APP 阶段性综述
Web APP 阶段性综述 当前,Web APP 主要应用于电脑端,常被用于部署数据分析、机器学习及深度学习等高算力需求的任务。在医学与生物信息学领域,Web APP 扮演着重要角色。在生物信息学领域,诸多工具以 Web APP 的形式呈现ÿ…...

某国际大型超市电商销售数据分析和可视化
完整源码项目包获取→点击文章末尾名片! 本作品将从人、货、场三个维度,即客户维度、产品维度、区域维度(补充时间维度与其他维度)对某国际大型超市的销售情况进行数据分析和可视化报告展示,从而为该超市在弄清用户消费…...

电子杂志制作平台哪个好
作为一个热爱分享的人,我试过了好几个平台,终于找到了几款比较好用得电子杂志制作平台,都是操作界面很简洁,上手非常快的工具。 FLBOOK:这是一款在线制作H5电子画册软件,提供了各种类型的模板,可支持添加…...
Django Admin 实战:实现 ECS 集群批量同步功能
引言 在管理大规模 AWS ECS (Elastic Container Service) 集群时,保持本地数据库与 AWS 实际状态的同步是一项关键任务。手动更新既耗时又容易出错,因此自动化这个过程变得尤为重要。本文将介绍如何利用 Django Admin 的自定义动作功能来实现 ECS 集群的批量同步操作,从而大…...

虚拟拨号技术(GOIP|VOIP)【基于IP的语音传输转换给不法分子的境外来电披上一层外衣】: Voice over Internet Protocol
文章目录 引言I 虚拟拨号技术(GOIP|VOIP)原理特性:隐蔽性和欺骗性II “GOIP”设备原理主要功能III 基于IP的语音传输 “VOIP” (Voice over Internet Protocol)IV “断卡行动”“断卡行动”目的电信运营商为打击电诈的工作V 知识扩展虚拟号保护隐私虚拟运营商被用于拨打骚扰…...

迅为RK3576开发板Android 多屏显示
迅为iTOP-3576开发板采用瑞芯微RK3576高性能、低功耗的应用处理芯片,集成了4个Cortex-A72和4个Cortex-A53核心,以及独立的NEON协处理器。它适用于ARM PC、边缘计算、个人移动互联网设备及其他多媒体产品。 1.1 Android 多屏同显 iTOP-RK3576 开发板支持…...

cmake + vscode + mingw 开发环境配置
1.软件准备 准备如下软件: mingw64(安装完成之后检测是否有环境变量,如果没有需要配置) cmake(安装完成之后检测是否有环境变量,如果没有需要配置) vscode(安装CMake插件࿰…...

nginx 配置代理,根据 不同的请求头进行转发至不同的代理
解决场景:下载发票的版式文件,第三方返回的是url链接地址,但是服务是部署在内网环境,无法访问互联网进行下载。此时需要进行走反向代理出去,如果按照已有套路,就是根据不同的访问前缀,跳转不同的…...
类模板的使用方法
目录 类模板的使用方法 1.类模板语法 2.类模板和函数模板区别 3.类模板中成员函数创建时机 4.类函数对象做函数参数 5.类模板和继承 6.类模板成员函数类外实现 7.类模板分文件编写 person.hpp 实现cpp文件: 8.类模板与友元 9.类模板案例 MyArray.hpp …...
高级Python Web开发:FastAPI的前后端集成与API性能优化
高级Python Web开发:FastAPI的前后端集成与API性能优化 目录 🛠️ 前后端集成的基本原理与实践🚀 FastAPI的API设计与实现📈 API性能测试与负载测试 📊 使用Locust进行API性能测试💥 使用Apache JMeter进…...

期权懂|期权的溢价率和杠杆率有什么区别?
锦鲤三三每日分享期权知识,帮助期权新手及时有效地掌握即市趋势与新资讯! 期权的溢价率和杠杆率有什么区别? 一、定义篇 期权溢价率:这是一个细腻地描绘了期权价格与其内在价值之间微妙差异的指标。想象一下,期权价格就…...

分布式ID的实现方案
1. 什么是分布式ID 对于低访问量的系统来说,无需对数据库进行分库分表,单库单表完全可以应对,但是随着系统访问量的上升,单表单库的访问压力逐渐增大,这时候就需要采用分库分表的方案,来缓解压力。 …...
Java 语言特性(面试系列1)
一、面向对象编程 1. 封装(Encapsulation) 定义:将数据(属性)和操作数据的方法绑定在一起,通过访问控制符(private、protected、public)隐藏内部实现细节。示例: public …...
Objective-C常用命名规范总结
【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名(Class Name)2.协议名(Protocol Name)3.方法名(Method Name)4.属性名(Property Name)5.局部变量/实例变量(Local / Instance Variables&…...

React19源码系列之 事件插件系统
事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...

【论文阅读28】-CNN-BiLSTM-Attention-(2024)
本文把滑坡位移序列拆开、筛优质因子,再用 CNN-BiLSTM-Attention 来动态预测每个子序列,最后重构出总位移,预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵(S…...

tree 树组件大数据卡顿问题优化
问题背景 项目中有用到树组件用来做文件目录,但是由于这个树组件的节点越来越多,导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多,导致的浏览器卡顿,这里很明显就需要用到虚拟列表的技术&…...

企业如何增强终端安全?
在数字化转型加速的今天,企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机,到工厂里的物联网设备、智能传感器,这些终端构成了企业与外部世界连接的 “神经末梢”。然而,随着远程办公的常态化和设备接入的爆炸式…...

Linux --进程控制
本文从以下五个方面来初步认识进程控制: 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程,创建出来的进程就是子进程,原来的进程为父进程。…...

USB Over IP专用硬件的5个特点
USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中,从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备(如专用硬件设备),从而消除了直接物理连接的需要。USB over IP的…...
Xen Server服务器释放磁盘空间
disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...
uniapp 集成腾讯云 IM 富媒体消息(地理位置/文件)
UniApp 集成腾讯云 IM 富媒体消息全攻略(地理位置/文件) 一、功能实现原理 腾讯云 IM 通过 消息扩展机制 支持富媒体类型,核心实现方式: 标准消息类型:直接使用 SDK 内置类型(文件、图片等)自…...