【机器学习】基于集成学习的 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_score

RANDOM_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_samples

    for 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_samples

        beta_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 CalibratedClassifierCV

svm_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)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

论文阅读——MP-Former

MP-Former: Mask-Piloted Transformer for Image Segmentation https://arxiv.org/abs/2303.07336 mask2former问题是&#xff1a;相邻层得到的掩码不连续&#xff0c;差别很大 denoising training非常有效地稳定训练时期之间的二分匹配。去噪训练的关键思想是将带噪声的GT坐标…

对象存储minio

参考Linux搭建免费开源对象存储 wget https://dl.minio.io/server/minio/release/linux-amd64/minio yum install -y wget yum install -y wget wget https://dl.minio.io/server/minio/release/linux-amd64/minio chmod x minio sudo mv minio /usr/local/bin/ minio --vers…

编译DuiLib库遇到的变量定义位置问题

C89 规定&#xff0c;所有局部变量都必须定义在函数开头&#xff0c;在定义好变量之前不能有其他的执行语句&#xff1b; C99 标准取消这这条限制&#xff0c;但是 VC/VS 对 C99 的支持不是很积极&#xff1b; C99 是 C89 的升级版&#xff1b; 如图是修改之后的代码&#xff1…

海光--性能领先实干者

这是ren_dong的第26篇原创 1、概述 国产X86 CPU领航者 海光信息是一家从事高端处理器、加速器等计算芯片产品和系统研发的公司 &#xff0c;是国产X86 CPU领航者海光处理器兼容市场主流的 X86 指令集&#xff0c;具有成熟而丰富的应用生态环境公司股权结构合理 &#xff0c;聚集…

python复制别人的虚拟环境

虚拟环境的结构 一个项目的虚拟环境是由以下组成的&#xff0c;如下图&#xff1a; 其中Lib文件夹里存放的就是我们安装的一些第三方库&#xff0c;Scripts文件夹很重要&#xff0c;它里面的activate文件是用于激活虚拟环境的&#xff0c;还有pyvenv.cfg文件是这个虚拟环境的…

第8节、双电机多段直线运动【51单片机+L298N步进电机系列教程】

↑↑↑点击上方【目录】&#xff0c;查看本系列全部文章 摘要&#xff1a;前面章节主要介绍了bresenham直线插值运动&#xff0c;本节内容介绍让两个电机完成连续的直线运动,目标是画一个正五角星 一、五角星图介绍 五角星总共10条直线&#xff0c;10个顶点。设定左下角为原点…

seata分布式事务

文章目录 1、分布式事务1.1 事务的ACID原则原子性一致性隔离性持久性 1.2 分布式事务的问题示例代码准备环境1. seata_demo数据库2. 启动nacos seata-demo父工程pom.xml order-servicepom.xmlapplication.ymlOrderApplicationOrderControllerOrderServiceImplAccountClientStor…

leetcode1079:游戏玩法分析——求留存率

求留存率 题目描述题解 题目描述 表&#xff1a;Activity --------------------- | Column Name | Type | --------------------- | player_id | int | | device_id | int | | event_date | date | | games_played | int | --------------------- &#xff08;player_id&…

用的到的linux-删除文件-Day3

前言&#xff1a; 上一节&#xff0c;我们讲到了怎么去移动文件&#xff0c;其中使用到两大类的脚本命令即cp和mv。各两种命令都可以完成移动&#xff0c;但是cp是复制粘贴的方式&#xff0c;可以选择原封不动的复制粘贴过来&#xff0c;即不修改文件及文件夹的创建时间等&…

项目 高并发内存池

目录 项目背景 项目介绍 定长内存池 定长内存池整体架构 New 方法 Delete 方法 线程缓存 TLS 线程缓存整体结构 FreeList 设计 线程缓存模型 Allocate 申请内存 计算对齐大小 计算映射位置 申请内存流程 申请内存时创建线程缓存 中心缓存 中心缓存模型 中心…

从零开始手写mmo游戏从框架到爆炸(一)— 开发环境

一、创建项目 1、首先创建一个maven项目&#xff0c;pom文件如下&#xff1a; <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0…

LeetCode 热题 100 | 链表(中下)

目录 1 19. 删除链表的倒数第 N 个节点 2 24. 两两交换链表中的节点 3 25. K 个一组翻转链表 4 138. 随机链表的复制 菜鸟做题第三周&#xff0c;语言是 C 1 19. 删除链表的倒数第 N 个节点 到底是节点还是结点。。。 解题思路&#xff1a; 设置双指针 left 和 ri…

Vue代理模式和Nginx反向代理(Vue代理部署不生效)

在使用axios时&#xff0c;经常会遇到跨域问题。为了解决跨域问题&#xff0c;可以在 vue.config.js 文件中配置代理&#xff1a; const { defineConfig } require(vue/cli-service) module.exports defineConfig({transpileDependencies: true,devServer: {port: 7070,prox…

Unity3D实现项目限制功能(使用次数限制和时间限制)

系列文章目录 unity工具 文章目录 系列文章目录前言一、时间限制1-1、代码如下&#xff1a; 二、次数限制2-1、 在Unity项目中需要对注册表进行操作&#xff0c;还需要设置一下API兼容级别设置成 .NET Framework2-2、设置如下图 Player里面2-3、代码如下&#xff1a; 三、同时…

python学习21

前言&#xff1a;相信看到这篇文章的小伙伴都或多或少有一些编程基础&#xff0c;懂得一些linux的基本命令了吧&#xff0c;本篇文章将带领大家服务器如何部署一个使用django框架开发的一个网站进行云服务器端的部署。 文章使用到的的工具 Python&#xff1a;一种编程语言&…

EasyX图形库学习(三、用easyX控制图形界面中的小球、图片-加载、输出)

目录 小球视频 图像输出函数 loadimage用于从文件中读取图片 putimage在当前设备上绘制指定图像。 initgraph 函数 图片输出 代码详解&#xff1a; 1. 初始化图形界面 2. 设置背景颜色并清除屏幕 3. 加载并显示图片 4. 等待用户输入并退出程序 图形界面中的小球 1…

docer compose部署simple-docker

简介 一个看似简陋但是功能足够用的docker管理工具 安装 创建目录 mkdir -p /opt/simple-docker cd /opt/simple-docker 创建并启动容器 编写docker-compose.yml文件,内容如下 version: 3 services: redis: image: redis:latest restart: always web: image: registry.cn-…

Linux线程库封装

一 MyThread.hpp #pragma once #include<pthread.h> #include<iostream> #include<unistd.h> #include<string> #include<ctime>typedef void (*callback_t)(); static int num 1; //任务和线程绑定 class Thread {static void* Routine(void …

解决hive表新增的字段查询为空null问题

Hive分区表新增字段&#xff0c;查询时数据为NULL的解决方案 由于业务拓展&#xff0c;需要往hive分区表新增新的字段&#xff0c;hive版本为2点多。 于是利用 alter table table_name add columns (col_name string )新增字段&#xff0c;然后向已存在分区中插入数据&#x…

MySQL学习记录——사 表结构的操作

文章目录 1、创建表2、查看表结构3、改变表结构4、删除表5、总结 1、创建表 CREATE TABLE table_name ( field1 datatype, field2 datatype, field3 datatype ) character set 字符集 collate 校验规则 engine 存储引擎; 例子 create table users ( id int, name varchar(20) c…