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

news2024/11/18 3:35:08

清华大学驭风计划课程链接

学堂在线 - 精品在线课程学习平台 (xuetangx.com)

代码和报告均为本人自己实现(实验满分),此次代码开源大家可以自行参考学习

有任何疑问或者问题,也欢迎私信博主,大家可以相互讨论交流哟~~

一、案例简介¶

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

二、作业说明

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

  • Bagging + SVM

  • Bagging + 决策树

  • AdaBoost.M1 + SVM

  • AdaBoost.M1 + 决策树

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

基本要求

  • 根据数据格式设计特征的表示

  • 汇报不同组合下得到的 AUC

  • 结合不同集成学习算法的特点分析结果之间的差异

  • (使用 sklearn 等第三方库的集成学习算法会酌情扣分)

扩展要求

  • 尝试其他基分类器(如 k-NN、朴素贝叶斯)

  • 分析不同特征的影响

  • 分析集成学习算法参数的影响

本次数据来源于 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,标识了每一个测试的样例。

三, 实验结果

在处理文本特征时候我也有尝试引入其他特征,比如评论长度,情感浓度,但是发现训练的效果反而更差,所以最终没有引入新的特征,在这里也尝试过Countvectorizer方法,最终会使得预测效果变差不少,最终使用TfidfVectorizer发现效果好很多。在这里也使用了稀疏数组的拼接方法,很适合大规模文本数据。 

# 处理文本特征
vectorize_model = TfidfVectorizer(stop_words='english')
train_X = vectorize_model.fit_transform(train_df['reviewText'])
test_X = vectorize_model.transform(test_df['reviewText']) 


# 合并上总评分特征
train_X = scipy.sparse.hstack([train_X, train_df['overall'].values.reshape((-1, 1)) / 5])
test_X = scipy.sparse.hstack([test_X, test_df['overall'].values.reshape((-1, 1)) / 5])
train_X.shape,train_df['label'].shape

((57039, 153748), (57039,)) 

def selection_clf(base_name):
    clf = None
    if base_name == 'SVM':
        base_clf = svm.LinearSVC()
        clf = CalibratedClassifierCV(base_clf, cv=2, method='sigmoid')
    elif base_name == 'DTree':
        clf = DecisionTreeClassifier(max_depth=10, class_weight='balanced')
    return clf


class Bagging:
    def __init__(self, base_estimator, num_estimators):
        self.base_estimator = base_estimator  # 基分类器对象
        self.num_estimators = num_estimators  # Bagging 的分类器个数

    def fit_predict(self, X_train, y_train, X_test):
        num_samples = X_train.shape[0]
        num_features = X_train.shape[1]
        result = np.zeros(X_test.shape[0])  # 记录测试集的预测结果

        for i in range(self.num_estimators):
            sample_indices = np.random.choice(num_samples, size=num_samples, replace=True)  # Bootstrap
            sample_X = X_train[sample_indices]
            sample_y = y_train[sample_indices]

            estimator = clone(self.base_estimator)  # 克隆基分类器
            estimator.fit(sample_X, sample_y)
            print(f"模型 {i+1:2d} 完成!")

            predict_proba = estimator.predict_proba(X_test)[:, 1]
            result += predict_proba  # 累加不同分类器的预测概率

        result /= self.num_estimators  # 取平均(投票)
        return result
class AdaBoostM1(object):
    def __init__(self, base_estimator, num_iter):
        self.base_estimator = base_estimator  # 基础分类器对象
        self.num_iter = num_iter  # 迭代次数

    def fit_predict(self, X_train, y_train, X_test):
        result_lst, beta_lst = [], []  # 记录每次迭代的预测结果和投票权重
        num_samples = len(y_train)
        weights = np.ones(num_samples)  # 样本权重,注意总和应为 num_samples
        for i in range(self.num_iter):
            self.base_estimator.fit(X_train, y_train, sample_weight=weights)  # 带权重的训练
            print('第{:<2d}次迭代!'.format(i+1))
            train_predictions = self.base_estimator.predict(X_train)  # 训练集预测结果
            misclassified = train_predictions != y_train  
            error = np.sum(weights[misclassified]) / num_samples  
            if error > 0.5:
                break
            beta = error / (1 - error)
            weights = weights * (1 - misclassified) * beta + weights * misclassified  
            weights /= np.sum(weights) / num_samples  # 归一化,使权重和等于 num_samples
            beta_lst.append(beta)
            test_predictions = self.base_estimator.predict_proba(X_test)[:, 1]  # 测试集预测概率
            result_lst.append(test_predictions)
        beta_lst = np.log(1 / np.array(beta_lst))
        beta_lst /= np.sum(beta_lst)  # 归一化投票权重
        print('\nVote Weight:\n', beta_lst)
        result = np.sum(np.array(result_lst) * beta_lst[:, None], axis=0) 
        return result
from sklearn.model_selection import train_test_split
X_train, x_test, y_train, y_test = train_test_split(train_X, train_df['label'], test_size=0.14, random_state=42, shuffle=True)

在训练的时候也发现bagging算法要是使用直接划分的数据集会出错,所以我用了直接切片的方法就运行成功了。通过4种组合看出,svm+adaboostm1的组合auc成绩最高,在bagging算法在此次运行中不如adaboostm1的效果好。 

clf = selection_clf('SVM')  # 基分类器选择
clf = Bagging(clf, 10)
y_score = clf.fit_predict(train_X.tocsr()[:50000], train_df['label'][:50000], train_X.tocsr()[50000:57039])

# 计算ROC曲线和AUC
fpr, tpr, thresholds = roc_curve(train_df['label'][50000:57039], y_score)
roc_auc = auc(fpr, tpr)

# 绘制ROC曲线
plt.plot(fpr, tpr, label='ROC curve (AUC = %0.2f)' % roc_auc)
plt.plot([0, 1], [0, 1], 'k--')  # 绘制对角线
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.05])
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('SVM+Bagging')
plt.legend(loc="lower right")
plt.show()

最终选择选择效果最好的svm+adaboostm1进行预测,最终写入文件。

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

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

相关文章

Go的安装

一. 下载地址 Go官方下载地址&#xff1a;https://golang.org/dl/ Go中文网&#xff1a;https://go.p2hp.com/go.dev/dl/ 根据不同系统下载不同的包。 二. 配置GOPATH GOPATH是一个环境变量&#xff0c;用来表明你写的go项目的存放路径。 GOPATH路径最好只设置一个&#xff0…

C++ 特殊的类设计

目录 1.请设计一个类&#xff0c;不能被拷贝 2. 请设计一个类&#xff0c;只能在堆上创建对象 3. 请设计一个类&#xff0c;只能在栈上创建对象 4. 请设计一个类&#xff0c;不能被继承 5. 请设计一个类&#xff0c;只能创建一个对象(单例模式) 1.请设计一个类&#xff0c;…

Ant Design Vue 修改Model弹框 样式不生效

今天在使用 Ant Design Vue 组件库中又踩了一个坑 其他的样式都可以更改&#xff0c;唯独更改 Model 弹框组件的样式一直不生效 于是研究了好久才找到样式不生效的原因 最后又折腾了好久&#xff0c;参考了不少资料才得出的解决方案&#xff1a;

蓝桥杯备赛之二分专题

常用的算法二分模板 1. 在数组a[]中找大于等于x的第一个数的下标 //int ans lower_bound(a, a n, x) - a //相当于下方 int l 0, r n - 1; while(l < r) {int mid l r >> 1;if(a[mid] > x) r mid;else l mid 1; } cout << r;2. 在数组a[]中找大于…

CVPR 2022 Oral | Bailando: 基于编舞记忆和Actor-Critic GPT的3D舞蹈生成

目录 测试结果&#xff1a; 02 提出的方法 测试结果&#xff1a; 预测有3个步骤&#xff0c;速度比较慢 02 提出的方法 1. 针对舞蹈序列的VQ-VAE和编舞记忆 与之前的方法不同&#xff0c;我们不学习从音频特征到 3D 关键点序列的连续域的直接映射。相反&#xff0c;我们先让…

基于springboot实现线上阅读系统项目【项目源码+论文说明】

基于springboot实现线上阅读系统演示 摘要 随着社会发展速度的愈来愈快&#xff0c;以及社会压力变化的越来越快速&#xff0c;致使很多人采取各种不同的方法进行解压。大多数人的稀释压力的方法&#xff0c;是捧一本书籍&#xff0c;心情地让自己沉浸在情节里面&#xff0c;以…

基于亚马逊云科技新功能:Amazon SageMaker Canvas 无代码机器学习—以构建货物的交付状态检测模型实战为例深度剖析以突显其特性

授权说明&#xff1a;本篇文章授权活动官方亚马逊云科技文章转发、改写权&#xff0c;包括不限于在亚马逊云科技开发者社区、 知乎、自媒体平台、第三方开发者媒体等亚马逊云科技官方渠道。 亚马逊云科技 2023 re:Invent 全球大会是亚马逊云科技举办的一场技术盛会&#xff0c;…

数据治理实践——YY 直播业务指标治理实践

目录 一、问题背景 1.1 问题场景 1.2 问题小结 二、治理方案 2.1 治理目标 2.2 团队协同&#xff0c;共建规范 2.3 指标管理的定位 2.4 指标管理的目标及思路 2.5 指标管理&#xff0c;规范内容落地 2.6 数仓设计-关联指标维度 2.7 数据报表开发-配置口径说明 2.8 …

windows重装系统后如何恢复自带的正版office

前言 重装系统后&#xff0c;正版office如何安装 登录微软官网 https://www.microsoft.com 下载office&#xff0c;在已购买的产品中找到Office产品&#xff0c;点击安装,选择默认即可 https://account.microsoft.com/services

信号处理--基于EEG脑电信号处理研究概述

目录 前言 EEG特点 EEG预处理 EEG通道选择 EEG数据增强 EEG 维度降低 EEG特征提取 传统特征提取 深度学习自动提取特征 未来展望 创新的预处理方法 跨被试性能问题 模型融合 参考 前言 脑电信号&#xff08;EEG&#xff09;因其安全性、便携性、易用性、高时间分…

【你也能从零基础学会网站开发】Web建站之HTML+CSS入门篇 CSS常用属性

&#x1f680; 个人主页 极客小俊 ✍&#x1f3fb; 作者简介&#xff1a;web开发者、设计师、技术分享 &#x1f40b; 希望大家多多支持, 我们一起学习和进步&#xff01; &#x1f3c5; 欢迎评论 ❤️点赞&#x1f4ac;评论 &#x1f4c2;收藏 &#x1f4c2;加关注 CSS常用属性…

python--宣传篇--personal-qrcode个性二维码

文章目录 准备代码效果 准备 代码 from MyQR import myqr import osdef get_img_qrcode(words, save_name, picture, colorizedTrue):if save_name[-3:] in ["jpg", "png", "gif"]:if picture[-3:] in ["png", "jpg", &qu…

Github 2024-03-08 Java开源项目日报 Top10

根据Github Trendings的统计,今日(2024-03-08统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Java项目9C++项目1非开发语言项目1《Hello 算法》:动画图解、一键运行的数据结构与算法教程 创建周期:476 天协议类型:OtherStar数量:63556…

Android 性能优化--APK加固(2)加密

文章目录 字符串加密图片加密如何避免应用被重新签名分发APK 加壳的方案简析DEX加密原理及实现 本文首发地址&#xff1a;https://h89.cn/archives/212.html 最新更新地址&#xff1a;https://gitee.com/chenjim/chenjimblog 通过 前文 介绍&#xff0c;我们知晓了如何使用代码…

AI安全白皮书 | “深度伪造”产业链调查以及四类防御措施

以下内容&#xff0c;摘编自顶象防御云业务安全情报中心正在制作的《“深度伪造”视频识别与防御白皮书》&#xff0c;对“深度伪造”感兴趣的网友&#xff0c;可在文章留言中写下邮箱&#xff0c;在该白皮书完成后&#xff0c;会为您免费寄送一份电子版。 “深度伪造”就是创建…

OpenCV开发笔记(七十六):相机标定(一):识别棋盘并绘制角点

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://blog.csdn.net/qq21497936/article/details/136535848 各位读者&#xff0c;知识无穷而人力有穷&#xff0c;要么改需求&#xff0c;要么找专业人士&#xff0c;要么自己研究 红胖子(红模仿…

排序算法——梳理总结

✨冒泡 ✨选择 ✨插入  ✨标准写法  &#x1f3ad;不同写法 ✨希尔排序——标准写法 ✨快排 ✨归并 ✨堆排 ✨冒泡 void Bubble(vector<int>& nums) {// 冒泡排序只能先确定最右边的结果&#xff0c;不能先确定最左边的结果for (int i 0; i < nums.size(); i){…

1.2_2 OSI参考模型

文章目录 1.2_2 OSI参考模型一、概述&#xff08;一&#xff09;ISO/OSI参考模型是怎么来的&#xff1f;&#xff08;二&#xff09;ISO/OSI参考模型&#xff08;三&#xff09;ISO/OSI参考模型解释通信过程 二、各层功能及协议&#xff08;一&#xff09;应用层&#xff08;第…

微服务day06-Docker

Docker 大型项目组件较多&#xff0c;运行环境也较为复杂&#xff0c;部署时会碰到一些问题&#xff1a; 依赖关系复杂&#xff0c;容易出现兼容性问题 开发、测试、生产环境有差异 1.什么是Docker? 大型项目组件很多&#xff0c;运行环境复杂&#xff0c;部署时会遇到各种…

java集合类常用的方法介绍

在 Java 中&#xff0c;集合&#xff08;Collections&#xff09;是用于存储多个元素的容器。Java Collections Framework 提供了丰富的集合类&#xff0c;用于满足不同的数据存储需求。以下是一些常用的 Java 集合类及其常用方法&#xff0c;以及简单的例子来说明它们的用法。…