当前位置: 首页 > 科技观察

初学者TensorFlow机器学习:如何实现线性回归?

时间:2023-03-19 16:50:22 科技观察

TensorFlow入门篇:没人能看懂的TensorFlow入门还记得小学时上过的科学课吗?也许是不久前,谁知道呢——也许你还在上小学,但早就开始了你的机器学习之旅。无论哪种方式,无论是生物、化学还是物理,分析数据的常用技术是使用图表来查看一个变量的变化如何影响其他变量。假设您想绘制降雨频率和作物产量之间的相关性。您可能会观察到农业生产力随着降雨量的增加而增加。通过为这些数据拟合一条线,您可以预测不同降雨条件下的农业生产力。如果你能从几个数据点中发现隐式函数关系,那么你就可以使用这个学到的函数来预测未知数据的值。回归算法研究如何最好地拟合总结数据的曲线。它是最强大和研究最多的一类监督学习算法。在回归中,我们试图通过找到可能生成数据的曲线来理解数据。通过这样做,我们找到了对给定数据散布分布的解释。最佳拟合曲线给出了一个模型来解释数据集是如何生成的。在本文中,您将学习如何使用回归来解决实际问题。你会发现,如果你想拥有最强大的预测器,TensorFlow工具将是正确的选择。基本概念如果你有工具,一切都很容易。我将演示第一个重要的机器学习工具——回归(regression),并给出精确的数学表达式。首先,您在回归中学到的许多技能将帮助您解决您可能遇到的其他类型的问题。阅读本文后,回归将成为您机器学习工具箱中的一个强大工具。假设我们有记录人们每瓶啤酒花费多少的数据。A支付2美元购买1瓶,B支付4美元购买2瓶,C支付6美元购买3瓶。我们想找到一个方程来描述啤酒瓶数如何影响总成本。例如,如果每瓶啤酒售价2美元,则线性方程y=2x可以描述购买特定数量啤酒的成本。当一条线很好地拟合某些数据点时,我们可以认为我们的线性模型表现良好。我们实际上可以尝试多种可能的斜率,而不是选择固定的斜率值2。斜率是参数,得到的方程是模型。在机器学习术语中,最佳拟合曲线的方程来自学习模型的参数。又如,方程y=3x也是一条直线,只是斜率较陡。你可以用任何实数代替这个系数,称这个系数为w,方程仍然是一条直线:y=wx。图1显示了更改参数w如何影响模型。我们将以这种方式生成的所有方程的集合表示为M={y=wx|w∈?}。这个集合表示“满足y=wx的所有方程式,其中w是实数”。图1图1:参数w的不同值代表不同的线性方程组。所有这些线性方程的集合构成了线性模型M。M是所有可能模型的集合。每个选择的w值都会生成一个候选模型M(w):y=wx。用TensorFlow编写的回归算法将迭代收敛到更好的模型参数w。我们称最佳参数w*和最佳拟合方程为M(w*):y=w*x。本质上,回归算法试图设计一个将输入映射到输出的函数(我们称之为f)。函数的定义域是实数向量?d,其取值范围是实数集?。函数的输入可以是连续的或离散的。但是,输出必须是连续的,如图2所示。图2.图2:回归算法旨在产生连续输出。输入可以是离散的或连续的。这种区别很重要,因为离散输出值更适合分类问题,我们将在下一章讨论。作为旁注,回归预测连续输出,但有时这是矫枉过正。有时我们只想预测一个离散的输出,例如0或1(不产生0和1之间的值)。分类是一种更适合此类任务的技术。我们希望找到与给定数据(即输入/输出数据对)一致的函数f。不幸的是,可能的功能是无限的,所以我们不能一一尝试。选择太多通常不是一件好事。需要缩小我们将要处理的所有功能。例如,如果我们只寻找适合数据的直线(而不是曲线),搜索就会容易得多。练习1:有多少个函数可以将10个整数映射到10个整数?例如,设f(x)是一个函数,其输入变量为数字0到9,输出为数字0到9。例如,模拟其输入的恒等函数,例如f(0)=0,f(1)=1,依此类推。还有多少其他功能?答案:10^10=10000000000如何判断回归算法是否有效?假设我们正在向一家房地产公司出售房地产市场预测算法。该算法能够根据一些家庭属性(例如卧室数量和公寓大小)来预测房产的价格。房地产公司可以使用房价信息轻松赚取数百万美元,但他们需要一些证据证明该算法有效,然后才能购买。衡量训练算法成功与否的重要指标有两个:方差和偏差。方差反映了预测值对训练集的敏感性(波动)。理想情况下,我们希望训练集的选择对结果影响不大——这意味着需要更小的方差值。偏差表示训练集假设的置信度。过多的假设可能难以概括,因此也需要较小的偏差值。一方面,过于灵活的模型可能会导致模型不小心记住了训练集,而不是发现有用的模式特征。您可以想象一个曲线函数无误地遍历数据集的每个点。如果发生这种情况,我们就说学习算法过度拟合了训练数据。在这种情况下,最佳拟合曲线将很好地拟合训练数据;然而,当使用测试集进行评估时,结果可能会很差(见图3)。图3图3:理想情况下,最佳拟合曲线应用于训练集和测试集。但是,如果我们看到测试集比训练集表现更好,那么我们的模型就有可能欠拟合。相反,如果它在测试集上表现不佳,但在训练集上表现良好,那么我们的模型就过拟合了。另一方面,不太灵活的模型对未知测试数据的泛化效果更好,但在训练集上表现不佳。这种情况称为欠拟合。过于灵活的模型具有高方差和低偏差,而不灵活的模型具有低方差和高偏差。理想情况下,我们想要一个具有低方差误差和低偏差误差的模型。通过这样做,他们能够推广到未知数据并捕获数据中的规律性。有关示例,请参见图4。图4.数据欠拟合和过拟合的示例。具体来说,模型的方差是衡量响应波动的程度,而偏差是响应与实际数据的差异程度。最后,您希望您的模型准确(低偏差)和可重现(低方差)。练习2:假设我们的模型是M(w):y=wx。如果权重w的值必须是0-9之间的整数,那么有多少种可能的函数?答:只有10种情况,即{y=0,y=x,y=2x,...,y=9x}。为了评估机器学习模型,我们将数据集分成两组:训练集和测试集。训练集用于学习模型,测试集用于评估性能。有许多可能的权重参数,但我们的目标是找到最适合数据的权重。衡量“最适合”的方法是定义成本函数。线性回归允许我们使用模拟数据执行线性回归。创建一个名为regression.py的Python源文件并初始化数据,如清单1所示。代码将产生类似于图5的输出。清单1:可视化原始输入importnumpyasnp//#Aimportmatplotlib.pyplotasplt//#Bx_train=np.linspace(-1,1,101)//#Cy_train=2*x_train+np.random.randn(*x_train.shape)*0.33//#Dplt.scatter(x_train,y_train)//#Eplt.show()//#E#A:导入NumPy包生成初始数据#B:使用matplotlib对数据进行可视化#C:输入值为-101个1到1之间的均匀分布的数字#D:生成输出值,与输入值成正比withnoiseadded#E:使用matplotlib的函数绘制散点图图5.散点图y=x+ε,ε为噪声。现在您可以使用这些数据点来尝试拟合一条直线。在TensorFlow中,你至少需要对你尝试的每个候选参数进行评分。这个分数通常被称为成本函数。成本函数的值越高,模型参数越差。例如,如果最佳拟合线是y=2x,则选择参数值2.01应具有较低的成本函数值,而选择参数值-1应具有较高的成本函数值。此时,我们的问题就变成了最小化成本函数值,如图6所示,TensorFlow试图以一种高效的方式更新参数,最终达到可能的最佳值。更新所有参数的每个步骤称为一个纪元。图6图6:无论哪个参数w,最优的代价函数值都是最小的。成本函数被定义为真实值与模型响应之间误差的范数(范数,可以是2次方,绝对值,3次方...)。最后,通过模型的函数计算响应值。在此示例中,成本函数定义为误差总和。预测x的误差通常计算为实际值f(x)与预测值M(w,x)之间的平方差。因此,成本函数值是实际值与预测值之间的平方差之和,如图7所示。图7.成本函数值是模型响应与真实值之间逐点差异的范数。更新清单1中的代码,参见清单2。此代码定义成本函数并要求TensorFlow运行(梯度下降)优化以找到最佳模型参数。清单2:求解线性回归x_train+np.random.randn(*x_train.shape)*0.33//#CX=tf.placeholder("float")//#DY=tf.placeholder("float")//#Ddefmodel(X,w)//#Ereturntf.multiply(X,w)w=tf.Variable(0.0,name="weights")//#Fy_model=model(X,w)//#Gcost=tf.square(Y-y_model)//#Gtrain_op=tf.train.GradientDescentOptimizer(learning_rate).minimize(cost)//#Hsess=tf.Session()//#Iinit=tf.global_variables_initializer()//#Isess.run(init)//#Ifrepochinrange(training_epochs)://#Jfor(x,y)inzip(x_train,y_train)://#Ksess.run(train_op,feed_dict={X:x,Y:y})//#Lw_val=sess.run(w)//#Msess.close()//#Nplt.scatter(x_train,y_train)//#Oy_learned=x_train*w_val//#Pplt.plot(x_train,y_learned,'r')//#Pplt.show()//#P#A:加载学习算法的TensorFlow包,加载NumPy包设置初始数据,加载matplotlib包可视化数据#B:定义学习算法使用的一些常量,称为超参数#C:InitializeLinear模拟数据#D:设置输入输出节点为占位符,真正的值会传入x_train和y_train#E:定义模型为y=w*x#F:设置权重变量#G:定义成本函数#H:定义将在学习算法的每次迭代中调用的操作#I:设置会话并初始化所有变量#J:多次循环遍历数据集#K:循环遍历中的每个数据数据集#L:更新模型参数以尝试最小化成本函数#M:获取最终参数值#N:关闭会话#O:绘制原始数据#P:绘制最佳拟合线恭喜您使用TensorFlow解决了线性回归问题!此外,只需对清单2稍作修改即可解决回归中的其他问题。整个过程包括使用TensorFlow更新模型参数,如图8所示。图8.学习算法更新模型的参数以最小化给定的成本函数。原文:https://machinelearning.technicacuriosa.com/2017/04/22/machine-learning-with-tensorflow/)》]点此阅读更多本作者好文