逻辑回归是上个世纪以来流行的方法。它建立了分类变量与一个或多个自变量之间的关系。在机器学习中使用这种关系来预测分类变量的结果。它被广泛应用于许多不同的领域,例如医疗领域、贸易和商业、技术等等。本文描述了二元分类算法的开发过程,并在Kaggle的心脏病数据集上实现了该算法。问题陈述在本文中,我们将使用来自Kaggle的数据集,其中包含人口的健康数据。它的末尾有一列包含一个人是否患有心脏病。我们的目标是使用表中的其他列来查看我们是否可以预测一个人是否患有心脏病。在这里,我将加载数据集。为此,我将使用Pandas:importpandasaspdimportnumpyasnpdf=pd.read_csv('Heart.csv')df.head()数据集如下所示:>Haert.csv数据集的前五行查看数据集的最后一列。它是“AHD”。这表明心脏病。我们将使用剩余的列来预测心脏病。所以在未来,如果我们掌握了所有的数据,就可以在不进行医学检查的情况下预测一个人是否患有心脏病。我们的输出将是0或1。如果一个人有心脏病,我们的算法将返回1;如果一个人没有心脏病,算法应该返回0。重要方程记住线性回归公式。直线的非常基本的公式:Y=A+BX其中A是截距,B是斜率。如果在这个方程中避免“截距”A,则公式变为:Y=BX传统上,在机器学习中,它被按下为这里,“h”是假设或预测值,X是预测变量或输入变量。Theta从一开始就随机初始化,然后更新。对于逻辑回归,我们需要使用sigmoid函数(返回值从0到1)来转换这个简单的假设。Sigmoid函数也可以称为逻辑函数。逻辑回归使用sigmoid函数来预测输出。这是一个sigmoid激活函数:z是输入特征乘以随机初始化的项theta。这里,X是输入特征,theta是将在此算法中更新的随机初始化值。我们需要使用logistic函数的原因是logistic函数的曲线看起来像这样:.由于我们今天要进行二元分类,因此如果逻辑函数返回值小于0.5则返回零,如果逻辑函数返回值大于或等于0.5则返回1。(1)成本函数成本函数可以衡量预测输出(计算的假设“h”)与原始输出(数据集中的“AHD”列)的差异程度。在深入探讨逻辑回归的成本函数之前,我想提醒您,线性回归的成本函数要简单得多。线性回归的成本为:其中,y为原始标签(数据集的“AND”列)平均成本函数为:其中,m为训练数据的数量上式首先考虑预测标签“h”和与原始标签“y”的区别。该公式包括平方以避免任何负值,并使用1/2优化该平方。这个简单的方程适用于线性回归,因为线性回归使用简单的线性方程:(Y=A+BX)。但是逻辑回归使用非线性的S形函数。我们不能在这里使用那个简单的成本函数,因为它不会收敛到全局最小值。为了解决这个问题,我们将使用对数对成本函数进行正则化,使其收敛到全局最小值。这是我们用来保证全局最小值的成本函数:如果y=1,Cost(h,y)=-log(h)Ify=0,Cost(h,y)=-log(1—h)Simplified组合成本函数:这是成本函数表达式:为什么这样的方程式?看,我们只能有两种情况y=0或1。在上面的成本函数等式中,我们有两个条件:y*logh和(1-y)*log(1-h)。如果y=0,则第一项变为零,第二项变为log(1-h)。在等式中,我们在开头放了一个减号。如果y=1,则第二项变为零,只留下开头带有负号的ylogh项。我希望现在有意义!(2)对于梯度下降,我们需要更新随机初始化的theta值。梯度下降方程就是这样做的。如果我们将成本函数与theta部分微分:使用梯度下降公式上方的这个表达式变为:这里,alpha是学习率。使用这个等式,θ的值将在每次迭代中更新。当你在python中实现Thin时,你会更清楚。现在是使用上述所有方程开发算法的时候了模型开发步骤1:建立假设。这个假设只是sigmoid函数的一个实现。defhypothesis(X,theta):z=np.dot(theta,X.T)return1/(1+np.exp(-(z)))-0.0000001由于成本函数0.0000001中的这个表达式,我从这里的输出中扣除:如果假定表达式的结果为1,则表达式的结果将为零的对数。为了缓解这种情况,我最终使用了这个非常小的数字。第2步:确定成本函数。defcost(X,y,theta):y1=假设(X,theta)返回-(1/len(X))*np.sum(y*np.log(y1)+(1-y)*np.log(1-y1))这只是上述成本函数方程的简单实现。第3步:更新theta值。Theta值需要不断更新,直到成本函数达到最小值。我们应该得到最终的theta值和每次迭代的成本作为输出。defgradient_descent(X,y,theta,alpha,epochs):m=len(X)J=[cost(X,y,theta)]foriinrange(0,epochs):h=hypothesis(X,theta)foriinrange(0,len(X.columns)):theta[i]-=(alpha/m)*np.sum((h-y)*X.iloc[:,i])J.append(cost(X,y,theta))returnJ,theta第4步:计算最终预测和准确度使用来自“gradient_descent”函数的theta值并使用sigmoid函数计算最终预测。然后,计算精度。defpredict(X,y,theta,alpha,epochs):J,th=gradient_descent(X,y,theta,alpha,epochs)h=假设(X,theta)foriinrange(len(h)):h[i]=1ifh[i]>=0.5else0y=list(y)acc=np.sum([y[i]==h[i]foriinrange(len(y))])/len(y)returnJ,最终输出acc是每个时期的成本清单和准确性。让我们实现这个模型来解决一个实际问题。数据预处理我已经在开头展示了数据集。但为了方便起见,我在这里再次添加它:请注意,数据集中有一些分类特征。我们需要将它们转换为数值数据。df["ChestPainx"]=df.ChestPain.replace({"typical":1,"asymptomatic":2,"nonanginal":3,"nontypical":4})df["Thalx"]=df.Thal。replace({"fixed":1,"normal":2,"reversable":3})df["AHD"]=df.AHD.replace({"Yes":1,"No":0})是偏差增加一列。这应该是一列,因为任何实数乘以1都将保持不变。df=pd.concat([pd.Series(1,index=df.index,name='00'),df],axis=1)定义输入特征和输出变量。输出列是我们要预测的类别列。输入特征将是除我们之前修改的分类列之外的所有列。X=df.drop(columns=["Unnamed:0","ChestPain","Thal"])y=df["AHD"]得到准确度结果最后初始化列表中的theta值,预测结果并计算准确率。在这里,我正在初始化theta值,比如0.5。它可以初始化为任何其他值。由于每个特征都应该有一个对应的theta值,因此应该为X中的每个特征(包括偏差列)初始化一个theta值。theta=[0.5]*len(X.columns)J,acc=predict(X,y,theta,0.0001,25000)最终准确率为84.85%。我使用0.0001作为学习率并进行25000次迭代。我运行算法几次来确定这一点。请检查下面提供的此项目的我的GitHub链接。“预测”函数还返回每次迭代的成本列表。在一个好的算法中,成本应该在每次迭代中不断降低。绘制每次迭代的成本以可视化趋势。%matplotlibinlineimportmatplotlib.pyplotaspltplt.figure(figsize=(12,8))plt.scatter(range(0,len(J)),J)plt.show()成本一开始下降很快,然后下降速度变慢向下。这是完美成本函数的行为!结论我希望这对你有帮助。如果您是初学者,一开始可能很难掌握所有概念。但我建议您自己在笔记本上运行所有代码并仔细观察输出。这将非常有帮助。这种类型的逻辑回归有助于解决许多现实世界的问题。希望你会用它来开发一些很酷的项目!如果您在运行任何代码时遇到问题,请在评论部分告诉我。在这里你会找到完整的代码:https://github.com/rashida048/Machine-Learning-With-Python/blob/master/LogisticRegressionWithHeartDataset.ipynb
