【pyspark学习从入门到精通22】机器学习库_5

server/2024/11/28 10:13:16/

训练-验证分割

TrainValidationSplit 模型为了选择最佳模型,会对输入数据集(训练数据集)进行随机分割,分成两个子集:较小的训练子集和验证子集。分割只执行一次。

在这个例子中,我们还将使用 ChiSqSelector 仅选择前五个特征,从而限制了我们模型的复杂性:

selector = ft.ChiSqSelector(numTopFeatures=5, featuresCol=featuresCreator.getOutputCol(), outputCol='selectedFeatures',labelCol='INFANT_ALIVE_AT_REPORT'
)

numTopFeatures 指定要返回的特征数量。我们将选择器放在 featuresCreator 之后,所以我们调用 featuresCreator 上的 .getOutputCol()。

我们之前已经介绍了如何创建 LogisticRegression 和 Pipeline,所以这里不再解释这些是如何创建的:

logistic = cl.LogisticRegression(labelCol='INFANT_ALIVE_AT_REPORT',featuresCol='selectedFeatures'
)
pipeline = Pipeline(stages=[encoder, featuresCreator, selector])
data_transformer = pipeline.fit(births_train)

TrainValidationSplit 对象的创建方式与 CrossValidator 模型相同:

tvs = tune.TrainValidationSplit(estimator=logistic, estimatorParamMaps=grid, evaluator=evaluator
)

和以前一样,我们将数据拟合到模型中,并计算结果:

tvsModel = tvs.fit(data_transformer \.transform(births_train)
)
data_train = data_transformer \.transform(births_test)
results = tvsModel.transform(data_train)
print(evaluator.evaluate(results, {evaluator.metricName: 'areaUnderROC'}))
print(evaluator.evaluate(results, {evaluator.metricName: 'areaUnderPR'}))

前面的代码输出了以下结果:

嗯,具有较少特征的模型肯定比完整模型表现得差,但差异并不是很大。最终,这是在更复杂的模型和不太复杂的模型之间的性能权衡。

PySpark ML 其他功能的实际应用

我们描述了 PySpark ML 库的大部分功能。在这一部分,我们将提供如何使用其中一些转换器和估计器的示例。

特征提取

我们已经使用了很多这个 PySpark 子模块的模型。在这一部分,我们将展示如何使用我们认为最有用的一些模型。

自然语言处理相关的特征提取器

正如前面所描述的,NGram 模型接受一个标记文本列表,并产生单词对(或 n-gram)。

在这个例子中,我们将引用 PySpark 文档的一部分,并展示如何在将文本传递给 NGram 模型之前进行清理。以下是我们数据集的样子(为了简洁起见,进行了缩写):

text_data = spark.createDataFrame([['''Machine learning can be applied to a wide variety of data types, such as vectors, text, images, and structured data. This API adopts the DataFrame from Spark SQL in order to support a variety of datatypes.'''],(...)['''Columns in a DataFrame are named. The code examples below use names such as "text," "features," and "label."''']
], ['input'])

我们单列 DataFrame 中的每一行只是一堆文本。首先,我们需要对这些文本进行标记。为此,我们将使用 RegexTokenizer 而不是 Tokenizer,因为我们可以指定我们希望文本在何处分割的模式:

tokenizer = ft.RegexTokenizer(inputCol='input', outputCol='input_arr', pattern='\s+|[,.\"]')

这里的模式根据任意数量的空格分割文本,同时去除逗号、句点、反斜杠和引号。标记器的输出的一行看起来像这样:

如你所见,RegexTokenizer 不仅将句子分割成单词,还将文本规范化,使每个单词都是小写。

然而,我们的文本中仍然有很多垃圾:像 be、a 或 to 这样的词在分析文本时通常不会提供任何有用的信息。因此,我们将使用 StopWordsRemover(...) 移除这些所谓的停用词:

stopwords = ft.StopWordsRemover(inputCol=tokenizer.getOutputCol(), outputCol='input_stop')

该方法的输出如下:

现在我们只有有用的单词。那么,让我们构建我们的 NGram 模型和 Pipeline:

ngram = ft.NGram(n=2, inputCol=stopwords.getOutputCol(), outputCol="nGrams")
pipeline = Pipeline(stages=[tokenizer, stopwords, ngram])

现在我们已经有了管道,我们按照之前非常相似的方式进行:

data_ngram = pipeline \.fit(text_data) \.transform(text_data)
data_ngram.select('nGrams').take(1)

前面的代码产生了以下输出:

就是这样。我们已经得到了我们的 n-gram,现在我们可以在进一步的 NLP 处理中使用它们。
 


http://www.ppmy.cn/server/145598.html

相关文章

创建一个简单的 Nuxt.js 应用

记录一下自己创建一个使用 Vue 3 的 Nuxt.js 应用的过程。该应用包含两个子页面,相对简单。最大的坑是创建项目时用了如下的命令: npx create-nuxt-app pic-first-nuxt结果如论如何都创建不出来,要不就卡住,要不就报错&#xff1…

BERT的配置

BERT的配置 BERT-base: BERT-base由12层编码器叠加而成。每层编码器都使用12个注意力头,其中前馈网络层由768个隐藏神经元组成,所以从BERT-base得到的特征向量的大小是768。 我们使用以下符号来表示上述内容。 ● 编码器的层数用L表示。 …

InstructGPT——AI 模型的对齐革命

InstructGPT——AI 模型的对齐革命 近年来,人工智能领域中大型语言模型的发展速度令人瞩目。其中,OpenAI 发布的 InstructGPT 是一次重要的技术革新,它通过引入人类反馈强化学习(Reinforcement Learning with Human Feedback, RL…

17. 【.NET 8 实战--孢子记账--从单体到微服务】--记账模块--主币种设置

记账模块是我们项目的核心模块,也是用户使用最多的模块,因此这个模块的东西比较多,我们要分为多个部分编写代码。 一、需求 币种设置的需求涉及到了我们前面编写的代码,我们来具体看一下需求。 编号需求说明1主币种设置1. 用户…

git源码安装

源码安装。执行以下步骤: 使用"wget"命令下载Git源码包,例如:"wget https://www.kernel.org/pub/software/scm/git/git-2.0.5.tar.gz"。 使用"tar"命令解压缩下载的源码包,例如:"…

C语言编码规范

以下是一套较为完整的C语言编码规范: 一、代码布局 缩进 使用空格进行缩进,每级缩进为4个空格。这样可以保证代码在不同的编辑器和环境中都有一致的缩进效果。例如: if (condition) {// 这里缩进了4个空格statement1;statement2; }大括号 函…

快速理解微服务中Fegin的概念

一.由来 1.在传统的架构里面,我们是通过使用RestTemplate来访问其他的服务,但是这种方式就存在了一个很大的缺陷,也就是被调用方如果发生了服务的迁移(IP和端口发生了变化),那么调用方也需要同步的在代码里面进行修改,…

大数据新视界 -- Hive 与其他大数据工具的集成:协同作战的优势(上)(13/ 30)

💖💖💖亲爱的朋友们,热烈欢迎你们来到 青云交的博客!能与你们在此邂逅,我满心欢喜,深感无比荣幸。在这个瞬息万变的时代,我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…