抽查回归算法

序言

抽查是一种发现哪种算法在机器学习问题中表现良好的方法。我们无法提前知道哪种算法最适合。我们必须尝试多种方法,并关注那些表现出最大潜力的方法。通过本文后,我们将知道:

1. 如何抽查机器学习算法的回归问题。

2. 如何抽查四个线性回归算算法。

3. 如何抽查三个非线性回归算法。

算法概览

我们将查看七种可以在数据集上进行抽样检测的回归算法。从四个线性机器学习算法开始:

1. 线性回归(Linear Regression)

2. 岭回归(Ridge Regression)

3. LASSO线性回归(LASSO Linear Regression)

4. 弹性网回归(Elastic Net Regression)

然后,将查看三个非线性机器学习算法:

1. k近邻(k-Nearest Neighbors, KNN)

2. 分类与回归树(Classification and Regression Trees, CART)

3. 支持向量机(Support Vector Machines, SVM)

线性机器学习算法

将展示如何使用四种线性机器学习算法:线性回归、岭回归、LASSO线性回归和弹性网回归。

  • 线性回归(Linear Regression):线性回归假设输入变量具有高斯分布。还假设输入变量与输出变量相关,并且它们之间不存在高度相关性(这种问题称为多重共线性)。我们可以使用LinearRegression类来构建线性回归模型。

  • 岭回归(Ridge Regression):岭回归是线性回归的一种扩展,它通过修改损失函数来最小化模型的复杂度,这种复杂度是通过系数值的总平方和(也称为L2范数)来衡量的。我们可以使用Ridge类来构建岭回归模型。

  • LASSO线性回归(LASSO Linear Regression):最小绝对收缩和选择算子(简称LASSO)是线性回归的一种改进,类似于岭回归,它通过修改损失函数来最小化模型的复杂度,这种复杂度是通过系数值的绝对值之和(也称为L1范数)来衡量的。我们可以使用Lasso类来构建LASSO模型。

  • 弹性网回归(Elastic Net Regression):ElasticNet是一种正则化回归方法,它结合了岭回归(Ridge Regression)和LASSO线性回归(LASSO Linear Regression)的特性。ElasticNet通过同时使用L2范数(系数值的平方和)和L1范数(系数值的绝对和),来最小化回归模型的复杂度(系数的大小和数量)。我们可以使用ElasticNet类来构建ElasticNet模型。

非线性机器学习算法

我们将展示如何使用三种非线性机器学习算法。

  • k-最近邻算法(k-Nearest Neighbors,简称KNN):它是一种基于实例的学习方法。对于新输入的数据实例,KNN算法在训练数据集中寻找与其最相似的k个实例。从这k个邻居中,计算输出变量的平均值或中位数作为预测结果。需要注意的是,用于计算距离的度量标准(metric argument)。默认使用Minkowski距离,这是一种欧几里得距离(当所有输入具有相同的规模时使用)和曼哈顿距离(当输入变量的规模不同时使用)的一般化。我们可以使用KNeighborsRegressor类来构建用于回归的KNN模型。

  • 分类与回归树(Classification and Regression Trees,简称CART或决策树):它是一种决策树算法,它用于构造分类树(用于分类问题)和回归树(用于回归问题)。CART通过在训练数据上选择最佳的分割点来最小化一个成本度量,以构造树的结构。对于回归树,默认的成本度量是均方误差(Mean Squared Error),这在决策树的criterion参数中指定。我们可以使用DecisionTreeRegressor类来创建一个用于回归问题的CART模型。这个类提供了多种参数,允许调整树的增长策略,例如最大深度(max_depth)、最小分割样本数(min_samples_split)等。通过这些参数,进而可以控制模型的复杂度和过拟合的风险。通过使用训练数据来选择最佳的分割点,CART算法构建出一棵用于回归的树。每个节点代表数据的一个子集,而每个叶节点则给出了一个预测值,这个预测值可以是子集中所有数据的平均值或中位数。

  • 支持向量机(Support Vector Machines,简称SVM):它最初是为二分类问题设计的。这种技术已经被扩展到预测实值问题的领域,称为支持向量回归(Support Vector Regression,简称SVR)。与分类问题类似,SVR也是基于LIBSVM库构建的。我们可以使用SVR类来创建一个用于回归问题的SVM模型。

  • 在SVR中,目标是找到一个超平面,使得回归函数的误差尽可能小,同时确保不存在过拟合。SVR使用不同的核函数来实现这种映射,允许非线性回归。在scikit-learn库中,可以选择不同的核函数,如线性核、多项式核、径向基函数(RBF)核等。创建SVM回归模型时,还需要指定模型的参数,例如正则化参数C、核函数类型以及用于交叉验证的参数等。通过调整这些参数,可以优化模型的性能,以更好地适应回归问题。

案例源码分享

# coding: utf-8
"""
该脚本演示了使用七种不同的分类算法在数据集上进行分类的效果。这些算法包括四种线性方法:
(1)线性回归(Linear Regression)
(2)岭回归(Ridge Regression)
(3)LASSO线性回归(LASSO Linear Regression)
(4)弹性网回归(Elastic Net Regression)
以及三种非线性方法:
(1)K-近邻(k-Nearest Neighbors, KNN)
(2)分类和回归树(Classification and Regression Trees, CART)
(3)支持向量机(Support Vector Machines, SVM)
"""
# 导入必要的库和模块
from pathlib import Path # 用于处理文件路径的工具
import pandas as pd # 数据处理和分析库
from sklearn.preprocessing import StandardScaler # 数据标准化预处理工具
from sklearn.model_selection import KFold, cross_val_score # K折交叉验证和交叉验证得分工具
from sklearn.linear_model import LinearRegression, Ridge, Lasso, ElasticNet # 不同的线性回归模型
from sklearn.neighbors import KNeighborsRegressor # K近邻回归模型
from sklearn.tree import DecisionTreeRegressor # 决策树回归模型
from sklearn.svm import SVR # 支持向量回归模型

"""
该脚本读取波士顿房价数据集,进行预处理包括删除缺失值和特征标准化,并输出处理后的数据集概览。
"""

# 读取波士顿房价数据集
filename = Path(__file__).parent / 'data/boston_house_prices.csv'
column_names = ['CRIM', 'ZN', 'INDUS', 'CHAS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD', 'TAX', 'PTRATIO', 'B', 'LSTAT', 'MEDV']
data = pd.read_csv(filename, header=1, names=column_names)
print(data.head())

# 删除含有缺失值的行
data.dropna(inplace=True)

# 对输入的特征数据进行标准化
scaler = StandardScaler()
X = scaler.fit_transform(data.iloc[:, :-1]) # 特征数据标准化
# 提取目标变量
Y = data.iloc[:, -1] # 提取房价作为目标变量
print(X.shape, Y.shape)


"""
###### 机器学习模型性能评估 ######

该代码块用于评估不同机器学习模型在给定数据集上的表现。通过使用交叉验证(KFold)和不同的评分指标(负均方误差),对以下模型进行了比较:
1. 线性回归(Linear Regression)
2. 岭回归(Ridge Regression)
3. LASSO线性回归(LASSO Linear Regression)
4. 弹性网回归(Elastic Net Regression)
5. K-近邻(k-Nearest Neighbors, KNN)
6. 分类和回归树(Classification and Regression Trees, CART)
7. 支持向量机(Support Vector Machines, SVM)

对于每个模型,代码执行以下步骤:
1. 初始化KFold交叉验证器;
2. 实例化选定的模型;
3. 指定评分指标为负均方误差;
4. 计算并记录模型在交叉验证中的表现;
5. 打印模型的平均得分和标准差。

该代码有助于选择在给定数据集上表现最佳的模型,并提供了一个简单的比较框架。
"""

###### 线性回归(Linear Regression)######
# 此部分为线性回归模型的交叉验证评分代码段
print("\n\033[1;30m线性回归(Linear Regression):\033[0m")  # 打印标题
# 划分数据集为10个折叠的交叉验证
kfold = KFold(n_splits=10, random_state=7, shuffle=True)  
# 创建线性回归模型
model = LinearRegression()  
# 定义评分指标为负均方误差
scoring = 'neg_mean_squared_error'  
# 计算模型在交叉验证集上的评分
results = cross_val_score(model, X, Y, cv=kfold, scoring=scoring)  
# 打印线性回归模型的平均评分和标准差
print("Linear Regression: %.3f (%.3f)" % (results.mean(), results.std()))

###### 岭回归(Ridge Regression)######
# 这一部分代码实现了岭回归的交叉验证过程,以评估模型性能。
print("\n\033[1;30m岭回归(Ridge Regression):\033[0m")  # 打印岭回归的标题
# 划分数据集为训练集和测试集
kfold = KFold(n_splits=10, random_state=7, shuffle=True)  # 使用10折交叉验证,设置随机种子为7,并随机打乱数据
model = Ridge()  # 实例化岭回归模型
scoring = 'neg_mean_squared_error'  # 定义评估模型性能的指标为负均方误差
# 在不同的数据子集上训练和评估模型
results = cross_val_score(model, X, Y, cv=kfold, scoring=scoring)  # 计算模型的交叉验证分数
# 打印岭回归模型的平均分数和标准差
print("Ridge Regression: %.3f (%.3f)" % (results.mean(), results.std()))

###### LASSO线性回归(LASSO Linear Regression)######
# 打印LASSO线性回归的标题
print("\n\033[1;30mLASSO线性回归(LASSO Linear Regression):\033[0m")
# 初始化KFold交叉验证,设置分割数为10,随机状态为7,以及打乱数据顺序
kfold = KFold(n_splits=10, random_state=7, shuffle=True)
# 实例化Lasso模型
model = Lasso()
# 设置评估指标为负均方误差
scoring = 'neg_mean_squared_error'
# 进行交叉验证,并存储结果
results = cross_val_score(model, X, Y, cv=kfold, scoring=scoring)
# 打印LASSO线性回归的平均误差和标准差
print("LASSO Linear Regression: %.3f (%.3f)" % (results.mean(), results.std()))

###### 弹性网回归(Elastic Net Regression)######
# 此代码块实现了弹性网回归模型的交叉验证。
# 目的是评估弹性网回归在给定数据集上的表现。
# 使用KFold进行交叉验证,保证评估的准确性和泛化能力。
# 参数:
#   X: 特征矩阵,用于训练弹性网回归模型。
#   Y: 目标变量矩阵,对应于特征的标签。
print("\n\033[1;30m弹性网回归(Elastic Net Regression):\033[0m")
# 初始化KFold交叉验证器
kfold = KFold(n_splits=10, random_state=7, shuffle=True)
# 实例化弹性网回归模型
model = ElasticNet()
# 指定评估模型的指标为负均方误差
scoring = 'neg_mean_squared_error'
# 使用交叉验证评估模型性能
results = cross_val_score(model, X, Y, cv=kfold, scoring=scoring)
# 打印弹性网回归模型的平均性能和标准差
print("Elastic Net Regression: %.3f (%.3f)" % (results.mean(), results.std()))

#### K-近邻(k-Nearest Neighbors, KNN)######
# 此部分为K-近邻算法(KNN)的模型评估
print("\n\033[1;30mK-近邻(k-Nearest Neighbors, KNN):\033[0m")
# 设置交叉验证为10折,随机种子为7,并随机打乱数据
kfold = KFold(n_splits=10, random_state=7, shuffle=True)
# 初始化K近邻回归模型
model = KNeighborsRegressor()
# 设置评估指标为负均方误差
scoring = 'neg_mean_squared_error'
# 进行交叉验证,并存储结果
results = cross_val_score(model, X, Y, cv=kfold, scoring=scoring)
# 打印KNN模型的平均误差和标准差
print("KNN: %.3f (%.3f)" % (results.mean(), results.std()))

###### 分类和回归树(Classification and Regression Trees, CART)######
# 此部分代码用于展示和评估分类和回归树(CART)模型的性能。
# 使用K-Fold交叉验证(kfold)来评估模型,基于负均方误差(scoring)作为评分指标。
print("\n\033[1;30m分类和回归树(Classification and Regression Trees, CART):\033[0m")
# 设置K-Fold交叉验证为10折,并设置随机种子为7,确保结果可复现,同时设置shuffle为True以随机打乱数据。
kfold = KFold(n_splits=10, random_state=7, shuffle=True)
# 使用决策树回归器作为CART模型。
model = DecisionTreeRegressor()
# 设置评分指标为负均方误差,这在回归问题中是常用的评价指标。
scoring = 'neg_mean_squared_error'
# 使用交叉验证来评估模型的性能,返回每个折的评分结果。
results = cross_val_score(model, X, Y, cv=kfold, scoring=scoring)
# 打印CART模型的平均性能和标准差,以了解其一般化性能。
print("CART: %.3f (%.3f)" % (results.mean(), results.std()))

###### 支持向量机(Support Vector Machines, SVM)######
# 此部分代码用于展示支持向量机(SVM)的性能。
# 使用K-Fold交叉验证(10折)来评估SVM模型在给定数据集上的表现。
# 模型评估指标为负均方误差(neg_mean_squared_error)。
print("\n\033[1;30m支持向量机(Support Vector Machines, SVM):\033[0m")
# 设置K-Fold交叉验证的参数
kfold = KFold(n_splits=10, random_state=7, shuffle=True)
# 创建SVR模型实例
model = SVR()
# 指定评估模型的指标为负均方误差
scoring = 'neg_mean_squared_error'
# 执行交叉验证,并存储结果
results = cross_val_score(model, X, Y, cv=kfold, scoring=scoring)
# 打印SVM模型的平均性能和标准差
print("SVM: %.3f (%.3f)" % (results.mean(), results.std()))

结果,如下:

  • 31
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

绎岚科技

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值