探索性数据分析
原文档(Docs)只简单给出了不同type类型对应target的柱状图和id为00037f39cf的按dt为序列关于target的折线图,这只能分析出整个数据集的部分特征,对于模型选择的参考性有限,因此在原文档的基础上,我尝试进行了一些统计学数据分析,并进行更全面的数据集的特征的可视化来帮助我们进行模型选择。
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
df = pd.read_csv('train.csv')
# 显示数据集的前几行,以了解数据结构
print(df.head())
# 基本的统计分析
print(df.describe())
# 检查是否有缺失值
print(df.isnull().sum())
# 可视化分析
# 1. 房屋类型的分布
plt.figure(figsize=(10, 6))
sns.countplot(x='type', data=df)
plt.title('Distribution of House Types')
plt.show()
# 2. 不同类型房屋的电力消耗
plt.figure(figsize=(10, 6))
sns.boxplot(x='type', y='target', data=df)
plt.title('Electricity Consumption by House Type')
plt.show()
# 3. 电力消耗随日期变化的趋势
plt.figure(figsize=(10, 6))
sns.lineplot(x='dt', y='target', data=df)
plt.title('Trend of Electricity Consumption Over Time')
plt.show()
# 4. 电力消耗的箱型图,以查看异常值
plt.figure(figsize=(10, 6))
sns.boxplot(y='target', data=df)
plt.title('Box Plot of Electricity Consumption')
plt.show()
# 5. 电力消耗与房屋类型的关联图
plt.figure(figsize=(10, 6))
sns.scatterplot(x='type', y='target', data=df)
plt.title('Scatter Plot of Electricity Consumption vs House Type')
plt.show()
# 6.均值
grouped_data = df.groupby(['dt', 'type'])['target'].mean().reset_index()
print(grouped_data)
plt.figure(figsize=(12, 8))
for type_name, group in grouped_data.groupby('type'):
plt.plot(group['dt'], group['target'], label=type_name)
plt.title('Average Electricity Consumption by Day and House Type')
plt.xlabel('Day')
plt.ylabel('Average Electricity Consumption')
plt.legend()
plt.show()
得到的结果是
从这些数据中我们可以知道:
-
描述性统计:
count
: 有大约287万7305个数据点。mean
: 平均电力消耗大约为32.22千瓦时。std
: 标准差为50.36,表明数据分布有较大的变异性。min
: 最小电力消耗为-0.613千瓦时,这可能是一个异常值或数据错误。25%
,50%
,75%
: 分别为13.32 kWh, 22.35 kWh, 34.44 kWh,显示了电力消耗的中位数和四分位数。max
: 最大电力消耗为1191.68 kWh,这可能也是一个异常值。
-
相关性矩阵:
dt
和type
之间的相关系数为-0.00848,非常接近于0,表明这两个变量几乎不相关。type
和target
之间的相关系数为0.44203,表明这两个变量之间存在中等程度的正相关性。dt
和target
之间的相关系数为0.01877,表明这两个变量之间存在非常弱的正相关性。
此外我们对一些可能存在关联的数据之间绘制了一些统计学图像:
从这些图表中我们可以发现电力消耗与房屋类型大致呈线性关系;房屋类型值较大的房屋数量很少,房屋类型集中在1~7的类型区间内;用电曲线随着时间增大,呈现一定的周期性;房屋类型对于用电量影响非常大。这些数据对于模型选择提供了一定的参考。
探索性特征工程
数据清洗
在原文档中,直接构建了历史平移特征和窗口统计特征,这存在一定的风险,因为:数据分析过程中,我们发现有一些房屋的用电量为负值,这显然是异常值,会对特征工程的构建产生负面影响。因此我们采取插值法,用平均值去代替这些异常值。
import pandas as pd
# 计算每种房屋类型的target均值
type_means = df.groupby('type')['target'].mean()
# 遍历DataFrame,替换target中的负值为对应类型的均值
for index, row in df.iterrows():
if row['target'] < 0:
df.at[index, 'target'] = type_means[row['type']]
# 显示结果
print(df)
特征编码
数据中的type已经为整数类型,在这里不再做处理。
特征工程构建
历史平移特征(Historical Shift Feature)
历史平移特征是一种基于过去观察值的特征,通常用于捕捉时间序列中的长期趋势或季节性模式。这种特征的创建方法如下:
- 平移:将时间序列的当前值与其历史值进行比较,比如,你可以将当前值与前一时间点的值、前一周的值或前一个月的值进行比较。
- 特征类型:可以创建多种类型的平移特征,例如:
- 滞后特征:当前值与前n个时间单位的值。
- 变化率:当前值与前一时间单位的值的差分或百分比变化。
- 累积和:从当前时间点向前累积的总和。
- 移动平均:当前值相对于过去一段时间内的平均值。
历史平移特征有助于模型识别和学习时间序列中的长期依赖关系。
窗口统计特征(Window Statistics Feature)
窗口统计特征是基于时间窗口内的数据点来计算的统计量,用于捕捉时间序列中的局部模式或短期动态。这种特征的创建方法如下:
- 窗口选择:定义一个时间窗口,这个窗口可以是固定的,也可以是滑动的。
- 统计量计算:在选定的窗口内计算各种统计量,例如:
- 平均值:窗口内所有数据点的平均值。
- 中位数:窗口内所有数据点的中位数。
- 最大值/最小值:窗口内数据点的最大值或最小值。
- 标准差:窗口内数据点的标准差,反映波动性。
- 方差:窗口内数据点的方差。
- 偏度:窗口内数据点分布的偏斜程度。
- 峰度:窗口内数据点分布的尖锐程度。
窗口统计特征有助于模型捕捉时间序列中的局部波动和异常值。
应用场景
- 历史平移特征:适用于需要理解长期趋势和季节性影响的场景,如股票价格预测、销售预测等。
- 窗口统计特征:适用于需要快速响应短期变化的场景,如实时监控系统、短期需求预测等。
综合前面的数据分析,我认为历史平移特征是一种更佳的选择。