目录
1.数据读取
2.数据清洗
3.数据重构
4.建模预测提交
5.总结
比赛的基本流程由四个部分组成:
数据读取、数据清洗、数据重构、建模预测提交
导包:
import numpy as np
import pandas as pd
import pandas_profiling as ppf
import joblib # 模型的保存
import matplotlib.pyplot as plt
import seaborn as sns
import warnings
warnings.filterwarnings("ignore") # 关闭警告模块
train = pd.read_csv("competitive-data-science-predict-future-sales/sales_train.csv") # 训练集
test = pd.read_csv("competitive-data-science-predict-future-sales/test.csv") # 测试集
shops = pd.read_csv("competitive-data-science-predict-future-sales/shops.csv") # 商品集
items = pd.read_csv("competitive-data-science-predict-future-sales/items.csv")
items_categories = pd.read_csv("competitive-data-science-predict-future-sales/item_categories.csv")
print("-" * 50)
print(train.head())
print("-" * 50)
print(test.head())
print("-" * 50)
print(shops.head())
print("-" * 50)
print(items.head())
print("-" * 50)
print(items_categories.head())
print("-" * 50)
# 检查维度
print("Shape of train:", train.shape)
print("Shape of test:", test.shape)
print("Shape of shops:", shops.shape)
print("Shape of items:", items.shape)
print("Shape of items_categories:", items_categories.shape)
数据清洗的一般流程主要有两个操作:一是删除异常值,二是填补缺失值。【下面的代码是删除异常值】
# 先对每日销售的产品数量进行修改
train = train[train.item_cnt_day < 1001]
train = train[train.item_cnt_day > 0]
# 再对产品的销售价格进行修改
train = train[train.item_price < 250000]
train = train[train.item_price > 1]
先把训练数据的date列改为标准的格式:
train["date"] = pd.to_datetime(train["date"], format="%d.%m.%Y")
将数据转换为月度销售数据:
%%time
# 制作仅包含月度销售数据的数据集 [分组]
data = train.groupby([train["date"].apply(lambda x:x.strftime("%Y-%m")),"item_id","shop_id"]).sum().reset_index()
# 指定我们要添加到的数据的重要属性
data = data[["date", "item_id", "shop_id", "item_cnt_day"]]
# 最后,我们可以从数据集中选择重要的特定属性
data = data.pivot_table(index=["item_id", "shop_id"], columns="date", values="item_cnt_day", fill_value=0).reset_index()
print(data.shape)
print(data.head())
print("-" * 50)
print(data.head())
print("-" * 50)
print(data)
# 目的是把每一个月的数据放到一起
训练集应该和测试集变成相同的格式:
未处理前的测试数据:
处理后的测试数据:
# 将数据进行组合
test = pd.merge(test, data, on = ["item_id", "shop_id"], how = "left")
# 将空值填充为0
test.fillna(0, inplace=True)
# 看一下这个数据集
test.head()
接下来创建实际的训练集:
# 现在创建实际的训练集
x_train = test.drop(["2015-10", "item_id", "shop_id"], axis = 1) # 和提交格式有关
y_train = test["2015-10"]
# 删除第一列,以便于预测未来的销售数据
x_test = test.drop(["2013-01", "item_id", "shop_id"], axis = 1) # 保持和训练集一样特征数
# 检查一下数据的维度
print("Shape of x_train:", x_train.shape)
print("Shape of x_test:", x_test.shape)
print("Shape of y_train:", y_train.shape)
看一下训练数据的特征值:
看一下训练数据的目标值:
看一下测试集的特征值:
先进行模型的构建,训练后保存模型为GBR2.pkl。
%%time
# 用GradientBoostingRegressor进行预测
from sklearn.ensemble import GradientBoostingRegressor
GBR = GradientBoostingRegressor()
GBR.fit(x_train, y_train)
mode2 = GBR.predict(x_test).clip(0,20) # 把预测结果限制在0到20之间
joblib.dump(GBR, "GBR2.pkl") # 模型保存
取出预测值“item_cnt_month”,
mode2 = pd.DataFrame(mode2, columns=["item_cnt_month"])
把预测结果存为submission.csv文件,这个文件就是需要提交到官网的文件。
mode2.to_csv("submission.csv", index_label="ID")
看一下需要提交的数据:
以上的四个部分是比赛的基本流程,可以提交获取一个基本的排名,若要再提升成绩,需要在特征工程和数据增强方面再做努力。