本文共 5441 字,大约阅读时间需要 18 分钟。
在机器学习领域中,预测问题可以根据目标变量的类型分为回归和分类两大类。本文将重点探讨分类问题中的逻辑回归方法。
逻辑回归是一种将回归任务转化为分类任务的方法。具体来说,我们将连续的预测值(如年龄)映射到0-1的二分类范围内。通常,我们会选择一个阈值(如0.5),将预测值大于阈值的概率归类为1,小于阈值的概率归类为0。
为了实现这一点,逻辑回归模型使用Sigmoid函数(也称为Logistic函数)将输出范围限定在0-1之间。数学表达式如下:
$$ \sigma(x) = \frac{1}{1+e^{-x}} $$通过这一转换,我们可以将原本的回归问题转化为分类问题,方便模型训练和应用。
在实际应用中,我们需要先加载数据集并进行初步的数据处理。以下是使用Python的代码示例:
import numpy as np import pandas as pd import seaborn as sns import matplotlib.pyplot as plt df = pd.read_csv('https://blog.caiyongji.com/assets/hearing_test.csv') df.head() 上述代码导入了一个包含5000名参与者的数据集,该数据集用于研究年龄和身体健康评分对听力损失的影响。数据集中的特征包括年龄(age)和身体健康评分(physical_score),标签为听力测试结果(test_result),表示是否通过测试(1表示通过,0表示不通过)。
为了更直观地理解数据分布,我们可以绘制散点图来观察年龄和健康评分对听力测试结果的影响。以下是使用Seaborn绘制的散点图:
sns.scatterplot(x='age', y='physical_score', data=df, hue='test_result')
通过上图可以看出,年龄越大,通过测试的可能性越低。同时,健康评分较高的参与者更可能通过测试。这些直观的数据特征为模型训练提供了重要的方向性。
接下来,我们可以使用逻辑回归模型对数据进行训练。以下是完整的代码实现:
from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler from sklearn.linear_model import LogisticRegression from sklearn.metrics import accuracy_score, classification_report, plot_confusion_matrix # 准备数据 X = df.drop('test_result', axis=1) y = df['test_result'] # 数据分割 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.1, random_state=50) # 数据归一化 scaler = StandardScaler() scaled_X_train = scaler.fit_transform(X_train) scaled_X_test = scaler.transform(X_test) # 定义模型 log_model = LogisticRegression() # 模型训练 log_model.fit(scaled_X_train, y_train) # 模型预测 y_pred = log_model.predict(scaled_X_test) # 模型评估 accuracy_score = log_model.accuracy_score(y_test, y_pred) print("准确率:", accuracy_score) 通过上述代码,我们可以看到逻辑回归模型在测试集上的准确率为92.2%。为了更深入地理解模型性能,我们可以绘制混淆矩阵:
plot_confusion_matrix(log_model, scaled_X_test, y_test)
通过混淆矩阵,我们可以看到模型在不同类别上的表现。例如,真正类(True Positive,TP)为285,真负类(True Negative,TN)为176,假正类(False Positive,FP)为19,假负类(False Negative,FN)为20。
除了准确率,我们还可以计算精确度和召回率。以下是它们的数学表达式:
$$ Precision = \frac{TP}{TP + FP} $$
$$ Recall = \frac{TP}{TP + FN} $$带入本例数据:
$$ Precision = \frac{285}{285 + 19} = 0.9375 $$
$$ Recall = \frac{285}{285 + 20} = 0.934 $$这些指标表明,逻辑回归模型在该分类任务中表现出色。
虽然逻辑回归适用于二分类问题,但在多分类场景下,Softmax函数可以更好地处理多个类别。Softmax回归通过对每个类别计算概率并应用Softmax函数来确定最终的类别归属。
以下是用于多分类的数据集导入代码:
df = pd.read_csv('https://blog.caiyongji.com/assets/iris.csv') df.head() 该数据集包含150个鸢尾花样本,特征包括花萼长度(sepal_length)、花萼宽度(sepal_width)、花瓣长度(petal_length)和花瓣宽度(petal_width)。标签为鸢尾花的种类(setosa、versicolor、virginica)。
通过绘制散点图,我们可以更直观地了解不同种类鸢尾花的特征分布:
sns.scatterplot(x='sepal_length', y='sepal_width', data=df, hue='species') sns.scatterplot(x='petal_length', y='petal_width', data=df, hue='species')
通过上述图表可以看出,不同种类的鸢尾花在花萼和花瓣的尺寸上存在显著差异。
使用Softmax回归模型对多分类数据进行训练。以下是完整的代码实现:
from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler from sklearn.linear_model import LogisticRegression from sklearn.metrics import accuracy_score, classification_report # 准备数据 X = df[['sepal_length', 'sepal_width', 'petal_length', 'petal_width']] y = df['species'] # 数据分割 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=50) # 数据归一化 scaler = StandardScaler() scaled_X_train = scaler.fit_transform(X_train) scaled_X_test = scaler.transform(X_test) # 定义模型 softmax_model = LogisticRegression(multi_class='multinomial', solver='lbfgs', C=10, random_state=50) # 模型训练 softmax_model.fit(scaled_X_train, y_train) # 模型预测 y_pred = softmax_model.predict(scaled_X_test) # 模型评估 accuracy_score = softmax_model.accuracy_score(y_test, y_pred) print("准确率:", accuracy_score) 通过上述代码,我们可以看到Softmax回归模型在测试集上的准确率为92.1%。为了更深入地理解模型性能,我们可以查看分类报告:
print(classification_report(y_test, y_pred))
通过上述代码,我们可以看到模型在不同类别上的表现。例如,山鸢尾(setosa)的精确度为93.3%,召回率为97.9%;变色鸢尾(versicolor)的精确度为94.4%,召回率为91.7%;维吉尼亚鸢尾(virginica)的精确度为93.7%,召回率为92.5%。
为了更直观地展示鸢尾花的分类结果,我们可以绘制花瓣尺寸与类别的关系图。以下是完整的代码实现:
# 提取特征 X = df[['petal_length', 'petal_width']].to_numpy() y = df["species"].factorize(['setosa', 'versicolor', 'virginica'])[0] # 定义模型 softmax_reg = LogisticRegression(multi_class='multinomial', solver='lbfgs', C=10, random_state=50) # 模型训练 softmax_reg.fit(X, y) # 随机测试数据 x0, x1 = np.meshgrid( np.linspace(0, 8, 500).reshape(-1, 1), np.linspace(0, 3.5, 200).reshape(-1, 1) ) X_new = np.c_[x0.ravel(), x1.ravel()] # 预测概率和类别 y_proba = softmax_reg.predict_proba(X_new) y_predict = softmax_reg.predict(X_new) # 绘制图像 zz1 = y_proba[:, 1].reshape(x0.shape) zz = y_predict.reshape(x0.shape) plt.figure(figsize=(10, 4)) plt.plot(X[y==2, 0], X[y==2, 1], "g^", label="Iris virginica") plt.plot(X[y==1, 0], X[y==1, 1], "bs", label="Iris versicolor") plt.plot(X[y==0, 0], X[y==0, 1], "yo", label="Iris setosa") from matplotlib.colors import ListedColormap custom_cmap = ListedColormap(['#fafab0', '#9898ff', '#a0faa0']) plt.contourf(x0, x1, zz, cmap=custom_cmap) contour = plt.contour(x0, x1, zz1, cmap=plt.cm.brg) plt.clabel(contour, inline=1, fontsize=12) plt.xlabel("Petal length", fontsize=14) plt.ylabel("Petal width", fontsize=14) plt.legend(loc="center left", fontsize=14) plt.axis([0, 7, 0, 3.5]) plt.show() 通过上述代码,我们可以绘制出鸢尾花根据花瓣尺寸的分类图像。图中,花瓣尺寸较小的为山鸢尾花,中等尺寸的为变色鸢尾花,较大的为维吉尼亚鸢尾花。
通过本文的实践和分析,我们可以看到逻辑回归和Softmax回归在不同分类任务中的应用场景。逻辑回归适用于二分类问题,而Softmax回归则能够处理多分类问题。通过代码实践,我们对机器学习模型的训练和评估有了更深入的理解。
转载地址:http://gpmfz.baihongyu.com/