手推FlinkML2.2(三)

本文介绍了FlinkML库中的SQLTransformer和StandardScaler。SQLTransformer允许使用SQL对数据进行预处理,适用于数据清洗和特征工程。StandardScaler则用于特征缩放,确保数据在0-1范围内,提升模型性能。示例代码展示了如何使用这两个工具进行数据处理。
摘要由CSDN通过智能技术生成

SQLTransformer(SQL转换器)是一种数据预处理方法,允许您使用SQL语句对数据进行转换和操作。SQL转换器通常用于数据清洗、特征工程和数据聚合等任务,以提高数据分析和机器学习模型的性能。它可以与各种数据处理和存储系统(如关系型数据库、大数据平台和数据仓库)结合使用,实现灵活高效的数据处理。

SQL转换器的主要优点是可以利用SQL的强大功能和广泛支持来处理复杂的数据任务。例如,您可以使用SQL查询来筛选数据、计算新特征、连接数据表和分组聚合数据。此外,SQL转换器可以与各种数据源和API(如JDBC、ODBC和SQLAlchemy)集成,从而实现跨平台和跨语言的数据处理。

然而,SQL转换器的缺点是它可能受到SQL语法和性能的限制,尤其是在处理大规模数据和复杂任务的情况下。为了解决这些问题,可以考虑使用其他数据处理方法(如Pandas、Dask和Apache Spark)或分布式计算框架(如Hadoop和MapReduce)进行更高效的数据处理。

在实际应用中,SQL转换器通常与其他数据预处理方法(如特征缩放、特征选择和特征编码)和机器学习模型(如线性回归、决策树和神经网络)结合使用,以提高数据分析和模型的性能。在处理不同数据源和任务时,需要根据实际需求选择合适的数据处理方法。

SQL 转换器 #

SQLTransformer 实现由 SQL 语句定义的转换。

目前只支持SELECT ... FROM __THIS__ ...where __THIS__代表输入表的SQL语法,不能修改。

select 子句指定要在输出中显示的字段、常量和表达式。除了下面注释部分描述的情况,它可以是 Flink SQL 支持的任何 select 子句。用户也可以使用 Flink SQL 的内置函数和 UDF 来对这些选中的列进行操作。

例如,SQLTransformer 支持如下语句:

SELECT a, a + b AS a_b FROM __THIS__

SELECT a, SQRT(b) AS b_sqrt FROM __THIS__ where a > 5

SELECT a, b, SUM(c) AS c_sum FROM __THIS__ GROUP BY a, b

注意:此运算符仅生成仅附加/仅插入表作为其输出。如果输出表可能包含撤回消息(例如,SELECT ... FROM __THIS__ GROUP BY ...以流模式对表执行操作),此运算符将汇总所有更改日志并仅输出最终状态。

Parameters #

编辑

添加图片注释,不超过 140 字(可选)

Java

import org.apache.flink.api.common.typeinfo.Types;

import org.apache.flink.api.java.typeutils.RowTypeInfo;

import org.apache.flink.ml.feature.sqltransformer.SQLTransformer;

import org.apache.flink.streaming.api.datastream.DataStream;

import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;

import org.apache.flink.table.api.Table;

import org.apache.flink.table.api.bridge.java.StreamTableEnvironment;

import org.apache.flink.types.Row;

import java.util.Arrays;

/** Simple program that creates a SQLTransformer instance and uses it for feature engineering. */

public class SQLTransformerExample {

public static void main(String[] args) {

StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();

StreamTableEnvironment tEnv = StreamTableEnvironment.create(env);

// Generates input data.

DataStream<Row> inputStream =

env.fromCollection(

Arrays.asList(Row.of(0, 1.0, 3.0), Row.of(2, 2.0, 5.0)),

new RowTypeInfo(Types.INT, Types.DOUBLE, Types.DOUBLE));

Table inputTable = tEnv.fromDataStream(inputStream).as("id", "v1", "v2");

// Creates a SQLTransformer object and initializes its parameters.

SQLTransformer sqlTransformer =

new SQLTransformer()

.setStatement("SELECT *, (v1 + v2) AS v3, (v1 * v2) AS v4 FROM __THIS__");

// Uses the SQLTransformer object for feature transformations.

Table outputTable = sqlTransformer.transform(inputTable)[0];

// Extracts and displays the results.

outputTable.execute().print();

}

}

Python

# Simple program that creates a SQLTransformer instance and uses it for feature

# engineering.

from pyflink.common import Types

from pyflink.datastream import StreamExecutionEnvironment

from pyflink.ml.feature.sqltransformer import SQLTransformer

from pyflink.table import StreamTableEnvironment

env = StreamExecutionEnvironment.get_execution_environment()

t_env = StreamTableEnvironment.create(env)

# Generates input data.

input_data_table = t_env.from_data_stream(

env.from_collection([

(0, 1.0, 3.0),

(2, 2.0, 5.0),

],

type_info=Types.ROW_NAMED(

['id', 'v1', 'v2'],

[Types.INT(), Types.DOUBLE(), Types.DOUBLE()])))

# Creates a SQLTransformer object and initializes its parameters.

sql_transformer = SQLTransformer() \

.set_statement('SELECT *, (v1 + v2) AS v3, (v1 * v2) AS v4 FROM __THIS__')

# Uses the SQLTransformer object for feature transformations.

output_table = sql_transformer.transform(input_data_table)[0]

# Extracts and displays the results.

output_table.execute().print()

StandardScaler(标准化缩放器)是一种特征预处理方法,用于将特征缩放到均值为0、方差为1的标准正态分布。标准化缩放器通过将特征值减去均值,然后除以标准差,从而将特征缩放到一个相对稳定的范围。它通常用于处理具有不同尺度和分布的特征,以提高机器学习模型的性能。

标准化缩放器的工作原理是将特征值减去均值,然后除以标准差,从而将特征缩放到均值为0、方差为1的标准正态分布。例如,对于特征向量(x1, x2, x3),标准化缩放器将其转换为以下形式:

(x1 - mean(x1)) / std(x1),

(x2 - mean(x2)) / std(x2),

(x3 - mean(x3)) / std(x3)

标准化缩放器的主要优点是可以适应不同尺度和分布的特征,提高模型的训练和预测性能。此外,标准化缩放器可以减小特征之间的权重差异,从而提高机器学习模型的稳定性和泛化能力。

然而,标准化缩放器的缺点是它可能受到异常值和离群点的影响,导致性能下降。在处理具有异常值和离群点的数据时,可以考虑使用其他特征缩放方法(如最小-最大缩放器和鲁棒缩放器)进行更鲁棒的数据预处理。

在实际应用中,标准化缩放器通常与其他预处理方法(如特征选择和规范化)结合使用,以提高模型的性能。在处理不同尺度和分布的特征时,需要根据实际需求选择合适的特征缩放方法。

σ表示特征的标准差。标准差是一个衡量数据点与均值之间差异的度量,它可以帮助我们了解数据的离散程度。计算标准差的过程如下:

计算特征的均值(mean):首先,对于给定的特征,计算所有数据点的均值。均值是所有数据点之和除以数据点的数量。

公式:μ = Σx_i / n

其中,x_i表示第i个数据点的值,n表示数据点的总数。

计算每个数据点与均值之间的差值:接下来,对于每个数据点,计算其值与均值之间的差值。

公式:d_i = x_i - μ

其中,d_i表示第i个数据点与均值之间的差值。

计算差值的平方:将每个差值的平方相加。

公式:Σ(d_i)^2

其中,(d_i)^2表示第i个差值的平方。

计算方差(variance):将差值平方之和除以数据点的数量(或数量减1,这取决于是否使用样本方差或总体方差)。

公式(样本方差):s^2 = Σ(d_i)^2 / (n - 1)

公式(总体方差):σ^2 = Σ(d_i)^2 / n

计算标准差:最后,计算方差的平方根以得到标准差。

公式:σ = √s^2 或 σ = √σ^2

通过这个过程,我们可以计算出特征的标准差σ。然后,在StandardScaler中使用这个值来对特征进行缩放。

StandardScaler 是一种通过去除均值并将每个维度缩放为单位方差来标准化输入特征的算法。

Input Columns #

编辑

添加图片注释,不超过 140 字(可选)

Output Columns #

编辑

添加图片注释,不超过 140 字(可选)

Parameters #

编辑切换为居中

添加图片注释,不超过 140 字(可选)

添加图片注释,不超过 140 字(可选)

Java

import org.apache.flink.ml.feature.standardscaler.StandardScaler;

import org.apache.flink.ml.feature.standardscaler.StandardScalerModel;

import org.apache.flink.ml.linalg.DenseVector;

import org.apache.flink.ml.linalg.Vectors;

import org.apache.flink.streaming.api.datastream.DataStream;

import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;

import org.apache.flink.table.api.Table;

import org.apache.flink.table.api.bridge.java.StreamTableEnvironment;

import org.apache.flink.types.Row;

import org.apache.flink.util.CloseableIterator;

/** Simple program that trains a StandardScaler model and uses it for feature engineering. */

public class StandardScalerExample {

public static void main(String[] args) {

StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();

StreamTableEnvironment tEnv = StreamTableEnvironment.create(env);

// Generates input data.

DataStream<Row> inputStream =

env.fromElements(

Row.of(Vectors.dense(-2.5, 9, 1)),

Row.of(Vectors.dense(1.4, -5, 1)),

Row.of(Vectors.dense(2, -1, -2)));

Table inputTable = tEnv.fromDataStream(inputStream).as("input");

// Creates a StandardScaler object and initializes its parameters.

StandardScaler standardScaler = new StandardScaler();

// Trains the StandardScaler Model.

StandardScalerModel model = standardScaler.fit(inputTable);

// Uses the StandardScaler Model for predictions.

Table outputTable = model.transform(inputTable)[0];

// Extracts and displays the results.

for (CloseableIterator<Row> it = outputTable.execute().collect(); it.hasNext(); ) {

Row row = it.next();

DenseVector inputValue = (DenseVector) row.getField(standardScaler.getInputCol());

DenseVector outputValue = (DenseVector) row.getField(standardScaler.getOutputCol());

System.out.printf("Input Value: %s\tOutput Value: %s\n", inputValue, outputValue);

}

}

}

Python

# Simple program that trains a StandardScaler model and uses it for feature

# engineering.

from pyflink.common import Types

from pyflink.datastream import StreamExecutionEnvironment

from pyflink.ml.linalg import Vectors, DenseVectorTypeInfo

from pyflink.ml.feature.standardscaler import StandardScaler

from pyflink.table import StreamTableEnvironment

# create a new StreamExecutionEnvironment

env = StreamExecutionEnvironment.get_execution_environment()

# create a StreamTableEnvironment

t_env = StreamTableEnvironment.create(env)

# generate input data

input_data = t_env.from_data_stream(

env.from_collection([

(Vectors.dense(-2.5, 9, 1),),

(Vectors.dense(1.4, -5, 1),),

(Vectors.dense(2, -1, -2),),

],

type_info=Types.ROW_NAMED(

['input'],

[DenseVectorTypeInfo()])

))

# create a standard-scaler object and initialize its parameters

standard_scaler = StandardScaler()

# train the standard-scaler model

model = standard_scaler.fit(input_data)

# use the standard-scaler model for predictions

output = model.transform(input_data)[0]

# extract and display the results

field_names = output.get_schema().get_field_names()

for result in t_env.to_data_stream(output).execute_and_collect():

input_value = result[field_names.index(standard_scaler.get_input_col())]

output_value = result[field_names.index(standard_scaler.get_output_col())]

print('Input Value: ' + str(input_value) + ' \tOutput Value: ' + str(output_value))

StopWordsRemover(停用词过滤器)是一种文本预处理方法,用于去除语言中常见但对文本分类和挖掘无意义的单词。停用词通常是像“the”、“is”、“and”、“a”、“an”等这样的单词,它们不包含有关文本内容的重要信息,但在文本处理中占据大量的单词频率。停用词过滤器通过使用停用词列表来过滤文本中的这些单词,以提高文本分析和机器学习模型的性能。

停用词过滤器的主要优点是可以减少文本噪声和冗余信息,提高文本分类和挖掘任务的准确性和可靠性。此外,停用词过滤器可以适应不同语言和文本类型的数据,通过调整停用词列表来平衡模型的训练和评估。

然而,停用词过滤器的缺点是它可能会去除某些在特定上下文中具有重要意义的单词。在某些情况下,停用词过滤器可能会导致信息损失和模型性能下降。为了解决这些问题,可以考虑使用基于语法和语义的文本处理方法(如词干提取、词形还原和命名实体识别)和机器学习方法(如深度学习和自然语言处理模型)进行更高级的文本处理。

在实际应用中,停用词过滤器通常与其他文本预处理方法(如词干提取和词形还原)和特征提取方法(如词袋模型、TF-IDF和词嵌入)结合使用,以提高自然语言处理和文本挖掘任务的性能。在处理不同语言和文本类型的数据时,需要根据实际需求选择合适的文本预处理方法。

停用词删除器 #

从输入中过滤掉停用词的特征转换器。

注意:输入数组中的空值将被保留,除非明确地将空值添加到 stopWords。

另请参阅:停用词(维基百科)

Input Columns #

编辑

添加图片注释,不超过 140 字(可选)

包含要删除的停用词的字符串数组。

Output Columns #

编辑

添加图片注释,不超过 140 字(可选)

删除了停用词的字符串数组。

Parameters #

编辑切换为居中

添加图片注释,不超过 140 字(可选)

编辑

添加图片注释,不超过 140 字(可选)

Java

import org.apache.flink.ml.feature.stopwordsremover.StopWordsRemover;

import org.apache.flink.streaming.api.datastream.DataStream;

import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;

import org.apache.flink.table.api.Table;

import org.apache.flink.table.api.bridge.java.StreamTableEnvironment;

import org.apache.flink.types.Row;

import org.apache.flink.util.CloseableIterator;

import java.util.Arrays;

/** Simple program that creates a StopWordsRemover instance and uses it for feature engineering. */

public class StopWordsRemoverExample {

public static void main(String[] args) {

StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();

StreamTableEnvironment tEnv = StreamTableEnvironment.create(env);

// Generates input data.

DataStream<Row> inputStream =

env.fromElements(

Row.of((Object) new String[] {"test", "test"}),

Row.of((Object) new String[] {"a", "b", "c", "d"}),

Row.of((Object) new String[] {"a", "the", "an"}),

Row.of((Object) new String[] {"A", "The", "AN"}),

Row.of((Object) new String[] {null}),

Row.of((Object) new String[] {}));

Table inputTable = tEnv.fromDataStream(inputStream).as("input");

// Creates a StopWordsRemover object and initializes its parameters.

StopWordsRemover remover =

new StopWordsRemover().setInputCols("input").setOutputCols("output");

// Uses the StopWordsRemover object for feature transformations.

Table outputTable = remover.transform(inputTable)[0];

// Extracts and displays the results.

for (CloseableIterator<Row> it = outputTable.execute().collect(); it.hasNext(); ) {

Row row = it.next();

String[] inputValues = row.getFieldAs("input");

String[] outputValues = row.getFieldAs("output");

System.out.printf(

"Input Values: %s\tOutput Values: %s\n",

Arrays.toString(inputValues), Arrays.toString(outputValues));

}

}

}

Python

# Simple program that creates a StopWordsRemover instance and uses it for feature

# engineering.

from pyflink.common import Types

from pyflink.datastream import StreamExecutionEnvironment

from pyflink.ml.feature.stopwordsremover import StopWordsRemover

from pyflink.table import StreamTableEnvironment

# create a new StreamExecutionEnvironment

env = StreamExecutionEnvironment.get_execution_environment()

# create a StreamTableEnvironment

t_env = StreamTableEnvironment.create(env)

# generate input data

input_table = t_env.from_data_stream(

env.from_collection([

(["test", "test"],),

(["a", "b", "c", "d"],),

(["a", "the", "an"],),

(["A", "The", "AN"],),

([None],),

([],),

],

type_info=Types.ROW_NAMED(

['input'],

[Types.OBJECT_ARRAY(Types.STRING())])))

# create a StopWordsRemover object and initialize its parameters

remover = StopWordsRemover().set_input_cols('input').set_output_cols('output')

# use the StopWordsRemover for feature engineering

output_table = remover.transform(input_table)[0]

# extract and display the results

field_names = output_table.get_schema().get_field_names()

for result in t_env.to_data_stream(output_table).execute_and_collect():

input_value = result[field_names.index('input')]

output_value = result[field_names.index('output')]

print('Input Value: ' + str(input_value) + '\tOutput Value: ' + str(output_value))

StringIndexer(字符串索引器)是一种数据预处理方法,用于将分类变量(如文本标签)转换为数值变量(如整数索引)。字符串索引器通常用于机器学习模型的训练和预测,以便处理分类变量和数值变量的混合数据类型。

字符串索引器的工作原理是将每个分类变量映射到唯一的整数索引,从而将分类变量转换为数值变量。例如,对于标签列中的文本标签("red","green","blue"),字符串索引器将其转换为整数索引(0,1,2)。这些整数索引可以被机器学习模型处理和使用。

字符串索引器的主要优点是可以将分类变量转换为数值变量,以便于机器学习模型的训练和预测。此外,字符串索引器可以适应不同分类变量的数据类型和范围,通过调整索引映射来平衡模型的训练和评估。

然而,字符串索引器的缺点是它可能会将相似但不完全相同的分类变量映射到不同的整数索引,导致模型性能下降。在某些情况下,可以考虑使用其他数据预处理方法(如词嵌入和one-hot编码)来处理分类变量和数值变量的混合数据类型。

在实际应用中,字符串索引器通常与其他数据预处理方法(如特征缩放和特征选择)和机器学习模型(如逻辑回归、决策树和神经网络)结合使用,以提高模型的性能。在处理分类变量和数值变量的混合数据类型时,需要根据实际需求选择合适的数据预处理方法。

字符串索引器 #

StringIndexer 将输入的一列或多列(字符串/数值)映射到一列或多列索引输出列(整数值)。当且仅当它们对应的输入列相同时,两个数据点的输出索引相同。索引位于 [0,numDistinctValuesInThisColumn] 中。

IndexToStringModel 使用 StringIndexer 计算的模型数据将输入索引列转换为字符串列。它是 StringIndexerModel 的反向操作。

Input Columns #

编辑

添加图片注释,不超过 140 字(可选)

Output Columns #

编辑

添加图片注释,不超过 140 字(可选)

字符串/数值的索引。

Parameters #

编辑切换为居中

添加图片注释,不超过 140 字(可选)

编辑

添加图片注释,不超过 140 字(可选)

编辑切换为居中

添加图片注释,不超过 140 字(可选)

编辑

添加图片注释,不超过 140 字(可选)

'arbitrary' 表示任意顺序。

'frequencyDesc' 表示频率降序。

'frequencyAsc' 表示频率升序。

'alphabetDesc' 表示字典顺序降序。

'alphabetAsc' 表示字典顺序升序。

Java

import org.apache.flink.ml.feature.stringindexer.StringIndexer;

import org.apache.flink.ml.feature.stringindexer.StringIndexerModel;

import org.apache.flink.ml.feature.stringindexer.StringIn

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值