监督学习:分类与回归模型的实战应用
1. 监督学习概述
什么是监督学习?
监督学习是一种机器学习任务,其中模型从标记数据中学习,即每个训练样本都有一个对应的目标输出。监督学习主要分为两类任务:分类和回归。分类任务的目标是预测离散的类别标签,而回归任务的目标是预测连续的数值。
监督学习的基本流程
监督学习的基本流程包括以下几个步骤:
- 数据集准备:收集并标记数据。
- 数据预处理:处理缺失值、标准化等。
- 特征工程:选择或提取有用的特征。
- 模型选择:选择适合的算法。
- 模型训练:使用训练数据训练模型。
- 模型评估:使用测试数据评估模型性能。
- 模型优化:调整模型参数以提升性能。
2. 分类模型
2.1 逻辑回归
逻辑回归(logistic regression)是一种用于分类任务的线性模型,尽管名字中有“回归”一词。它通过学习数据的线性关系来预测样本属于某个类别的概率。
逻辑回归的数学原理
逻辑回归使用 sigmoid 函数将线性回归的输出映射到 [0, 1] 之间,表示样本属于某个类别的概率。假设有输入特征向量 x \mathbf{x} x 和对应的权重向量 w \mathbf{w} w,逻辑回归的预测公式为:
[ p(y=1|\mathbf{x}) = \sigma(\mathbf{w}^t \mathbf{x}) ]
其中, σ ( z ) \sigma(z) σ(z) 是 sigmoid 函数,定义为:
[ \sigma(z) = \frac{1}{1 + e^{-z}} ]
逻辑回归的实现
以下是使用 scikit-learn 实现逻辑回归的示例:
from sklearn.datasets import load_iris
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, confusion_matrix, classification_report
# 加载数据集
iris = load_iris()
x = iris.data
y = iris.target
# 数据预处理
scaler = standardscaler()
x_scaled = scaler.fit_transform(x)
# 数据拆分
x_train, x_test, y_train, y_test = train_test_split(x_scaled, y, test_size=0.2, random_state=42)
# 模型训练
log_reg = logisticregression(max_iter=200)
log_reg.fit(x_train, y_train)
# 模型评估
y_pred = log_reg.predict(x_test)
accuracy = accuracy_score(y_test, y_pred)
conf_matrix = confusion_matrix(y_test, y_pred)
class_report = classification_report(y_test, y_pred)
print("logistic regression model accuracy:", accuracy)
print("confusion matrix:\n", conf_matrix)
print("classification report:\n", class_report)
2.2 决策树
决策树(decision tree)是一种树形结构,用于做出决策。每个节点表示一个特征,每个分支表示一个特征值的可能性,每个叶节点表示一个类别。
决策树的构建过程
决策树通过递归地选择最优特征进行分割来构建。最优特征的选择基于某种度量,如信息增益或基尼不纯度。树的构建过程如下:
- 选择最优特征进行分割。
- 根据特征值将数据集分成子集。
- 对每个子集递归地重复上述过程,直到满足停止条件(如达到最大深度或叶节点纯度)。
决策树的实现
以下是使用 scikit-learn 实现决策树的示例:
from sklearn.tree import decisiontreeclassifier
from sklearn.metrics import accuracy_score, confusion_matrix, classification_report
# 模型训练
tree_clf = decisiontreeclassifier(max_depth=3)
tree_clf.fit(x_train, y_train)
# 模型评估
y_pred = tree_clf.predict(x_test)
accuracy = accuracy_score(y_test, y_pred)
conf_matrix = confusion_matrix(y_test, y_pred)
class_report = classification_report(y_test, y_pred)
print("decision tree model accuracy:", accuracy)
print("confusion matrix:\n", conf_matrix)
print("classification report:\n", class_report)
2.3 支持向量机
支持向量机(support vector machine, svm)是一种用于分类和回归任务的强大模型。svm 通过找到最优的分割超平面,将不同类别的样本分开。
支持向量机的原理
svm 的核心思想是找到一个超平面,使得不同类别的样本在这个超平面上尽可能地分开,同时最大化两个类别之间的间隔(margin)。对于线性不可分的数据,svm 使用核函数将数据映射到高维空间,使其线性可分。
支持向量机的实现
以下是使用 scikit-learn 实现支持向量机的示例:
from sklearn.svm import svc
from sklearn.metrics import accuracy_score, confusion_matrix, classification_report
# 模型训练
svm_clf = svc(kernel='linear')
svm_clf.fit(x_train, y_train)
# 模型评估
y_pred = svm_clf.predict(x_test)
accuracy = accuracy_score(y_test, y_pred)
conf_matrix = confusion_matrix(y_test, y_pred)
class_report = classification_report(y_test, y_pred)
print("svm model accuracy:", accuracy)
print("confusion matrix:\n", conf_matrix)
print("classification report:\n", class_report)
3. 回归模型
3.1 线性回归
线性回归(linear regression)是一种用于回归任务的基础模型。它通过学习输入特征与目标变量之间的线性关系来进行预测。
线性回归的数学原理
线性回归假设目标变量 y y y 与输入特征 x \mathbf{x} x 之间存在线性关系,表示为:
[ y = \mathbf{w}^t \mathbf{x} + b ]
其中, w \mathbf{w} w 是权重向量, b b b 是偏置项。通过最小化均方误差(mse)来学习 w \mathbf{w} w 和 b b b 的最佳值。
线性回归的实现
以下是使用 scikit-learn 实现线性回归的示例:
from sklearn.datasets import load_boston
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import standardscaler
from sklearn.linear_model import linearregression
from sklearn.metrics import mean_squared_error, r2_score
# 加载数据集
boston = load_boston()
x, y = boston.data, boston.target
# 数据预处理
scaler = standardscaler()
x_scaled = scaler.fit_transform(x)
# 数据拆分
x_train, x_test, y_train, y_test = train_test_split(x_scaled, y, test_size=0.2, random_state=42)
# 模型训练
lin_reg = linearregression()
lin_reg.fit(x_train, y_train)
# 模型评估
y_pred = lin_reg.predict(x_test)
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)
print("linear regression model mse:", mse)
print("linear regression model r2 score:", r2)
3.2 决策树回归
决策树回归(decision tree regression)是使用决策树进行回归任务的模型。与分类任务类似,决策树回归通过递归地选择最优特征进行分割,但目标是最小化每个叶节点的均方误差。
决策树回归的实现
以下是使用 scikit-learn 实现决策树回归的示例:
from sklearn.tree import decisiontreeregressor
from sklearn.metrics import mean_squared_error, r2_score
# 模型训练
tree_reg = decisiontreeregressor(max_depth=3)
tree_reg.fit(x_train, y_train)
# 模型评估
y_pred = tree_reg.predict(x_test)
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)
print("decision tree regression model mse:", mse)
print("decision tree regression model r2 score:", r2)
3.3 支持向量回归
支持向量回归(support vector regression, svr)是支持向量机的回归版本。svr 寻找一个超平面,使其尽可能多地包含数据点,同时控制超平面到数据点的距离不超过一定的阈值。
支持向量回归的实现
以下是使用 scikit-learn 实现支持向量回归的示例:
from sklearn.svm import svr
from sklearn.metrics import mean_squared_error, r2_score
# 模型训练
svr_reg = svr(kernel='linear')
svr_reg.fit(x_train, y_train)
# 模型评估
y_pred = svr_reg.predict(x_test)
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)
print("svr model mse:", mse)
print("svr model r2 score:", r2)
4. 综合案例分析
通过一个综合案例分析,将分类和回归模型的各个步骤整合到一个完整的机器学习流程中,展示如何应用这些算法解决实际问题。
案例:预测房价
数据准备
使用波士顿房价数据集进行房价预测。首先进行数据加载、预处理和拆分。
from sklearn.datasets import load_boston
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import standardscaler
# 加载数据集
boston = load_boston()
x, y = boston.data, boston.target
# 数据预处理
scaler = standardscaler()
x_scaled = scaler.fit_transform(x)
# 数据拆分
x_train, x_test, y_train, y_test = train_test_split(x_scaled, y, test_size=0.2, random_state=42)
线性回归模型
训练线性回归模型并评估其性能。
from sklearn.linear_model import linearregression
from sklearn.metrics import mean_squared_error, r2_score
# 模型训练
lin_reg = linearregression()
lin_reg.fit(x_train, y_train)
# 模型评估
y_pred = lin_reg.predict(x_test)
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)
print("linear regression model mse:", mse)
print("linear regression model r2 score:", r2)
决策树回归模型
训练决策树回归模型并评估其性能。
from sklearn.tree import decisiontreeregressor
# 模型训练
tree_reg = decisiontreeregressor(max_depth=3)
tree_reg.fit(x_train, y_train)
# 模型评估
y_pred = tree_reg.predict(x_test)
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)
print("decision tree regression model mse:", mse)
print("decision tree regression model r2 score:", r2)
支持向量回归模型
训练支持向量回归模型并评估其性能。
from sklearn.svm import svr
# 模型训练
svr_reg = svr(kernel='linear')
svr_reg.fit(x_train, y_train)
# 模型评估
y_pred = svr_reg.predict(x_test)
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)
print("svr model mse:", mse)
print("svr model r2 score:", r2)
结果对比
对比不同模型的性能,选择最优的模型。
print("linear regression model mse:", mse_lin_reg)
print("decision tree regression model mse:", mse_tree_reg)
print("svr model mse:", mse_svr_reg)
print("linear regression model r2 score:", r2_lin_reg)
print("decision tree regression model r2 score:", r2_tree_reg)
print("svr model r2 score:", r2_svr_reg)
5. 总结
在本章中,我们详细介绍了常见的监督学习算法,包括逻辑回归、决策树和支持向量机等分类模型,以及线性回归、决策树回归和支持向量回归等回归模型。我们探讨了每种算法的数学原理,并通过示例代码展示了如何使用 scikit-learn 实现这些模型和进行模型评估。通过一个综合案例分析,我们展示了如何应用这些算法解决实际问题,并对比不同模型的性能。希望通过本章的学习,您能够深入理解并应用监督学习算法,解决各种分类和回归任务。
发表评论