人工智能产品测试 | 特征的概念:离散与连续

人工智能产品测试 | 特征的概念:离散与连续
最新回答
佐佐木惠理

2026-02-18 05:41:49

在人工智能产品测试中,特征是构成模型规则的主体,可分为离散特征与连续特征,此外还有时序特征。 具体介绍如下:

  • 离散特征

    定义:可枚举的字段称为离散特征,如职业、爱好、工种等。例如,在信用卡反欺诈场景中,“交易城市”若为可枚举的城市名称列表,则属于离散特征。

    算法处理方式:算法将每个唯一值视为独立特征。例如,用户表中的“职业”字段有100种职业,算法会提取100个独立特征(如老师、学生、程序员等),特征数量固定,但每个特征的值可能随样本变化。

    示例:在信用卡反欺诈场景中,若“交易城市”字段包含北京、上海、广州等可枚举值,则属于离散特征。算法会为每个城市生成独立特征,如“是否北京交易”“是否上海交易”等。

  • 连续特征

    定义:不可枚举的数字字段称为连续特征,如薪水、房价、交易金额等。例如,在信用卡反欺诈场景中,“交易金额”字段为具体数值,属于连续特征。

    算法处理方式:算法将其视为单一特征,特征数量固定为1,但特征值随样本变化。例如,薪水字段在算法中仅提取1个特征,但不同用户的薪水值可能不同。

    示例:在信用卡反欺诈场景中,“交易金额”字段可能包含100元、500元、1000元等连续数值。算法会提取1个特征,其值随交易金额变化。

  • 离散与连续特征的转换

    离散特征连续化:职业等字段可通过算法转换为连续特征。例如,将职业编码为数值(如老师=1,学生=2),但需注意编码方式可能引入人为偏差。

    连续特征离散化:薪水等字段可通过分桶或二值化转换为离散特征。例如:

    二值化:将薪水大于阈值(如5000元)的标记为1,否则为0。

    分桶:将薪水划分为区间(如0-3000元、3001-6000元、6001元以上),每个区间视为独立特征。

    Spark ML示例:

    二值化代码:

    from pyspark.sql import SparkSessionfrom pyspark.ml.feature import Binarizerspark = SparkSession.builder.appName("Binarize").getOrCreate()data = spark.createDataFrame([(0.1,), (2.3,), (1.1,), (4.2,), (2.5,), (6.8,)], ["values"])binarizer = Binarizer(threshold=2.4, inputCol="values", outputCol="features")res = binarizer.transform(data)res.show()输出结果:薪水大于2.4的标记为1.0,否则为0.0。

    分桶代码:

    from pyspark.sql import SparkSessionfrom pyspark.ml.feature import Bucketizerspark = SparkSession.builder.appName("BucketizerExample").getOrCreate()splits = [-float("inf"), -0.5, 0.0, 0.5, float("inf")]data = [(-999.9,), (-0.5,), (-0.3,), (0.0,), (0.2,), (999.9,)]dataFrame = spark.createDataFrame(data, ["features"])bucketizer = Bucketizer(splits=splits, inputCol="features", outputCol="bucketedFeatures")bucketedData = bucketizer.transform(dataFrame)bucketedData.show()输出结果:薪水被划分为4个区间(如-∞到-0.5、-0.5到0.0等),每个区间对应独立特征。
  • 时序特征

    定义:需从多行数据中计算的特征,反映一段时间内的数据特性,如用户过去一周的单笔最大消费额。

    提取方法:通过窗口函数计算多行数据的统计量(如最大值、平均值)。例如,在Spark中可使用Window函数按性别分组,并计算年龄排序后的累计最大消费额。

    示例代码:

    from pyspark import SparkContext, SparkConf, SQLContextfrom pyspark.sql import functions as Ffrom pyspark.sql.window import Windowconf = SparkConf().setMaster("local").setAppName("My App")sc = SparkContext(conf=conf)sqlContext = SQLContext(sc)dicts = [['frank','男', 16, '程序员', 3600], ['alex','女', 26, '项目经理', 3000], ['frank','男', 16, '程序员', 2600]]rdd = sc.parallelize(dicts, 3)dataf = sqlContext.createDataFrame(rdd, ['name','gender', 'age', 'title', 'price'])windowSpec = Window.partitionBy(dataf.gender).orderBy(dataf.age).rowsBetween(Window.unboundedPreceding, Window.currentRow)dataf.withColumn('max_price', F.max(dataf.price).over(windowSpec)).show()输出结果:按性别分组后,计算每个用户年龄排序下的累计最大消费额(如男性用户frank的最大消费额为3600元)。