博客
关于我
机器学习(三):理解逻辑回归及二分类、多分类代码实践
阅读量:468 次
发布时间:2019-03-06

本文共 5441 字,大约阅读时间需要 18 分钟。

逻辑回归:二分类

在机器学习领域中,预测问题可以根据目标变量的类型分为回归和分类两大类。本文将重点探讨分类问题中的逻辑回归方法。

1.1 逻辑回归的理解

逻辑回归是一种将回归任务转化为分类任务的方法。具体来说,我们将连续的预测值(如年龄)映射到0-1的二分类范围内。通常,我们会选择一个阈值(如0.5),将预测值大于阈值的概率归类为1,小于阈值的概率归类为0。

为了实现这一点,逻辑回归模型使用Sigmoid函数(也称为Logistic函数)将输出范围限定在0-1之间。数学表达式如下:

$$ \sigma(x) = \frac{1}{1+e^{-x}} $$

通过这一转换,我们可以将原本的回归问题转化为分类问题,方便模型训练和应用。

1.2 代码实践:导入数据集

在实际应用中,我们需要先加载数据集并进行初步的数据处理。以下是使用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表示不通过)。

1.3 数据观察

为了更直观地理解数据分布,我们可以绘制散点图来观察年龄和健康评分对听力测试结果的影响。以下是使用Seaborn绘制的散点图:

sns.scatterplot(x='age', y='physical_score', data=df, hue='test_result')

通过上图可以看出,年龄越大,通过测试的可能性越低。同时,健康评分较高的参与者更可能通过测试。这些直观的数据特征为模型训练提供了重要的方向性。

1.4 模型训练

接下来,我们可以使用逻辑回归模型对数据进行训练。以下是完整的代码实现:

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 $$

这些指标表明,逻辑回归模型在该分类任务中表现出色。

3.1 Softmax:多分类

虽然逻辑回归适用于二分类问题,但在多分类场景下,Softmax函数可以更好地处理多个类别。Softmax回归通过对每个类别计算概率并应用Softmax函数来确定最终的类别归属。

3.2 代码实践:导入数据集

以下是用于多分类的数据集导入代码:

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)。

3.3 数据观察

通过绘制散点图,我们可以更直观地了解不同种类鸢尾花的特征分布:

sns.scatterplot(x='sepal_length', y='sepal_width', data=df, hue='species')  sns.scatterplot(x='petal_length', y='petal_width', data=df, hue='species')

通过上述图表可以看出,不同种类的鸢尾花在花萼和花瓣的尺寸上存在显著差异。

3.4 模型训练

使用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%。

3.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/

你可能感兴趣的文章
Objective-C实现armstrong numbers阿姆斯壮数算法(附完整源码)
查看>>
Objective-C实现articulation-points(关键点)(割点)算法(附完整源码)
查看>>
Objective-C实现atoi函数功能(附完整源码)
查看>>
Objective-C实现average absolute deviation平均绝对偏差算法(附完整源码)
查看>>
Objective-C实现average mean平均数算法(附完整源码)
查看>>
Objective-C实现average median平均中位数算法(附完整源码)
查看>>
Objective-C实现average mode平均模式算法(附完整源码)
查看>>
Objective-C实现avl 树算法(附完整源码)
查看>>
Objective-C实现AvlTree树算法(附完整源码)
查看>>
Objective-C实现backtracking Jump Game回溯跳跃游戏算法(附完整源码)
查看>>
Objective-C实现BACKTRACKING 方法查找集合的幂集算法(附完整源码)
查看>>
Objective-C实现bailey borwein plouffe算法(附完整源码)
查看>>
Objective-C实现balanced parentheses平衡括号表达式算法(附完整源码)
查看>>
Objective-C实现base64加密和base64解密算法(附完整源码)
查看>>
Objective-C实现base64加解密(附完整源码)
查看>>
Objective-C实现base64编码 (附完整源码)
查看>>
Objective-C实现base85 编码算法(附完整源码)
查看>>
Objective-C实现basic graphs基本图算法(附完整源码)
查看>>
Objective-C实现BCC校验计算(附完整源码)
查看>>
Objective-C实现bead sort珠排序算法(附完整源码)
查看>>