数据特征分析

    xiaoxiao2023-10-05  156

    数据特征分析

     特征分布分析

     对比分析

     统计量分析

     特征一般指用于模型训练的变量,原始数据中的特征有些是数值,格式信息,但在进行机器学习前,都需要转换为数值。根据实际情况,有些是字符或其他有时需要根据已有特征生成或衍生出新特征,如根据用户年龄衍生出表示老、中、青的新特征;有时需要对一些特征进行规范化、标准化等转换,尤其是回归类模型。

    一、特征分布分析

     特征的分布分析有助于发现相关数据的分布特征、分布类型、分布是否对称等,使用数据可视化方法,这样便于直观发现特征的异常值。下面以用户信息数据为例,

    1.1、分析用户的年龄特征

    from pyspark import Row from pyspark.sql import SparkSession import pandas as pd import matplotlib.pyplot as plt spark = SparkSession.builder.appName("test01") \ .getOrCreate() sc = spark.sparkContext def test(): userrdd = sc.textFile("hdfs://192.168.179.14:8020/mlDataSet/ml-100k/u.user") \ .map(lambda line: line.split("|")) # 利用反射机制, 将RDD转为DataFrame df = userrdd.map(lambda fields: Row(userid=fields[0], age=int(fields[1]), gender=fields[2], occupation=fields[3], zip=fields[4])) schemauser = spark.createDataFrame(df) schemauser.createOrReplaceTempView("user") # schemauser.describe("userid", "age", "gender", "occupation", "zip").show() age = spark.sql("SELECT age FROM user") ages = age.rdd.map(lambda p: p.age).collect() plt.figure() # 绘制用户年龄分布图 plt.hist(ages, bins=20, color='lightblue', density=False, alpha=0.5) plt.show() 每个字段的统计信息 schemauser.describe("userid", "age", "gender", "occupation", "zip").show() +-------+-----------------+-----------------+------+-------------+------------------+ |summary| userid| age|gender| occupation| zip| +-------+-----------------+-----------------+------+-------------+------------------+ | count| 943| 943| 943| 943| 943| | mean| 472.0|34.05196182396607| null| null| 50868.78810810811| | stddev|272.3649512449549|12.19273973305903| null| null|30891.373254138158| | min| 1| 7| F|administrator| 00000| | max| 99| 73| M| writer| Y1A6B| +-------+-----------------+-----------------+------+-------------+------------------+

    用户年龄特征分布

    1.2、分析用户职业分布特征

    def test(): userrdd = sc.textFile("hdfs://192.168.179.14:8020/mlDataSet/ml-100k/u.user") \ .map(lambda line: line.split("|")) # 利用反射机制, 将RDD转为DataFrame df = userrdd.map(lambda fields: Row(userid=fields[0], age=int(fields[1]), gender=fields[2], occupation=fields[3], zip=fields[4])) schemauser = spark.createDataFrame(df) schemauser.createOrReplaceTempView("user") plt.figure() # 用户职业特征分布 count_occp = spark.sql("SELECT occupation, COUNT(occupation) as cnt FROM user " "GROUP BY occupation order by cnt DESC") count_occp.show(5) x_axis = count_occp.rdd.map(lambda p: p.occupation).collect() y_axis = count_occp.rdd.map(lambda p: p.cnt).collect() import numpy as np pos = np.arange(len(x_axis)) width = 1.0 # 隐式增加一个figure, 或为当前figure新增一个axes ax = plt.axes() ax.set_xticks(pos + (width / 2)) # 设置x轴的刻度 ax.set_xticklabels(x_axis) # 为对应刻度打上标签 plt.bar(pos, y_axis, width, color='orange') plt.xticks(rotation=30) # x轴上的标签旋转30度 fig = plt.gcf() # 获取当前figure应用 fig.set_size_inches(16, 10) # 设置figure的大小 plt.show()

     从下图所示的用户职业分布图可以看出,学生占绝大多数,其次是其他职业从业者、 教育工作者、管理者、工程师等。医生、家庭主妇或许平时较忙,故数量比较少。

    二、特征分布及相关性分析

     在数据探索阶段分析特征分布、特征间的相关性等,将为后续的特征选择、特征提取 将提供重要依据。

    最新回复(0)