【阿旭机器学习实战】【27】贝叶斯模型:新闻分类实战----CounterVecorizer与TfidVectorizer构建特征向量对比

本文涉及的产品
模型训练 PAI-DLC,100CU*H 3个月
模型在线服务 PAI-EAS,A10/V100等 500元 1个月
交互式建模 PAI-DSW,每月250计算时 3个月
简介: 【阿旭机器学习实战】【27】贝叶斯模型:新闻分类实战----CounterVecorizer与TfidVectorizer构建特征向量对比

1. 导入数据并查看信息


from sklearn.datasets import fetch_20newsgroups
from sklearn.model_selection import train_test_split
# 加载新闻数据
news = fetch_20newsgroups(subset='all')
• 1
• 2
# data为一个列表,长度18846,每一个元素为一个新闻内容的字符串
print(len(news.data))

18846
• 1
news.data[0]
• 1
"From: Mamatha Devineni Ratnam <mr47+@andrew.cmu.edu>\nSubject: Pens fans reactions\nOrganization:

# news.target为目标分类对应的编号
news.target
• 1
• 2
array([10,  3, 17, ...,  3,  1,  7])

# 目标标签名称有20个,因此一共分20类新闻
len(news.target_names)
• 1
• 2
20

# 查看第一篇新闻属于什么类别
print(news.target[0])
print(news.target_names[news.target[0]])
• 1
• 2
• 3
10
rec.sport.hockey



2. 使用CountVectorizer构建单词字典并建模预测


CountVectorizer方法构建单词的字典,每个单词实例被转换为特征向量的一个数值特征,每个元素是特定单词在文本中出现的次数


2.1 CountVectorizer用法示例


from sklearn.feature_extraction.text import CountVectorizer
texts=["pig bird cat","dog dog cat cat","bird fish bird", 'pig bird']
cv = CountVectorizer()
# 将文本向量化
cv_fit=cv.fit_transform(texts)
# 查看转换后的向量,会统计单词个数,并写在指定索引位置
print(cv.get_feature_names())   # 获取单词序列
print(cv_fit.toarray())         # 将文本变为向量
['bird', 'cat', 'dog', 'fish', 'pig']
[[1 1 0 0 1]
 [0 2 2 0 0]
 [2 0 0 1 0]
 [1 0 0 0 1]]


2.2 使用CountVectorizer进行特征向量转换


cv = CountVectorizer()
cv_data = cv.fit_transform(news.data)
• 1
• 2


2.3 使用贝叶斯模型进行建模预测


from sklearn.model_selection import cross_val_score 
from sklearn.naive_bayes import MultinomialNB
x_train,x_test,y_train,y_test = train_test_split(cv_data, news.target)
mul_nb = MultinomialNB()
train_scores = cross_val_score(mul_nb, x_train, y_train, cv=3, scoring='accuracy')  
test_scores = cross_val_score(mul_nb, x_test, y_test, cv=3, scoring='accuracy')  
print("train scores:", train_scores)
print("test scores:", test_scores)
train scores: [0.81457936 0.81260611 0.82925792]
test scores: [0.64258555 0.56687898 0.61700767]


3. 使用TfidfVectorizer进行特征向量转换并建模预测


TfidfVectorizer使用了一个高级的计算方法,称为Term Frequency Inverse Document Frequency (TF-IDF)。IDF是逆文本频率指数(Inverse Document Frequency)。


TFIDF的主要思想是:如果某个词或短语在一篇文章中出现的频率TF高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类。


它一个衡量一个词在文本或语料中重要性的统计方法。直觉上讲,该方法通过比较在整个语料库的词的频率,寻求在当前文档中频率较高的词。这是一种将结果进行标准化的方法,可以避免因为有些词出现太过频繁而对一个实例的特征化作用不大的情况(我猜测比如a和and在英语中出现的频率比较高,但是它们对于表征一个文本的作用没有什么作用)。


3.1 TfidfVectorizer使用示例


from sklearn.feature_extraction.text import TfidfVectorizer
# 文本文档列表
text = ["The quick brown fox jumped over the lazy dog.",
"The lazy dog.",
"The brown fox"]
# 创建变换函数
vectorizer = TfidfVectorizer()
# 词条化以及创建词汇表
vectorizer.fit(text)
# 总结
print(vectorizer.vocabulary_)
print(vectorizer.idf_)
# 编码文档
vector = vectorizer.transform([text[0]])
# 总结编码文档
print(vector.shape)
print(vector.toarray())
{'the': 7, 'quick': 6, 'brown': 0, 'fox': 2, 'jumped': 3, 'over': 5, 'lazy': 4, 'dog': 1}
[1.28768207 1.28768207 1.28768207 1.69314718 1.28768207 1.69314718
 1.69314718 1.        ]
(1, 8)
[[0.29362163 0.29362163 0.29362163 0.38607715 0.29362163 0.38607715
  0.38607715 0.45604677]]


3.2 对新闻数据进行TfidfVectorizer变换


# 创建变换函数
vectorizer = TfidfVectorizer()
# 词条化以及创建词汇表
tfidf_data = vectorizer.fit_transform(news.data)


3.3 进行建模与预测


x_train,x_test,y_train,y_test = train_test_split(tfidf_data, news.target)
mul_nb = MultinomialNB()
train_scores = cross_val_score(mul_nb, x_train, y_train, cv=3, scoring='accuracy')  
test_scores = cross_val_score(mul_nb, x_test, y_test, cv=3, scoring='accuracy')  
print("train scores:", train_scores)
print("test scores:", test_scores)
train scores: [0.8238287  0.83379325 0.81937952]
test scores: [0.68103995 0.68809675 0.68030691]


3.4 去除停用词并进行建模与预测


def get_stop_words():
    result = set()
    for line in open('stopwords_en.txt', 'r').readlines():
        result.add(line.strip())
    return result
# 加载停用词
stop_words = get_stop_words()
# 创建变换函数
vectorizer = TfidfVectorizer(stop_words=stop_words)
# 词条化以及创建词汇表
tfidf_data = vectorizer.fit_transform(news.data)
x_train,x_test,y_train,y_test = train_test_split(tfidf_data,news.target)
mul_nb = MultinomialNB(alpha=0.01)
train_scores = cross_val_score(mul_nb, x_train, y_train, cv=3, scoring='accuracy')  
test_scores = cross_val_score(mul_nb, x_test, y_test, cv=3, scoring='accuracy')  
print("train scores:", train_scores)
print("test scores:", test_scores)


train scores: [0.90419669 0.89577584 0.90095643]
test scores: [0.85107731 0.8433121  0.84526854]


通过对比发现使用 TfidVectorizer构建特征向量的建模效果要好于CounterVecorizer。同时去除停用词之后,模型准确率也会有较大的提升。


如果内容对你有帮助,感谢点赞+关注哦!

相关文章
|
2月前
|
机器学习/深度学习 数据采集 数据处理
Scikit-learn Pipeline完全指南:高效构建机器学习工作流
Scikit-learn管道是构建高效、鲁棒、可复用的机器学习工作流程的利器。通过掌握管道的使用,我们可以轻松地完成从数据预处理到模型训练、评估和部署的全流程,极大地提高工作效率。
46 2
Scikit-learn Pipeline完全指南:高效构建机器学习工作流
|
1月前
|
机器学习/深度学习 人工智能 算法
人工智能浪潮下的编程实践:构建你的第一个机器学习模型
在人工智能的巨浪中,每个人都有机会成为弄潮儿。本文将带你一探究竟,从零基础开始,用最易懂的语言和步骤,教你如何构建属于自己的第一个机器学习模型。不需要复杂的数学公式,也不必担心编程难题,只需跟随我们的步伐,一起探索这个充满魔力的AI世界。
52 12
|
10天前
|
人工智能 运维 API
PAI企业级能力升级:应用系统构建、高效资源管理、AI治理
PAI平台针对企业用户在AI应用中的复杂需求,提供了全面的企业级能力。涵盖权限管理、资源分配、任务调度与资产管理等模块,确保高效利用AI资源。通过API和SDK支持定制化开发,满足不同企业的特殊需求。典型案例中,某顶尖高校基于PAI构建了融合AI与HPC的科研计算平台,实现了作业、运营及运维三大中心的高效管理,成功服务于校内外多个场景。
|
2月前
|
机器学习/深度学习 数据采集
机器学习入门——使用Scikit-Learn构建分类器
机器学习入门——使用Scikit-Learn构建分类器
|
2月前
|
机器学习/深度学习 数据采集 算法
从零到一:构建高效机器学习模型的旅程####
在探索技术深度与广度的征途中,我深刻体会到技术创新既在于理论的飞跃,更在于实践的积累。本文将通过一个具体案例,分享我在构建高效机器学习模型过程中的实战经验,包括数据预处理、特征工程、模型选择与优化等关键环节,旨在为读者提供一个从零开始构建并优化机器学习模型的实用指南。 ####
|
2月前
|
机器学习/深度学习 数据采集 搜索推荐
利用Python和机器学习构建电影推荐系统
利用Python和机器学习构建电影推荐系统
135 1
|
3月前
|
机器学习/深度学习
如何用贝叶斯方法来解决机器学习中的分类问题?
【10月更文挑战第5天】如何用贝叶斯方法来解决机器学习中的分类问题?
|
3月前
|
机器学习/深度学习 算法 数据挖掘
机器学习入门(二):如何构建机器学习模型,机器学习的三要素,欠拟合,过拟合
机器学习入门(二):如何构建机器学习模型,机器学习的三要素,欠拟合,过拟合
|
3月前
|
机器学习/深度学习 存储 自然语言处理
【机器学习】基于逻辑回归的分类预测
【机器学习】基于逻辑回归的分类预测
|
3月前
|
机器学习/深度学习 传感器 算法
机器学习入门(一):机器学习分类 | 监督学习 强化学习概念
机器学习入门(一):机器学习分类 | 监督学习 强化学习概念

热门文章

最新文章

相关产品

  • 人工智能平台 PAI