1. 分类的基本概念
在机器学习的有监督学习中,分类一种常见任务,它的目标是将输入数据分类到预定的类别中。具体来说:
分类任务的常见应用:
垃圾邮件分类:判断一封电子邮件是否是垃圾邮件 。
医学诊断:根据病人的症状、检查结果等特征预测病人的疾病类型(如癌症、糖尿病等)。
分类任务的类型:
二分类(Binary Classification): 在二分类问题中,模型需要将输入数据分为两个类别,输入属于两个类别中的一个。如判断一封邮件是垃圾邮件还是非垃圾邮件。
多分类(Multiclass Classification): 在多分类问题中,模型需要将输入数据分为超过两个类别,输入属于多个类别中的一个。如手写数字识别(数字 0 到 9),根据图像内容将其分类为一个数字。
多标签分类(Multilabel Classification): 多标签分类任务是指每个样本可以同时属于多个类别,也就是一个样本可以同时拥有多个标签。如一部电影可以同时属于“动作”和“科幻”两个类别。
分类模型的常用算法: 逻辑回归(Logistic Regression)、支持向量机(SVM, Support Vector Machine)、 K-近邻算法(KNN, K-Nearest Neighbors)、 决策树(Decision Trees)、 随机森林(Random Forest)等。
回归和分类的区别:
- 回归(Regression): 回归任务的目标是预测一个连续的数值输出,模型输出的是一个实数值。回归常用于预测数量、价格、温度等连续型变量。
- 分类(Classification): 分类任务的目标是将输入样本分配到有限的类别中,它的输出是离散的标签,通常是类别的编号或名称。分类问题通常用于处理类别标签的任务。
2. 逻辑回归(Logistic Regression)
逻辑回归(Logistic Regression)是一种广泛使用的线性分类模型,尽管它的名字中带有“回归”二字,但它其实是一种用于分类任务的算法,特别适用于二分类问题,也可以通过扩展来处理多分类问题。逻辑回归通过使用Sigmoid函数将线性回归的输出转换为概率值,这个概率值表示一个样本属于某个类别的概率,从而进行分类预测。
Sigmoid函数将线性回归的结果 𝑧 转换为一个介于 0 和 1 之间的概率值 y ^ \hat{y} y^ ,通常通过设置一个阈值(比如 0.5)来进行分类判断。如果 y ^ \hat{y} y^ >=0.5 ,则预测为类别 1,否则类别为0。
逻辑回归的损失函数: 与线性回归的均方误差(MSE)不同,做二分类的逻辑回归使用的是对数损失函数(Log Loss),用于度量模型输出概率与真实标签之间的差异。
逻辑回归模型训练:逻辑回归通过最小化损失函数来训练模型,常用的方法是梯度下降。训练过程中,算法会迭代地调整模型参数 ,以最小化损失函数,从而使得模型的预测与真实标签更接近。
3. 逻辑回归做二分类任务的实例(代码+可视化)
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_classification
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
# 1. 生成一个二维特征的二分类数据集
X, y = make_classification(n_samples=400, n_features=2, n_informative=2, n_redundant=0,
n_clusters_per_class=1, random_state=42)
# 2. 数据标准化(可选,但常见做法)
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
# 3. 将数据分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X_scaled, y, test_size=0.3, random_state=42)
# 4. 数据可视化:展示训练数据的分布
plt.figure(figsize=(8, 6))
plt.scatter(X_train[y_train == 0][:, 0], X_train[y_train == 0][:, 1], color='blue', label='Class 0', alpha=0.7)
plt.scatter(X_train[y_train == 1][:, 0], X_train[y_train == 1][:, 1], color='red', label='Class 1', alpha=0.7)
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.title('Training Data - Class Distribution')
plt.legend()
plt.show()
# 5. 创建逻辑回归模型并训练
model = LogisticRegression()
model.fit(X_train, y_train)
# 6. 绘制决策边界函数
def plot_decision_boundary(X, y, model):
# 生成网格点
h = 0.01
x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1
xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))
# 使用模型进行预测
Z = model.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
# 绘制决策边界
plt.contourf(xx, yy, Z, alpha=0.75, cmap='bwr')
plt.colorbar()
# 绘制数据点
plt.scatter(X[:, 0], X[:, 1], c=y, cmap='bwr', s=30, edgecolors='k')
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.title('Logistic Regression Decision Boundary')
# 7. 可视化训练集的决策边界
plt.figure(figsize=(8, 6))
plot_decision_boundary(X_train, y_train, model)
plt.show()
# 8. 在测试集上评估模型
test_accuracy = model.score(X_test, y_test)
print(f"Test Accuracy: {test_accuracy:.2f}")
#Test Accuracy: 0.88
解释一下决策边界: 决策边界指的是在特征空间中将不同类别的样本分开的“边界”或“界限”。它是一个假设函数的边界,能够将数据点分到不同的类别。
假设有一个二维数据集,其中每个数据点由两个特征(x 和 y)构成,类别有两种(比如“0”和“1”)。那么,决策边界就是在二维平面上,一个将类别 0 和类别 1 分开的曲线或直线,如上图。
最后: 分类任务还有很多其他算法,每个都分开写博客说明,这里只介绍逻辑回归。