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

本文涉及的产品
交互式建模 PAI-DSW,5000CU*H 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。同时去除停用词之后,模型准确率也会有较大的提升。


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

相关文章
|
15天前
|
机器学习/深度学习 数据挖掘 数据处理
构建高效机器学习模型的五大策略
【5月更文挑战第31天】 在数据驱动的时代,机器学习已成为创新的核心动力。本文将深入探讨如何构建高效的机器学习模型,涵盖数据处理、特征工程、模型选择、调参技巧及模型评估五个关键策略。不同于常规摘要的形式,我们将通过具体实例和案例分析,提供一套实操性强的方法论,帮助读者在实际工作中提升模型性能,解决业务问题。
|
15天前
|
机器学习/深度学习 运维 Cloud Native
构建未来:云原生架构在企业数字化转型中的关键作用构建高效机器学习模型的五大策略
【5月更文挑战第31天】 随着企业数字化进程的加速,传统的IT架构日益显示出其局限性。本文将探讨云原生架构如何成为推动企业敏捷性、可扩展性和创新能力的核心力量。通过深入分析云原生技术的基本原理及其在业务连续性、资源优化和跨云协作方面的应用,揭示了其在实现高效、灵活的企业IT环境中所扮演的角色。
|
1天前
|
机器学习/深度学习 算法
机器学习方法分类
【6月更文挑战第14天】机器学习方法分类。
8 2
|
2天前
|
机器学习/深度学习 搜索推荐 算法
【阿旭机器学习实战】【37】电影推荐系统---基于矩阵分解
【阿旭机器学习实战】【37】电影推荐系统---基于矩阵分解
|
2天前
|
机器学习/深度学习 数据可视化 算法
【阿旭机器学习实战】【36】糖尿病预测---决策树建模及其可视化
【阿旭机器学习实战】【36】糖尿病预测---决策树建模及其可视化
|
2天前
|
机器学习/深度学习 数据采集 算法
【阿旭机器学习实战】【35】员工离职率预测---决策树与随机森林预测
【阿旭机器学习实战】【35】员工离职率预测---决策树与随机森林预测
|
2天前
|
机器学习/深度学习 算法 Windows
【阿旭机器学习实战】【34】使用SVM检测蘑菇是否有毒--支持向量机
【阿旭机器学习实战】【34】使用SVM检测蘑菇是否有毒--支持向量机
|
2天前
|
机器学习/深度学习 算法 数据处理
【阿旭机器学习实战】【33】中文文本分类之情感分析--朴素贝叶斯、KNN、逻辑回归
【阿旭机器学习实战】【33】中文文本分类之情感分析--朴素贝叶斯、KNN、逻辑回归
|
2天前
|
机器学习/深度学习 算法 数据挖掘
【阿旭机器学习实战】【32】预测银行客户是否会开设定期存款账户--逻辑回归
【阿旭机器学习实战】【32】预测银行客户是否会开设定期存款账户--逻辑回归
|
2天前
|
机器学习/深度学习 算法
【阿旭机器学习实战】【31】股票价格预测案例--线性回归
【阿旭机器学习实战】【31】股票价格预测案例--线性回归

相关产品

  • 人工智能平台 PAI