机器学习——零售商品价格预测回归模型

发布时间 2023-09-14 00:11:37作者: 燕返她不返

在电子商务业务蓬勃发展的同时,零售业遭遇了寒潮。电子商务的冲击、瞬息万变的经济环境、难以捉摸的销售情况和日益冷清的大型卖场,都给零售业带来了重重困难。

进入数字时代后,数据的有效使用成为零售企业颠覆传统的动力,也势必将改变零售业的格局。沃尔玛等大型零售商都积极第将数据分析与商业结合,创造了额外的经济收益。

回归,就是根据特征向量来决定对应的输出值。回归树就是将特征空间划分成若干单元,每一个划分单元有一个特定的输出。因为每个结点都是“是”和“否”的判断,所以划分的边界是平行于坐标轴的。对于测试数据,我们只要按照特征将其归到某个单元,便得到对应的输出值。

该数据集一共有8523条样本数据,共有12个数据变量,其中7个离散型变量,5个数值型变量。

data.info()

data

由于离散变量的分布可能不是平均分布的,比如id列,姓名列等,这些对目标变量的影响是无意义的,因此绘制各个特征的分布图,观察其分布比例

由于Item_Identifier的变量统计量过多,没有意义,列Item_Identifier列进行直接删除处理

检查数据中是否存在缺失值

print(data.isnull().sum())

可以看到有两列变量存在缺失值,因此我们决定对缺失值进行直接删除处理

data.describe()

利用describe统计非缺失观测的个数(count)、平均值(mean)、标准差(std)、最小值(min)、下四分位数(25%)、中位数(50%)、上四分位数(75%)和最大值(max)

绘制剩余11个变量的直方图:

直方图是用一系列不等高的长方形来表示数据,宽度表示数据范围的间隔,高度表示在给定间隔内数据出现的频数,长方形的高度跟落在间隔内的数据数量成正比,变化的高度形态反映了数据的分布情况。

colnm = data.columns.tolist()

plt.figure(figsize=(10,8))

for i in range(11):

plt.subplot(4,3,i+1)

data[colnm[i]].hist(bins = 100, color = color[0])

plt.xlabel(colnm[i], fontsize=12)

plt.ylabel('Frequency')

plt.tight_layout()

 

绘制相关系数图:

sns.set_style("dark")

plt.figure(figsize=(10,8))

colnm = data.columns.tolist()

mcorr = data[colnm].corr()

mask = np.zeros_like(mcorr,dtype=np.bool)

mask[np.triu_indices_from(mask)]=True

#cmap = sns.diverging_palette(220,10,as_cmap=True)

g=sns.heatmap(mcorr,mask=mask, square=True,annot=True, fmt='0.2f')

 

观测Item_Fat_Content列的分布情况

plt.figure(figsize=(15,5))

sns.barplot(data['Item_Fat_Content']. value_counts().index,data['Item_Fat_Content'].value_counts().values)

plt.title('Item_Fat_Content')

 

观测Item_Type列的分布情况

plt.figure(figsize=(15,5))

sns.barplot(data['Item_Type']. value_counts().index,data['Item_Type'].value_counts().values)

plt.title('Item_Type')

 

观测Outlet_Identifier列的分布情况

plt.figure(figsize=(15,5))

sns.barplot(data['Outlet_Identifier']. value_counts().index,data['Outlet_Identifier'].value_counts().values)

plt.title('Outlet_Identifier')

 

观测Outlet_Size列的分布情况

plt.figure(figsize=(15,5))

sns.barplot(data['Outlet_Size']. value_counts().index,data['Outlet_Size'].value_counts().values)
plt.title('Outlet_Size')

 

 

观测Outlet_Establishment_Year列的分布情况

plt.figure(figsize=(15,5))

sns.barplot(data['Outlet_Establishment_Year']. value_counts().index,data['Outlet_Establishment_Year'].value_counts().values)

plt.title('Outlet_Establishment_Year')

 

观测Outlet_Location_Type列的分布情况

plt.figure(figsize=(15,5))

sns.barplot(data['Outlet_Location_Type']. value_counts().index,data['Outlet_Location_Type'].value_counts().values)

plt.title('Outlet_Location_Type')

 

观测Outlet_Type列的分布情况

plt.figure(figsize=(15,5))

sns.barplot(data['Outlet_Type']. value_counts().index,data['Outlet_Type'].value_counts().values)

plt.title('Outlet_Type')

 

由于很多类别变量,因此我们需要进行类别编码,选用LabelEncoder进行编码

LabelEncoder 是对不连续的数字或者文本进行编号(连续的会是同一个编号)

将n个类别编码为0~n-1之间的整数(包括0和n-1)

训练集划分

y = data['Item_Outlet_Sales'].values

X = data.drop('Item_Outlet_Sales',axis=1)

X_train, X_test,Y_train, y_test = train_test_split(X,y, test_size=0.2, random_state=125)

 

划分训练集和测试集:

x_train:包括所有自变量,这些变量将用于训练模型,同样,我们已经指定测试_size=0.4,这意味着来自完整数据的60%的观察值将用于训练/拟合模型,其余40%将用于测试模型。

y_train-这是因变量,需要此模型进行预测,其中包括针对自变量的类别标签,我们需要在训练/拟合模型时指定我们的因变量

x_test:这是数据中剩余的40%的自变量部分,这些自变量将不会在训练阶段使用,并将用于进行预测,以测试模型的准确性。

y_test-此数据具有测试数据的类别标签,这些标签将用于测试实际类别和预测类别之间的准确性。

random_state:控制随机状态,固定random_state后,每次构建的模型是相同的、生成的数据集是相同的、每次的拆分结果也是相同的。

回归模型的维度严格要求矩阵形式,因此将其转换为浮点变量

from sklearn.preprocessing import StandardScaler

sc_x= StandardScaler()

Y_train = np.array(Y_train).reshape(-1,1)

y_test = np.array(y_test).reshape(-1,1)

X_train = sc_x.fit_transform(X_train).astype('float32')

Y_train = sc_x.fit_transform(Y_train).astype('float32')

X_test = sc_x.fit_transform(X_test).astype('float32')

y_test = sc_x.fit_transform(y_test).astype('float32')

 

搭建三种回归模型进行训练

决策树是一种基本的分类与回归方法,本文叙述的是回归部分。回归决策树主要指CART算法,内部结点特征的取值为“是”和“否”, 为二叉树结构。

⼀个回归树对应着输入空间(即特征空间)的⼀个划分以及在划分单元上的输出值。分类树中,我们采用信息论中的方法,通过计算选择最佳划分点。

而在回归树中,采用的是启发式的方法。假如我们有n个特征,每个特征有si(i ∈ (1, n))个取值,那我们遍历所有特征, 尝试该特征所有取值,对空间进行划分,直到取到特征 j 的取值 s,使得损失函数最小,这样就得到了⼀个划分点。

岭回归是一种改良的最小二乘估计法,通过放弃最小二乘法的无偏性,以损失部分信息、降低精度为代价获得回归系数,它是更为符合实际、更可靠的回归方法,对存在离群点的数据的拟合要强于最小二乘法。

不同与线性回归的无偏估计,岭回归的优势在于它的无偏估计,更趋向于将部分系数向0收缩。因此,它可以缓解多重共线问题,以及过拟合问题。但是由于岭回归中并没有将系数收缩到0,而是使得系数整体变小,因此,某些时候模型的解释性会大大降低,也无法从根本上解决多重共线问题。

K近邻算法的主要思想是用离测试集数据点最近的训练集点(称为其邻居)的输出来估计测试集数据点的输出,参数K代表用多少个邻居来估计。超参数K通常设置为奇数来防止平局现象。

K近邻算法是一种惰性学习和非参数模型。当训练数据数量庞大,同时你对响应变量和解释变量之间的关系所知甚少时,非参数模型会非常有用。KNN 模型只基于一个假设:互相接近的实例拥有类似的响应变量值。非参数模型提供的灵活性并不总是可取的,当训练数据很缺乏或者你对响应变量和解释变量之间的关系有所了解时,对响应变量和解释变量之间关系做假设的模型就很有用

评价指标采用了mse,最小均方差,它是预测值和真实值残差的绝对值的平均数,最终将其垒和,可以看到,各个模型的残差平方和在个位数,模型效果极佳。