通过3.1节的学习,我们已经了解了线性回归模型的基本知识。3.1节的示例是一个非常简单的回归任务,模型输入的是连续型数值。但线性模型的能力并不止于此,ChatGPT介绍了两种可以用于分类任务的线性模型——逻辑回归和线性判别分析。下面我们就以逻辑回归为例,研究一下线性模型是如何用于分类任务的。
要学习逻辑回归的相关知识,我们可以让ChatGPT先给我们介绍一些基本概念。在对话框中输入“简要介绍逻辑回归”,会得到如下答复。
ChatGPT逻辑回归是一种广泛使用的统计分析方法,通常用于二元分类问题,即将数据分为两个类别(如是/否、真/假等)。逻辑回归基于线性回归模型,但其输出是一个介于0和1之间的概率值,表示属于某一类的可能性。逻辑回归通过将线性函数的输出映射到概率范围实现这一点。
逻辑回归的主要思想是将输入特征与一组权重相乘,并通过一个名为Sigmoid函数的激活函数将结果映射到0和1之间。在训练过程中,我们优化这些权重以最大化模型对观测数据的似然性。具体来说,我们最小化交叉熵损失函数,该损失函数测量了模型输出的概率与实际标签之间的差异。
逻辑回归具有许多应用,如广告点击预测、信用评分和疾病诊断等。由于简单且有效,逻辑回归已成为机器学习和数据科学中最常用的算法之一。
在上面的答复中,ChatGPT告诉我们:逻辑回归是基于线性回归的模型,并通过Sigmoid函数将结果映射到0和1之间。为了弄清楚Sigmoid函数是什么,我们可以进一步提问。在ChatGPT对话框中输入“用Python代码演示Sigmoid函数,需要可视化,不需要Markdown格式”,ChatGPT会给出如下答复。
ChatGPT以下是Python代码演示的Sigmoid函数,以及其可视化曲线。
该代码使用NumPy库生成100个从-10到10的均匀分布的数据点,并将它们传递给Sigmoid函数以计算对应的y值。然后,使用Matplotlib库将x和y数据点绘制成Sigmoid函数的曲线。
接下来,我们把ChatGPT写的代码粘贴到Jupyter Notebook中,并分段运行。由于我们在Jupyter Notebook中已经导入NumPy库和Matplotlib库,可以忽略这两行代码,直接从下面的代码开始。
上面的代码用于定义一个名为Sigmoid的函数,从代码中我们可以看到,Sigmoid函数的计算公式为
定义好函数后,我们再用下面的代码生成一些数据,并用Sigmoid函数将它们进行转化。
运行上面的代码,我们会得到如图3-3所示的结果。
图3-3 Sigmoid函数曲线
从图3-3可知,代码生成的数据x是在-10到10之间均匀分布的数据,经过Sigmoid函数的转化,被映射到0到1之间。这样我们就可以把转化后数值大于0.5的样本归为一类,而小于0.5的样本归为另一类,也就完成了二分类的任务。
在第2章中,我们进行Wine酒数据集分类的演示时,就用到了逻辑回归模型。为了加深印象,我们可以要求ChatGPT再用一个更简单的例子演示逻辑回归的用法。在ChatGPT对话框中输入“用一个例子演示逻辑回归的用法,要用Python代码”,得到的答复如下。
ChatGPT逻辑回归是一种广泛应用于分类问题的机器学习算法。下面是一个使用逻辑回归进行二分类的例子,代码使用Python语言和scikit-learn库实现。
假设我们有一个数据集,其中包含两个特征,即学生的考试成绩和学生是否被录取(1表示录取,0表示未录取)。我们的目标是通过学生的考试成绩预测他们是否会被录取。
首先,我们需要加载数据集,并将数据集划分为训练集和测试集。
其次,我们使用scikit-learn库中的逻辑回归模型创建一个分类器,并使用训练集拟合该模型。
再次,我们可以使用测试集评估模型的性能,并计算模型的准确度。
最后,我们可以使用模型对新的数据进行预测。
以上就是一个简单的逻辑回归的例子,展示了使用Python和scikit-learn库实现二分类问题的逻辑回归算法。
细心的读者可能会发现,上面的代码使用了一个名叫“admission.csv”的文件作为数据源,但是并没有给出这个文件的下载方式。我们追问ChatGPT“代码中的admission.csv在哪里下载”,得到如下答复。
ChatGPT抱歉,我之前提到的admission.csv是一个示例数据集,实际上并不存在于互联网上的任何公共资源中。因此,如果您需要运行这个示例代码,需要创建一个自己的admission.csv文件。下面是一个admission.csv文件的示例。
其中,第一列是考试成绩,第二列是是否被录取(1表示录取,0表示未录取)。您可以使用Excel、Google Sheets或其他类似的工具创建这个文件。创建完成后,将文件保存为admission.csv,与示例代码文件放在同一个文件夹下即可运行。
从上面的答复中可以看出,“admission.csv”并不是一个现成的数据集。ChatGPT建议我们把它生成的示例数据复制下来,保存成CSV文件,再用代码读取。我们按照它的指示把示例数据保存好,然后运行代码。
运行代码,可以得到如表3-1所示的结果。
表3-1 ChatGPT给出的示例数据
如果读者的操作没有问题,应该会获得和表3-1类似的结果。根据ChatGPT的介绍,第一列中的数据是学生的考试成绩,第二列中的数据表示这名学生是否被录取,1表示录取,0表示未录取。
准备好数据后,我们尝试进行模型的训练工作,使用的代码如下。
在上面的代码中,我们先用scikit-learn库中的数据集拆分工具将20%的样本拿出来作为测试集,以便验证模型的准确率;然后创建逻辑回归的实例,并进行训练。
训练完成后,我们可以进行模型验证,使用的代码如下。
在上面的代码中,我们调用训练好的模型对测试集中的数据进行预测,再用accuracy_score进行评估。运行代码会得到下面的结果。
通过对比模型预测值与真实值,程序返回了模型的准确率为1.0,也就是100%预测准确。
此外,ChatGPT给出的代码还包括调用模型对新样本进行预测的部分,代码如下。
上面的代码假设有一名学生的考试成绩为80分,让模型预测该名学生是否会被录取。运行代码,会得到下面的结果。
根据模型的预测,虽然这名学生的考试成绩为80分,但预测的结果仍然是0,也就是不会被录取。
前文中,我们假设有一名学生的考试成绩为80分,但模型依然预测他不会被录取。这是否说明这名学生完全没有机会被录取呢?其实也不一定,因为逻辑回归的预测方式是给出样本属于某个分类的概率。要理解这个概念,我们可以让ChatGPT给出解释。在ChatGPT对话框中输入“解释逻辑回归中的预测概率,并给出示例代码,不要公式”,会得到如下答复。
ChatGPT逻辑回归是一种广泛应用于分类问题的机器学习算法。在逻辑回归中,预测概率是指一个给定的输入样本属于某一类别的概率。
例如,在一个二分类问题中,我们想要预测一个人是否患有某种疾病。我们可以使用逻辑回归模型预测这个人患病的概率。如果患病概率大于某个阈值,如0.5,我们就可以将其分类为患病者;如果患病概率小于0.5,我们就可以将其分类为健康者。
在代码实现中,通常使用scikit-learn库中的逻辑回归模型进行训练和预测。下面是一个简单的示例代码。
在这个示例代码中,X_train和y_train是训练数据集,X_test是测试数据集。lr.fit()方法用于训练逻辑回归模型。lr.predict_proba()方法用于预测测试数据集中每个样本属于某个类别的概率。y_pred_proba是一个二维数组,其中每一行表示一个样本,每一列表示属于一个类别的概率。例如,y_pred_proba[0][0]表示第一个样本属于第一个类别的概率,y_pred_proba[0][1]表示第一个样本属于第二个类别的概率。
从上面的答复中可以看到,在scikit-learn库中,可以使用lr.predict_proba()方法查看逻辑回归模型预测的样本属于某个类别的概率。这里我们只用关键的代码再来看看这名同学被录取的概率,代码如下。
运行上面的代码,会得到以下结果。
虽然前文中逻辑回归模型给出的预测是该名学生不会被录取,但从这段代码的结果可以看到,模型预测这名学生不被录取的概率是50.000003%,而被录取的概率是49.999997%,也就是说并非完全没有机会。