1. 您的位置:首页 > seo技术 >内容

这是我使用Python使用电子商务数据集构建回归模型的方法

Python的编程语言因其易于使用来自动执行日常例行任务而在SEO中越来越流行。 它可以节省时间并产生一些有趣的机器学习来解决更重要的问题,最终可以帮助您的品牌和职业发展。 除了自动化之外,本文还将为那些想进一步了解数据科学以及Python如何提供帮助的人提供帮助。

在下面的示例中,我使用电子商务数据集来构建回归模型。 我还将解释如何确定模型是否显示出具有统计意义的任何内容,以及离群值如何使您的结果倾斜。

我使用Python 3和Jupyter Notebooks在Kaggle数据上进行线性回归生成图和方程。 我检查了相关性,并使用此数据集构建了基本的机器学习模型。 通过此设置,我现在有了一个方程式来预测目标变量。

在构建模型之前,我想回过头来提供一个易于理解的线性回归定义,以及为什么它对分析数据至关重要。

什么是线性回归?

线性回归是一种基本的机器学习算法,用于基于其他自变量之间的线性关系来预测变量。 让我们看一个简单的线性回归图:

如果您知道此处的方程,则还可以知道y值相对于x值。 ``a''是``x''的系数,也是直线的斜率,``b''是截距,这意味着x = 0时b = y。

我的电子商务数据集

我使用了Kaggle的数据集。 它不是非常复杂或详细的,但足以研究线性回归概念。

如果您是新手,并且以前没有使用Jupyter Notebook,那么这里有个快速提示:

  • 启动终端并输入以下命令: jupyter notebook

输入后,此命令将使用新笔记本自动启动默认的Web浏览器。 点击新建和Python 3。

现在该使用一些精美的Python代码了。

  • 导入库

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_absolute_error
import stat**odels.api as **
from stat**odels.tools.eval_measures import mse, rmse
import seaborn as sns
pd.options.display.float_format = '{:.5f}'.format
import warnings
import math
import scipy.stats as stats
import scipy
from sklearn.preprocessing import scale
warnings.filterwarnings('ignore')

  • 读取数据

df = pd.read_csv("Ecom_Customers.csv")
df.head()

我的目标变量将是“年度支出” ,我将尝试查找其与其他变量之间的关系。 如果我可以说用户花了这么多钱,那真是太好了,例如,如果将“应用程序时间”再增加1分钟,就会花费很多。 这是研究的主要目的。

  • 探索性数据分析

首先让我们检查相关热图:

df_kor = df.corr()
plt.figure(figsize=(10,10))
sns.heatmap(df_kor, vmin=-1, vmax=1, cmap="viridis", annot=True, linewidth=0.1)

此热图通过为每个变量赋予从-1到+1的权重来显示它们之间的相关性。

紫色表示负相关,黄色表示正相关,接近1或-1意味着您有有意义的东西,对其进行分析。 例如:

  • 会期长度与“年度花费”呈正相关且高度相关 (81%)
  • App上的时间也具有相关性,但不像会员长度那样强大 (50%)

让我们详细了解这些关系。 我最喜欢的情节是sns.pairplot 。 仅一行代码,您将看到所有分布。

sns.pairplot(df)

该图表显示了每个变量之间的所有分布,并为您绘制了所有图表。 为了了解它们包括哪些数据,请检查左轴和下轴的名称。 (如果它们相同,您将看到一个简单的分布条形图。)

查看最后一行针对其他变量的“年度支出”(我的目标在左轴上)图。

会员资格的长度具有真正完美的线性关系,这一点非常明显,如果我可以提高客户忠诚度,他们将花费更多! 但是多少钱? 是否有任何数字或系数可以指定? 我们可以预测吗? 我们会想到办法的。

  • 检查缺失值

在构建任何模型之前,应检查数据集中是否有空单元格。 由于许多机器学习算法都不支持这些NaN值,因此无法继续使用这些NaN值。

这是我的代码,以查看缺少的值:

df.isnull().sum()

isnull()检测NaN值,并且sum()对它们进行计数。

我没有NaN值,这很好。 如果有的话,我应该把它们装满或放下。

例如,要删除所有NaN值,请使用以下命令:

df.dropna(inplace=True)

要填充,可以使用fillna():

df["Time on App"].fillna(df["Time on App"].mean(), inplace=True)

我的建议是阅读这篇很棒的文章,介绍如何处理数据集中的缺失值。 这是另一个要解决的问题,如果有的话,需要使用不同的方法。

建立线性回归模型

到目前为止,我已经详细研究了数据集并熟悉了它。 现在是时候创建模型了,看看我是否可以预测年度支出。

让我们定义X和Y。首先,我将所有其他变量添加到X中,然后分析结果。

Y=df["Yearly Amount Spent"]

X=df[[ "Length of Membership", "Time on App", "Time on Website", 'Avg. Session Length']]

然后,我将数据集分为训练和测试数据,这意味着我将随机选择20%的数据并将其与训练数据分开。 (test_size显示测试数据的百分比– 20%)(如果未在代码中指定random_state ,则每次运行(执行)代码时,都会生成一个新的随机值,训练和测试数据集将具有每次都有不同的值。)

X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size = 0.2, random_state = 465)

print('Training Data Count: {}'.format(X_train.shape[0]))
print('Testing Data Count: {}'.format(X_test.shape[0]))

现在,让我们构建模型:

X_train = **.add_constant(X_train)
results = **.OLS(y_train, X_train).fit()
results.summary()

了解模型的输出:这是否具有统计意义?

那么所有这些数字实际上意味着什么?

在继续之前,最好在这里解释这些基本统计术语,因为我将通过查看这些数字来确定我的模型是否足够。

  • p值是多少?

P值或概率值显示统计意义。 假设您有一个假设,即品牌关键字的平均点击率是70%或更高,而其p值为0.02。 这意味着您有2%的可能性看到品牌关键字的点击率低于%70。 在统计上有意义吗? 最大限制(95%置信水平)通常使用0.05,因此,如果p值小于0.05,是的! 这很重要。 p值越小,结果越好!

现在让我们看一下汇总表。 我的4个变量具有一些p值,表明它们与“年度支出”之间的关系是重要的还是无关紧要的。 如您所见, “网站停留时间”在统计上并不重要,因为其p值为0.180。 因此最好将其删除。

  • 什么是R平方和调整后的R平方?

R square是一个简单但功能强大的指标,它显示了模型解释了多少方差。 它计算您在X中定义的所有变量,并给出一定百分比的解释。 就像您的模型功能一样。

调整后的R平方也类似于R平方,但它仅统计具有统计意义的变量。 这就是为什么最好一直查看调整后的R平方的原因。

在我的模型中,可以解释98.4%的方差,这确实很高。

  • 什么是Coef?

它们是变量的系数,为我们提供了模型的方程式。

这样结束了吗? 没有! 我的模型中的“网站停留时间”变量在统计上不重要。

现在,我将构建另一个模型并将“网站时间”放到变量中:

X2=df[["Length of Membership", "Time on App", 'Avg. Session Length']]
X2_train, X2_test, y2_train, y2_test = train_test_split(X2, Y, test_size = 0.2, random_state = 465)

print('Training Data Count:', X2_train.shape[0])
print('Testing Data Count::', X2_test.shape[0])

X2_train = **.add_constant(X2_train)

results2 = **.OLS(y2_train, X2_train).fit()
results2.summary()

R平方仍然很好,并且我没有p值高于0.05的变量。

让我们在这里查看模型图:

X2_test = **.add_constant(X2_test)

y2_preds = results2.predict(X2_test)

plt.figure(dpi = 75)
plt.scatter(y2_test, y2_preds)
plt.plot(y2_test, y2_test, color="red")
plt.xlabel("Actual Scores", fontdict=ex_font)
plt.ylabel("Estimated Scores", fontdict=ex_font)
plt.title("Model: Actual vs Estimated Scores", fontdict=header_font)
plt.show()

好像我预测值真的很好! 实际分数和预测分数几乎具有完美的线性关系。

最后,我将检查错误。

  • 失误

在构建模型时,比较模型并确定哪个模型更好是至关重要的一步。 您应该测试很多东西,然后分析摘要。 删除一些变量,对其求和或相乘,然后再次进行测试。 完成一系列分析后,您将检查p值,误差和R平方。 最好的模型将具有:

  • P值小于0.05
  • 错误较小
  • 较高的R平方

现在让我们看一下错误:

print("Mean Absolute Error (MAE) : {}".format(mean_absolute_error(y2_test, y2_preds)))
print("Mean Squared Error (MSE) : {}".format(mse(y2_test, y2_preds)))
print("Root Mean Squared Error (RMSE) : {}".format(rmse(y2_test, y2_preds)))
print("Root Mean Squared Error (RMSE) : {}".format(rmse(y2_test, y2_preds)))
print("Mean Absolute Perc. Error (MAPE) : {}".format(np.mean(np.abs((y2_test - y2_preds) / y2_test)) * 100))

如果您想知道MSE,RMSE或MAPE是什么,可以阅读本文。

它们都是错误的不同计算方式,现在,在比较不同模型时,我们将只关注较小的错误。

因此,为了将我的模型与另一个模型进行比较,我将再创建一个模型,其中包括会员资格的长度和仅在应用程序上的时间

X3=df[['Length of Membership', 'Time on App']]
Y = df['Yearly Amount Spent']
X3_train, X3_test, y3_train, y3_test = train_test_split(X3, Y, test_size = 0.2, random_state = 465)

X3_train = **.add_constant(X3_train)

results3 = **.OLS(y3_train, X3_train).fit()
results3.summary()

X3_test = **.add_constant(X3_test)
y3_preds = results3.predict(X3_test)

plt.figure(dpi = 75)
plt.scatter(y3_test, y3_preds)
plt.plot(y3_test, y3_test, color="red")
plt.xlabel("Actual Scores", fontdict=eksen_font)
plt.ylabel("Estimated Scores", fontdict=eksen_font)
plt.title("Model Actual Scores vs Estimated Scores", fontdict=baslik_font)
plt.show()

print("Mean Absolute Error (MAE)
: {}".format(mean_absolute_error(y3_test, y3_preds)))
print("Mean Squared Error (MSE) : {}".format(mse(y3_test, y3_preds)))
print("Root Mean Squared Error (RMSE) :
{}".format(rmse(y3_test, y3_preds))) print("Mean Absolute Perc. Error (MAPE) :
{}".format(np.mean(np.abs((y3_test - y3_preds) / y3_test)) * 100))

哪一个最好?

如您所见,最后一个模型的错误高于第一个模型的错误。 调整后的R平方也会减小。 如果误差较小,那么我们可以说最后一个误差更好-与R平方无关。 最终,我们选择较小的误差和较高的R平方。 我刚刚添加了第二个模型,以向您展示如何比较模型并确定哪个模型最好。

现在我们的模型是这样的:

每年花费= -1027.28 + 61.49x(会员资格)+ 38.76x(申请时间)+ 25.48x(平均会期长度)

这意味着,例如,如果我们可以将会员资格的年限增加一年,并保持所有其他功能不变,那么一个人将花费61.49美元!

高级技巧:离群值和非线性

当您处理真实数据时,通常情况并不那么容易。 为了找到线性或更准确的模型,您可能需要做其他事情。 例如,如果您的模型不够准确,请检查异常值。 有时,离群值可能会误导您的结果!

资料来源:http://r-statistics.co/Outlier-Treatment-With-R.html

除此之外,有时您会得到曲线而不是直线,但是您会发现变量之间也存在关系!

然后,您应该考虑使用对数或平方来转换变量。

这是让您决定使用哪个技巧的技巧:

资料来源:https://courses.lumenlearning.com/boundless-algebra/chapter/graphs-of-exponential-and-logarithmic-functions/

例如,在第三张图中,如果您有一条与绿色相似的线,则应考虑使用对数以使其线性!

有很多事情要做,因此测试所有这些真的很重要。

结论

如果您喜欢玩数字游戏并提高数据科学技能,请学习Python。 这不是一种很难学习的编程语言,并且使用它生成的统计信息会对您的日常工作产生巨大的影响。

Google Analytics(分析),Google Ads,Search Console…使用这些工具已经可以提供大量数据,如果您知道准确处理数据的概念,您将从中获得非常有价值的见解。 您可以创建更准确的流量预测,或分析Google Analytics(分析)数据,例如跳出率,页面停留时间及其与转化率之间的关系。 在一天结束时,可能可以预测品牌的未来。 但这只是几个例子。

如果您想进一步进行线性回归,请检查我的Google Page Speed Insights OLS模型。 我已经建立了自己的数据集,并试图根据速度指标(例如FCP(第一内容油漆),FMP(第一有意义油漆)和TTI(互动时间))来预测计算。

最后,混合数据,尝试找到相关性并预测目标。 哈姆雷特·巴蒂斯塔(Hamlet Batista)撰写了一篇有关实用数据融合的精彩文章。 在建立任何回归模型之前,我强烈建议您这样做。


本文表达的观点是来宾作者的观点,不一定是Search Engine Land。 工作人员作者在此处列出。

本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。如若转载,请注明出处:http://www.botadmin.cn/sylc/10274.html