使用Azure/mmlspark中的Vowpal Wabbit进行文本情感分类实战

使用Azure/mmlspark中的Vowpal Wabbit进行文本情感分类实战

SynapseML SynapseML 项目地址: https://gitcode.com/gh_mirrors/mm/mmlspark

前言

在大数据时代,文本情感分析已成为企业洞察用户意见、优化产品服务的重要工具。本文将介绍如何利用Azure/mmlspark(原SynapseML)中的Vowpal Wabbit组件,构建一个高效的Twitter情感分类模型。Vowpal Wabbit(简称VW)是一个快速、高效的在线学习算法库,特别适合处理大规模数据。

环境准备

首先,我们需要准备以下Python包:

import os
import urllib.request
import pandas as pd
from zipfile import ZipFile
from pyspark.sql.functions import udf, rand, when, col
from pyspark.ml import Pipeline
from pyspark.ml.feature import CountVectorizer, RegexTokenizer
from synapse.ml.vw import VowpalWabbitClassifier
from synapse.ml.train import ComputeModelStatistics
from pyspark.mllib.evaluation import BinaryClassificationMetrics
import matplotlib.pyplot as plt

数据集介绍

我们使用Sentiment140 Twitter数据集,这是一个广泛用于情感分析研究的公开数据集,包含160万条标记过的推文。每条数据包含以下字段:

  • label:情感标签(0.0=负面,2.0=中性,4.0=正面)
  • id:推文ID
  • date:发布日期
  • query_string:查询字符串
  • user:发布用户
  • text:推文内容

数据准备

下载数据

我们首先定义一个下载和解压数据的函数:

DATA_URL = "https://mmlspark.blob.core.windows.net/publicwasb/twittersentimenttrainingandtestdata.zip"
DATA_FOLDER = "data"

def download_data(url, data_folder=DATA_FOLDER, filename="downloaded_data.zip"):
    """下载并解压数据"""
    data_dir = "./" + DATA_FOLDER
    if not os.path.exists(data_dir):
        os.makedirs(data_dir)
    downloaded_filepath = os.path.join(data_dir, filename)
    print("下载数据中...")
    urllib.request.urlretrieve(url, downloaded_filepath)
    print("解压数据中...")
    zipfile = ZipFile(downloaded_filepath)
    zipfile.extractall(data_dir)
    zipfile.close()
    print("数据下载和解压完成。")

download_data(DATA_URL)

数据预处理

读取训练数据并进行预处理:

COL_NAMES = ["label", "id", "date", "query_string", "user", "text"]
ENCODING = "iso-8859-1"
TRAIN_FILENAME = "training.1600000.processed.noemoticon.csv"

df_train = pd.read_csv(
    os.path.join(".", DATA_FOLDER, TRAIN_FILENAME),
    header=None,
    names=COL_NAMES,
    encoding=ENCODING,
)
df_train = spark.createDataFrame(df_train, verifySchema=False)

为了加速训练过程,我们随机抽样10万条数据,并将标签转换为二元分类(0=负面,1=正面):

df_train = (
    df_train.orderBy(rand())
    .limit(100000)
    .withColumn("label", when(col("label") > 0, 1.0).otherwise(0.0))
    .select(["label", "text"])
)

模型构建

特征工程

我们使用以下步骤构建特征:

  1. 使用正则表达式分词器将文本分割为单词
  2. 使用词频统计将单词转换为特征向量
tokenizer = RegexTokenizer(inputCol="text", outputCol="words")
count_vectorizer = CountVectorizer(inputCol="words", outputCol="features")

Vowpal Wabbit模型配置

VW模型配置关键参数:

  • loss_function=logistic:使用逻辑回归损失函数
  • quiet:减少输出信息
  • holdout_off:不使用保留集
  • numPasses=10:数据迭代次数
args = "--loss_function=logistic --quiet --holdout_off"
vw_model = VowpalWabbitClassifier(
    featuresCol="features", labelCol="label", passThroughArgs=args, numPasses=10
)

构建Pipeline

将特征工程和模型组合成Pipeline:

vw_pipeline = Pipeline(stages=[tokenizer, count_vectorizer, vw_model])

模型训练

vw_trained = vw_pipeline.fit(df_train)

模型评估

准备测试数据

TEST_FILENAME = "testdata.manual.2009.06.14.csv"

df_test = pd.read_csv(
    os.path.join(".", DATA_FOLDER, TEST_FILENAME),
    header=None,
    names=COL_NAMES,
    encoding=ENCODING,
)
df_test = spark.createDataFrame(df_test, verifySchema=False)

# 过滤中性推文,只保留正面和负面
df_test = (
    df_test.filter(col("label") != 2.0)
    .withColumn("label", when(col("label") > 0, 1.0).otherwise(0.0))
    .select(["label", "text"])
)

预测与评估

# 生成预测
predictions = vw_trained.transform(df_test)

# 计算评估指标
metrics = ComputeModelStatistics(
    evaluationMetric="classification", labelCol="label", scoredLabelsCol="prediction"
).transform(predictions)
metrics.toPandas()

ROC曲线绘制

class CurveMetrics(BinaryClassificationMetrics):
    def __init__(self, *args):
        super(CurveMetrics, self).__init__(*args)

    def get_curve(self, method):
        rdd = getattr(self._java_model, method)().toJavaRDD()
        points = []
        for row in rdd.collect():
            points += [(float(row._1()), float(row._2()))]
        return points

preds = predictions.select("label", "probability").rdd.map(
    lambda row: (float(row["probability"][1]), float(row["label"]))
)
roc_points = CurveMetrics(preds).get_curve("roc")

# 绘制ROC曲线
fig = plt.figure()
x_val = [x[0] for x in roc_points]
y_val = [x[1] for x in roc_points]
plt.title("ROC curve on test set")
plt.xlabel("False positive rate")
plt.ylabel("True positive rate")
plt.plot(x_val, y_val)
plt.show()

结果分析

通过ROC曲线和评估指标,我们可以全面了解模型性能。典型的VW模型在该数据集上可以达到较高的准确率和AUC值,证明其在文本情感分类任务中的有效性。

优化建议

  1. 增加训练数据量:使用完整160万条数据训练通常能获得更好的性能
  2. 调整VW参数:尝试不同的学习率、正则化参数等
  3. 特征工程优化:尝试TF-IDF、n-gram等更复杂的特征提取方法
  4. 模型集成:结合其他分类器如LightGBM进行模型集成

总结

本文详细介绍了使用Azure/mmlspark中的Vowpal Wabbit组件构建Twitter情感分类模型的完整流程。VW以其高效的在线学习能力,特别适合处理大规模文本数据。通过合理的特征工程和参数调优,可以构建出性能优异的情感分析模型。

SynapseML SynapseML 项目地址: https://gitcode.com/gh_mirrors/mm/mmlspark

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

虞熠蝶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值