【机器学习】基于集成学习的 Amazon 用户评论质量预测

实验六: 基于集成学习的 Amazon 用户评论质量预测

1 案例简介

​ 随着电商平台的兴起,以及疫情的持续影响,线上购物在我们的日常生活中扮演着越来越重要的角色。在进行线上商品挑选时,评论往往是我们十分关注的一个方面。然而目前电商网站的评论质量参差不齐,甚至有水军刷好评或者恶意差评的情况出现,严重影响了顾客的购物体验。因此,对于评论质量的预测成为电商平台越来越关注的话题,如果能自动对评论质量进行评估,就能根据预测结果避免展现低质量的评论。本案例中我们将基于集成学习的方法对 Amazon 现实场景中的评论质量进行预测。

2 作业说明

​ 本案例中需要大家完成两种集成学习算法的实现(Bagging、AdaBoost.M1),其中基分类器要求使用 SVM 和决策树两种,因此,一共需要对比四组结果(AUC 作为评价指标):

  • Bagging + SVM
  • Bagging + 决策树
  • AdaBoost.M1 + SVM
  • AdaBoost.M1 + 决策树

注意集成学习的核心算法需要手动进行实现,基分类器可以调库。

2.1 基本要求

  • 根据数据格式设计特征的表示
  • 汇报不同组合下得到的 AUC
  • 结合不同集成学习算法的特点分析结果之间的差异
  • (使用 sklearn 等第三方库的集成学习算法会酌情扣分)

2.2 扩展要求

  • 尝试其他基分类器(如 k-NN、朴素贝叶斯)
  • 分析不同特征的影响
  • 分析集成学习算法参数的影响

3 数据概览

import pandas as pd 
train_df = pd.read_csv('./data/train.csv', sep='\t')
test_df = pd.read_csv('./data/test.csv', sep='\t')
testlabels_df = pd.read_csv('./data/groundTruth.csv')
train_df.head()
reviewerIDasinreviewTextoverallvotes_upvotes_alllabel
078853901First off, allow me to correct a common mistak...5.0670
15208747978I am really troubled by this Story and Enterta...3.0991340
257013667A near-perfect film version of a downright glo...4.014141
34719140892Keep your expectations low. Really really low...1.0470
44095715367"they dont make em like this no more..."well.....5.0360
test_df.head()
IdreviewerIDasinreviewTextoverall
008294737386I REALLY wanted this series but I am in SHOCK ...1.0
111015423543I have to say that this is a work of art for m...4.0
2257895724Alien 3 is certainly the most controversal fil...3.0
3391985909I love this film...preachy? Well, of course i...5.0
443325221214Even though I previously bought the Gamera Dou...5.0
testlabels_df.head()
IdExpected
000
110
220
330
440

本次数据来源于 Amazon 电商平台,包含超过 50,000 条用户在购买商品后留下的评论,各列的含义如下:

  • reviewerID:用户 ID
  • asin:商品 ID
  • reviewText:英文评论文本
  • overall:用户对商品的打分(1-5)
  • votes_up:认为评论有用的点赞数(只在训练集出现)
  • votes_all:该评论得到的总评价数(只在训练集出现)
  • label:评论质量的 label,1 表示高质量,0 表示低质量(只在训练集出现)

评论质量的 label 来自于其他用户对评论的 votes,votes_up/votes_all ≥ 0.9 的作为高质量评论。此外测试集包含一个额外的列 ID,标识了每一个测试的样例。

4 特征提取

  • 采用TfidfVectorizer进行特征提取
  • 划分数据集
import numpy as np
from sklearn.feature_extraction.text import TfidfVectorizer# 创建 TfidfVectorizer 实例,并指定停用词为 'english'
vectorizer = TfidfVectorizer(stop_words='english')# 训练集
train_X_all = vectorizer.fit_transform(train_df['reviewText'])
train_y_all = np.array(train_df['label'])# 测试集
test_X_all = vectorizer.transform(test_df['reviewText']) 
test_y_all = np.array(testlabels_df['Expected'])train_X_all.shape,train_y_all.shape,test_X_all.shape,test_y_all.shape

结果:

((57039, 153747), (57039,), (11208, 153747), (11208,))

因为训练集,测试集数据量较大,采用训练集前2000个数据、测试集前200个数据进行代码编写

# 简单训练集
train_X = vectorizer.fit_transform(train_df.reviewText[0:2000])
train_y = np.array(train_df.label[0:2000])# 简单测试集
test_X = vectorizer.transform(test_df.reviewText[0:200]) 
test_y = np.array(testlabels_df.Expected[0:200])train_X.shape,train_y.shape,test_X.shape,test_y.shape

结果:

((2000, 28961), (2000,), (200, 28961), (200,))

5 模型构建

  • 采用sklearn自带的BaggingClassifier, AdaBoostClassifier进行训练
  • 自己构建 Bagging 算法与 AdaBoost 算法,进行训练

5.1 利用sklearn自带库实现集成学习

from sklearn.ensemble import BaggingClassifier, AdaBoostClassifier
from sklearn.svm import SVC
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import roc_auc_scoreRANDOM_SEED = 2024# 定义基分类器
svm_classifier = SVC(C=200,kernel='rbf',probability=True)
tree_classifier = DecisionTreeClassifier()
  1. Bagging + SVM
# Bagging + SVM
bagging_svm = BaggingClassifier(estimator=svm_classifier, n_estimators=50, random_state=RANDOM_SEED)
bagging_svm.fit(train_X, train_y)
y_pred_bagging_svm = bagging_svm.predict_proba(test_X)[:, 1]
auc_bagging_svm = roc_auc_score(test_y, y_pred_bagging_svm)
print("Bagging + SVM AUC:", auc_bagging_svm)
Bagging + SVM AUC: 0.747968827723429
  1. Bagging + 决策树
# Bagging + 决策树
bagging_tree = BaggingClassifier(estimator=tree_classifier, n_estimators=50, random_state=RANDOM_SEED)
bagging_tree.fit(train_X, train_y)
y_pred_bagging_tree = bagging_tree.predict_proba(test_X)[:, 1]
auc_bagging_tree = roc_auc_score(test_y, y_pred_bagging_tree)
print("Bagging + Decision Tree AUC:", auc_bagging_tree)
Bagging + Decision Tree AUC: 0.7278229149394795
  1. AdaBoost.M1 + SVM
# AdaBoost.M1 + SVM
adaboost_svm = AdaBoostClassifier(estimator=svm_classifier, n_estimators=50, random_state=RANDOM_SEED)
adaboost_svm.fit(train_X, train_y)
y_pred_adaboost_svm = adaboost_svm.predict_proba(test_X)[:, 1]
auc_adaboost_svm = roc_auc_score(test_y, y_pred_adaboost_svm)
print("AdaBoost.M1 + SVM AUC:", auc_adaboost_svm)
AdaBoost.M1 + SVM AUC: 0.7449842480517327
  1. AdaBoost.M1 + 决策树
# AdaBoost.M1 + 决策树
adaboost_tree = AdaBoostClassifier(estimator=tree_classifier, n_estimators=50, random_state=RANDOM_SEED)
adaboost_tree.fit(train_X, train_y)
y_pred_adaboost_tree = adaboost_tree.predict_proba(test_X)[:, 1]
auc_adaboost_tree = roc_auc_score(test_y, y_pred_adaboost_tree)
print("AdaBoost.M1 + Decision Tree AUC:", auc_adaboost_tree)
AdaBoost.M1 + Decision Tree AUC: 0.5928535897861051

5.2 手动实现集成学习

  1. Bagging算法实现
# Bagging 手动实现
def bagging(X, y,test_X, base_classifier,num_classifiers):result = np.zeros(test_X.shape[0])  # 记录测试集的预测结果for i in range(num_classifiers):# 随机采样,有放回indices = np.random.choice(len(y), len(y), replace=True)X_sampled, y_sampled = X[indices], y[indices]print('Model {:<2d} finish!'.format(i))# 训练基分类器base_classifier.fit(X_sampled, y_sampled)# 进行预测predict_proba = base_classifier.predict_proba(test_X)[:, 1]result += predict_proba  # 累加不同分类器的预测概率result /= num_classifiers  # 取平均(投票)return result
np.random.seed(RANDOM_SEED)
num_classifiers=10# 使用 Bagging + SVM
y_pred_bagging_svm_self = bagging(train_X, train_y, test_X, svm_classifier,num_classifiers)
auc_bagging_svm = roc_auc_score(test_y, y_pred_bagging_svm_self)
print("Bagging + SVM AUC:", auc_bagging_svm)
Model 0  finish!
Model 1  finish!
Model 2  finish!
Model 3  finish!
Model 4  finish!
Model 5  finish!
Model 6  finish!
Model 7  finish!
Model 8  finish!
Model 9  finish!
Bagging + SVM AUC: 0.7456474879787763
# 使用 Bagging + 决策树
y_pred_bagging_tree_self = bagging(train_X, train_y, test_X, tree_classifier,num_classifiers)
auc_bagging_tree = roc_auc_score(test_y, y_pred_bagging_tree_self)
print("Bagging + Decision Tree AUC:", auc_bagging_tree)
Model 0  finish!
Model 1  finish!
Model 2  finish!
Model 3  finish!
Model 4  finish!
Model 5  finish!
Model 6  finish!
Model 7  finish!
Model 8  finish!
Model 9  finish!
Bagging + Decision Tree AUC: 0.6983916431769193
  1. AdaBoost算法实现
def adaboost(X, y, test_X, base_classifier,num_classifiers):result_lst, beta_lst = list(), list()  # 记录每次迭代的预测结果和投票权重num_samples = len(y)weight = np.ones(num_samples)  # 样本权重,注意总和应为 num_samplesfor i in range(num_classifiers):# 使用样本权重训练基分类器base_classifier.fit(X, y, sample_weight=weight) print('Model {:<2d} finish!'.format(i))# 在训练集上进行预测train_predict = base_classifier.predict(X) # 计算错误率并更新权重error_flag = train_predict != y  # 预测错误的位置error = np.sum(weight[error_flag]) / num_samples  # 计算错误率if error > 0.5:break# 存储 beta 值和预测结果beta = error / (1 - error)weight *= (1.0 - error_flag) * beta + error_flag  # 调整权重,正确位置乘上 beta,错误位置还是原来的weight /= np.sum(weight) / num_samples  # 归一化,让权重和等于 num_samplesbeta_lst.append(beta)predict_proba = base_classifier.predict_proba(test_X)[:, 1]result_lst.append(predict_proba)# 计算最终预测结果,作为加权和beta_lst = np.log(1 / np.array(beta_lst))beta_lst /= np.sum(beta_lst)  # 归一化投票权重result = (np.array(result_lst) * beta_lst[:, None]).sum(0)  # 每一轮的预测结果加权求和return result
svm_classifier = SVC(kernel='linear', probability=True)
# 使用 AdaBoost.M1 + SVM
y_pred_adaboost_svm_self = adaboost(train_X, train_y, test_X, svm_classifier,num_classifiers)
auc_adaboost_svm = roc_auc_score(test_y, y_pred_adaboost_svm_self)
print("AdaBoost.M1 + SVM AUC:", auc_adaboost_svm)
Model 0  finish!
Model 1  finish!
Model 2  finish!
Model 3  finish!
Model 4  finish!
Model 5  finish!
Model 6  finish!
Model 7  finish!
Model 8  finish!
Model 9  finish!
AdaBoost.M1 + SVM AUC: 0.7541037970485822
# 使用 AdaBoost.M1 + SVM
tree_classifier=DecisionTreeClassifier(max_depth=10, class_weight='balanced')y_pred_adaboost_tree_self = adaboost(train_X, train_y, test_X, tree_classifier,num_classifiers)
auc_adaboost_tree = roc_auc_score(test_y, y_pred_adaboost_tree_self)
print("AdaBoost.M1 + Decision Tree AUC:", auc_adaboost_tree)
Model 0  finish!
Model 1  finish!
Model 2  finish!
Model 3  finish!
Model 4  finish!
Model 5  finish!
Model 6  finish!
Model 7  finish!
AdaBoost.M1 + Decision Tree AUC: 0.5791742662908307

5.3 绘制ROC曲线

  1. 根据sklearn自带的集成学习,绘制的ROC曲线
import matplotlib.pyplot as plt
from sklearn.metrics import roc_curve, auc# 绘制 ROC 曲线
def plot_all_roc_curves(y_true, y_pred_probs, labels):plt.figure(figsize=(8, 8))for y_pred_prob, label in zip(y_pred_probs, labels):fpr, tpr, _ = roc_curve(y_true, y_pred_prob)roc_auc = auc(fpr, tpr)plt.plot(fpr, tpr, lw=2, label='{} (AUC = {:.2f})'.format(label, roc_auc))plt.plot([0, 1], [0, 1], color='navy', lw=2, linestyle='--')plt.xlabel('False Positive Rate')plt.ylabel('True Positive Rate')plt.title('Receiver Operating Characteristic')plt.legend(loc='lower right')plt.show()
# 绘制所有 ROC 曲线
plot_all_roc_curves(test_y, [y_pred_bagging_svm, y_pred_bagging_tree, y_pred_adaboost_svm, y_pred_adaboost_tree],['Bagging + SVM', 'Bagging + Decision Tree', 'AdaBoost.M1 + SVM', 'AdaBoost.M1 + Decision Tree'])


请添加图片描述

  1. 根据手动实现的集成学习代码绘制ROC图
# 绘制所有 ROC 曲线
plot_all_roc_curves(test_y, [y_pred_bagging_svm_self, y_pred_bagging_tree_self, y_pred_adaboost_svm_self, y_pred_adaboost_tree_self],['Bagging + SVM', 'Bagging + Decision Tree', 'AdaBoost.M1 + SVM', 'AdaBoost.M1 + Decision Tree'])


请添加图片描述

6 云平台提交格式

提交文件需要对测试集中每一条评论给出预测为高质量的概率,每行包括一个 ID(和测试集对应)以及预测的概率 Prediction(0-1的浮点数),用逗号分隔。示例提交格式如下:

ID,Prediction
0,0.9
1,0.45
2,0.78
...

文件命名没有要求。

from sklearn import svm
from sklearn.calibration import CalibratedClassifierCVsvm_classifier=svm.LinearSVC(dual='auto')
svm_classifier = CalibratedClassifierCV(svm_classifier, method='sigmoid')
num_classifiers = 100# 使用 Bagging + SVM
y_pred_bagging_svm_self = bagging(train_X_all, train_y_all, test_X_all, svm_classifier,num_classifiers)
auc_bagging_svm = roc_auc_score(test_y_all, y_pred_bagging_svm_self)
print("Bagging + SVM AUC:", auc_bagging_svm)
Bagging + SVM AUC: 0.7812187133616998
# 生成提交文件
result_df = pd.DataFrame()
result_df['ID'] = test_df['Id'].values
result_df['Prediction'] = y_pred_bagging_svm_self.round(2)  # 保留两位小数
result_df.to_csv('./result.csv', index=False)

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

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

相关文章

Golang的for循环变量和goroutine的陷阱,1.22版本的更新

先来看一段golang 1.22版本之前的for循环的代码 package mainimport "fmt"func main() {done : make(chan bool)values : []string{"chen", "hai", "feng"}for _, v : range values {fmt.Println("start")go func() {fmt.P…

【05】C++ 内存管理

文章目录 &#x1f308; Ⅰ C 内存分布&#x1f308; Ⅱ C 内存管理方式1. new 和 delete 操作内置类型2. new 和 delete 操作自定义类型 &#x1f308; Ⅲ operator new 和 operator delete&#x1f308; Ⅳ new 和 delete 的实现原理1. 内置数据类型2. 自定义数据类型 &#…

过渡效果的艺术:CSS transition 让网页交互更平滑(下)

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

使用人工智能将扫描地图中的数据数字化

Bunting Labs 推出了新版本QGIS AI 地图追踪插件&#xff0c;这是一款由人工智能驱动的自动数字化扫描地图和平面图特征的工具。Egan 和联合创始人 Brendan Ashworth 开发了这个插件&#xff0c;以快速加快从扫描地图和平面图中提取地理特征的过程。 通常&#xff0c;从 PDF 中…

飞天使-linux操作的一些技巧与知识点9-zabbix6.0 容器之纸飞机告警设置

文章目录 zabbix 告警纸飞机方式webhook 方式 zabbix 告警纸飞机方式 第一种方式参考 https://blog.csdn.net/yetugeng/article/details/99682432bash-4.4$ cat telegram.sh #!/bin/bashMSG$1TOKEN"61231432278:AAsdfsdfsdfsdHUxBwPSINc2kfOGhVik" CHAT_ID-41dsdde…

EMNLP 2023精选:Text-to-SQL任务的前沿进展(下篇)——Findings论文解读

导语 本文记录了今年的自然语言处理国际顶级会议EMNLP 2023中接收的所有与Text-to-SQL相关&#xff08;通过搜索标题关键词查找得到&#xff0c;可能不全&#xff09;的论文&#xff0c;共计12篇&#xff0c;包含5篇正会论文和7篇Findings论文&#xff0c;以下是对这些论文的略…

Leetcode2786. 访问数组中的位置使分数最大

Every day a Leetcode 题目来源&#xff1a;2786. 访问数组中的位置使分数最大 解法1&#xff1a;动态规划 状态数组&#xff1a; dp[i][0]: 访问下标范围 [0, i] 中的元素且最后访问的元素是偶数时的最大得分&#xff1b;dp[i][1]: 访问下标范围 [0, i] 中的元素且最后访问…

html5+css3胶囊按钮代码

效果 代码 <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <title></title> <style> /* 胶囊开关的样式 */ .switch { position: relative; display: inline-block; width: 6…

EasyExcel操作Excel表格

一、EasyExcel介绍 1.1 介绍 EasyExcel 是一个基于 Java 的简单易用的 Excel 文件读写工具&#xff0c;它提供了一种简单而又高效的方式来读取、写入和操作 Excel 文件。EasyExcel 是阿里巴巴开源的项目&#xff0c;它旨在简化开发人员处理 Excel 文件的流程&#xff0c;使得…

API网关架构设计与实现的经验总结与实践

API网关是现代微服务架构中的重要组件&#xff0c;它充当了前端和后端微服务之间的中介。本文将介绍API网关的架构设计原则和实现方法&#xff0c;以帮助开发人员更好地理解和应用这些技术。 1. 什么是API网关&#xff1f; - 解释了API网关的基本概念和作用&#xff0c;以及…

【Spring框架】Spring事务的原理

目录 〇、对类或方法的Spring事务属性进行解析 0.1 解析标签 0.2 注册 InfrastructureAdvisorAutoProxyCreator 0.3 判断目标方法是否适合 canApply 0.4 匹配标签 match 0.5 小结 一、Spring事务的实现 1.1 准备事务 1.1.1 收集Transactional注解属性信息&#xff0c;…

美创科技与河南金融信创生态实验室签署战略合作协议

2024年1月31日&#xff0c;由普惠通科技与河南省科学院物理所、北京交通大学、中国金融电子化集团重庆金融认证中心联合发起成立中部地区第一家金融信创生态实验室运营公司&#xff08;即河南豫科普惠通信创科技有限公司&#xff09;与杭州美创科技股份有限公司战略合作签约仪式…

探索Xposed框架:个性定制你的Android体验

探索Xposed框架&#xff1a;个性定制你的Android体验 1. 引言 在当今移动设备市场中&#xff0c;Android系统作为最受欢迎的操作系统之一&#xff0c;其开放性和可定制性备受用户青睐。用户希望能够根据个人喜好和需求对其设备进行定制&#xff0c;以获得更符合自己习惯的使用…

深度学习自然语言处理(NLP)模型BERT:从理论到Pytorch实战

文章目录 深度学习自然语言处理&#xff08;NLP&#xff09;模型BERT&#xff1a;从理论到Pytorch实战一、引言传统NLP技术概览规则和模式匹配基于统计的方法词嵌入和分布式表示循环神经网络&#xff08;RNN&#xff09;与长短时记忆网络&#xff08;LSTM&#xff09;Transform…

谷歌 DeepMind 联合斯坦福推出了主从式遥操作双臂机器人系统增强版ALOHA 2

谷歌 DeepMind 联合斯坦福推出了 ALOHA 的增强版本 ——ALOHA 2。与一代相比&#xff0c;ALOHA 2 具有更强的性能、人体工程学设计和稳健性&#xff0c;且成本还不到 20 万元人民币。并且&#xff0c;为了加速大规模双手操作的研究&#xff0c;ALOHA 2 相关的所有硬件设计全部开…

Elasticsearch:通过 ingest pipeline 对大型文档进行分块

在我之前的文章 “Elasticsearch&#xff1a;使用 LangChain 文档拆分器进行文档分块” 中&#xff0c;我详述了如何通过 LangChain 对大的文档进行分块。那个分块的动作是通过 LangChain 在 Python 中进行实现的。对于使用版权的开发者来说&#xff0c;我们实际上是可以通过 i…

问题:老年人心理健康维护与促进的原则为________、________、发展原则。 #媒体#知识分享

问题&#xff1a;老年人心理健康维护与促进的原则为________、________、发展原则。 参考答案如图所示

[SAP] ABAP代码程序美化器大小写格式化设置

按照ABAP开发的规范&#xff0c;ABAP源代码里推荐将所有的关键字大写&#xff0c;其余ABAP变量小写 我们可以手动修改上述代码大小写规范的问题&#xff0c;但如果代码量很多的情况下&#xff0c;手动确保这个规范(所有的关键字大写&#xff0c;其余ABAP变量小写)有点费事&…

k8s -ingress

概念 Ingress 公开了从集群外部到集群内服务的 HTTP 和 HTTPS 路由&#xff0c;ingress能代理集群为内部的网络&#xff0c;将集群外部的HTTP/HTTPS网络请求转发至不同的service&#xff0c;其本质就是创建一个NodePort类型的svc,和一个nginx 组成 k8s中的ingress 其实是指…

Go语言的100个错误使用场景(30-40)|数据类型与字符串使用

前言 大家好&#xff0c;这里是白泽。 《Go语言的100个错误以及如何避免》 是最近朋友推荐我阅读的书籍&#xff0c;我初步浏览之后&#xff0c;大为惊喜。就像这书中第一章的标题说到的&#xff1a;“Go: Simple to learn but hard to master”&#xff0c;整本书通过分析100…