数据特征分析
特征分布分析
对比分析
统计量分析
特征一般指用于模型训练的变量,原始数据中的特征有些是数值,格式信息,但在进行机器学习前,都需要转换为数值。根据实际情况,有些是字符或其他有时需要根据已有特征生成或衍生出新特征,如根据用户年龄衍生出表示老、中、青的新特征;有时需要对一些特征进行规范化、标准化等转换,尤其是回归类模型。
一、特征分布分析特征的分布分析有助于发现相关数据的分布特征、分布类型、分布是否对称等,使用数据可视化方法,这样便于直观发现特征的异常值。下面以用户信息数据为例,
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|
+-------+-----------------+-----------------+------+-------------+------------------+
用户年龄特征分布
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()
从下图所示的用户职业分布图可以看出,学生占绝大多数,其次是其他职业从业者、 教育工作者、管理者、工程师等。医生、家庭主妇或许平时较忙,故数量比较少。
在数据探索阶段分析特征分布、特征间的相关性等,将为后续的特征选择、特征提取 将提供重要依据。