当前位置: 首页 > news >正文

机器学习入门之监督学习

监督学习定义

监督学习是机器学习中最常用和最直观的一类方法,其核心思想是利用一组已知输入与输出的样本(即训练数据)来训练模型,使模型能够学习到输入与输出之间的映射关系,以便对新的输入进行准确的预测。在监督学习中,每个实例都是由一个输入对象(通常为矢量)和一个期望的输出值(也称为监督信号)组成。

监督学习之分类定义

监督学习主要分为两类问题:

  1. 分类(Classification):当输出变量是离散的,任务是预测输入数据属于哪一个类别。例如,判断一封电子邮件是垃圾邮件还是非垃圾邮件。常见的分类算法包括逻辑回归、决策树、随机森林、支持向量机、朴素贝叶斯等。
  2. 回归(Regression):当输出变量是连续的,任务是预测一个数量。例如,根据房屋的特征(如面积、位置等)来预测房屋的价格。常见的回归算法包括线性回归、决策树回归、随机森林回归等。

鸢尾花数据集分类问题及实现

        鸢尾花数据集(Iris dataset)是一个著名的多变量数据集,在模式识别文献中经常被引用。它由英国统计学家和生物学家罗纳德·费雪(Ronald Fisher)于1936年为了用于分类问题而收集并发布。这个数据集非常适合用于教学和初学者了解如何处理真实世界的分类问题。        

        假设我们使用鸢尾花数据集来做一个简单的二分类任务。注:Python是进行机器学习和深度学习研究的热门语言,下面通过代码示例感受一下Python解决分类问题带来的便利。

from sklearn import datasets
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
import warnings
warnings.filterwarnings("ignore")# 加载数据
iris = datasets.load_iris()
X = iris.data[:, [2, 3]] # 只取花瓣长度和宽度作为特征
y = iris.target# 数据集划分
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=1, stratify=y)# 标准化
sc = StandardScaler()
sc.fit(X_train)
X_train_std = sc.transform(X_train)
X_test_std = sc.transform(X_test)# 训练模型
lr = LogisticRegression(solver='lbfgs', multi_class='auto', max_iter=10000)
lr.fit(X_train_std, y_train)# 预测
y_pred = lr.predict(X_test_std)# 模型评估
print('Accuracy: %.2f' % accuracy_score(y_test, y_pred))

数据集 

        对于小白来说可能会有疑问,上述代码似乎并没有明显的加载鸢尾花数据集,是如何实现分类的,这是因为sklearn里面自带的,在pip安装的时候自动下载了这一经典数据集。也许会有疑问,这会不会影响我们对这个模型的拓展,因为这个数据集的数据格式似乎已经确定了, 回答是当然不会限制,因为机器学习的关键在于处理数据以及为了精准预测所进行的数学计算,机器学习可以对任何数据进行预测(抬杠的数据除外),如果你能接受它的精度,因为不同的数据集所需要的模型复杂度差别可能会很大,这里先不展开。

数据集的划分

1. 训练集与测试集

  • 训练集:用于训练模型,使模型能够学习并捕捉到数据中的规律和模式。训练集的大小和质量直接影响模型的训练效果。
  • 测试集:用于评估模型在未见过的数据上的性能,以检验模型的泛化能力。测试集应该与训练集独立,以避免模型对测试数据的过拟合。

2. 数据集划分方法

  • 随机划分:最常用的方法,将数据集随机划分为训练集和测试集。这种方法简单有效,但需要注意划分比例,通常训练集占比较大,如70%-80%,测试集占比较小,如20%-30%。
  • 交叉验证:一种更为严谨的数据集划分方法,将数据集划分为多个子集,然后轮流使用其中一个子集作为测试集,其余子集作为训练集。这种方法可以更全面地评估模型的性能,但计算成本较高。

3. 数据集划分对模型的影响

  • 训练集大小:训练集越大,模型能够学习到的信息就越多,通常模型的性能也会越好。但过大的训练集可能会导致计算成本增加和训练时间延长。
  • 测试集大小:测试集太小可能无法准确评估模型的泛化能力,而测试集太大则可能浪费数据资源。因此,需要合理划分测试集的大小。
  • 数据集划分质量:如果训练集和测试集的数据分布差异较大,可能会导致模型在训练集上表现良好,但在测试集上表现不佳。这可能是由于数据集的随机划分导致的,此时可以考虑使用分层抽样等方法来提高数据集划分的质量。

 特征数据标准化

        回到这段代码,可以总结一下,对于分类问题,首先我们需要对数据集进行划分,然后对特征数据进行标准化,标准化的原因是,对于不同的特征,用于衡量它的数值如果在同一个标准下进行衡量是“不公平”的(这里是不准确的说法,但是我觉得挺形象,具体原理看下课本也很好理解),比如两个特征一个单位是m(米),另一个特征单位是(元),这两个单位含义完全不同,总结起来,对特征数据进行标准化(Standardization)的主要目的是消除量纲影响,使数据满足正态分布或标准差为1的标准,从而使不同变量的数据能够进行比较和分析。它关注的是数据分布的整体特性。

特征数据归一化

        归一化的主要目的是调整不同特征的数值范围,使之在统一的尺度下进行比较和计算。这样做有以下几个关键原因:

  1. 加快模型的收敛速度

    • 对于很多机器学习算法(如梯度下降),特征值范围差异过大可能导致收敛速度变慢。归一化后,所有特征都在相似的范围内,优化算法可以更快地找到最优解。
  2. 提高模型性能

    • 未经归一化的特征可能会导致某些特征在损失函数中占据主导地位,从而影响模型性能。例如,在一个特征值范围为1-100,而另一个特征值范围为0-1的情况下,模型可能会更多地关注值范围较大的特征。归一化后,每个特征对模型训练的影响更加均衡。
  3. 避免数值计算问题

    • 在某些算法中(如涉及距离计算的算法,如K近邻、支持向量机等),特征值范围差异过大会导致距离计算被大值特征所主导,从而影响算法的效果。归一化可以确保每个特征在计算过程中都有相似的权重。
  4. 增强模型的稳定性

    • 归一化后的特征数据对输入数据的变化不那么敏感,可以提高模型的稳定性。例如,对于神经网络,归一化后的数据有助于避免梯度爆炸或梯度消失的问题。
  5. 统一不同量纲的特征

    • 在现实世界中,数据集可能包含不同量纲的特征(如身高以厘米为单位,体重以千克为单位)。归一化可以将这些不同量纲的特征转换到相同的尺度,使它们可以公平比较。

常见的归一化方法包括

  • Min-Max归一化:将特征值缩放到[0,1]或[-1,1]的范围内。
  • Z-score标准化:将特征值转换为均值为0,标准差为1的标准正态分布。
  • MaxAbs归一化:将特征值除以该特征的最大绝对值,使特征值在[-1,1]范围内。

 模型训练

        模型训练主要就是将我们的训练算法封装,然后将训练数据集输入模型进行训练,训练完成后对待预测的数据进行预测。上述代码中使用的是逻辑回归。这里就体现了Python优势,很多算法都是封装好的,可以直接调用,但是只会调用封装模型是不能发挥机器学习的魅力的,要想达到理想的效果还是要学习算法之后的原理及代码实现。

模型分类精度

        终于来到了最后一步,训练完成的模型就可以进行预测。上述代码实现的预测精度为0.98,已经是很可观的精度了。

                                                        

房价预测

波士顿房价预测存在的问题

在我尝试使用波士顿房价数据集的时候,

        ​​​​​​​        

报错信息

 提示从1.2版本以后就不再支持了,由于伦理等一些问题。幸好这里我们可以选择加利福尼亚数据集。

加利福尼亚数据集回归问题及实现

示例代码

from sklearn.datasets import fetch_california_housing
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_scoredata = fetch_california_housing()
X, y = data.data, data.targetX_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
model = LinearRegression()
model.fit(X_train, y_train)
y_pred = model.predict(X_test)
mse = mean_squared_error(y_test, y_pred)
rmse = np.sqrt(mse)
r2 = r2_score(y_test, y_pred)
print(f"MSE: {mse}, RMSE: {rmse}, R^2: {r2}")

数据集

        加利福尼亚房价数据集(fetch_california_housing),提供了加利福尼亚州各个街区的房价及其相关特征,具体数据信息大家可以在运行代码时查看。

数据划分

  • 将数据集划分为训练集和测试集,通常使用80%的数据作为训练集,20%的数据作为测试集。

模型选择与训练

      选择线性回归模型进行预测。

模型评估

  • 使用测试集数据对训练好的模型进行评估,常用的评估指标包括均方误差(MSE)、均方根误差(RMSE)和R^2分数。

补充:模型优化(可选)

  • 如果模型的性能不满足要求,可以尝试不同的模型(如决策树、随机森林、梯度提升树等),或对模型进行调参优化(如使用网格搜索、随机搜索等方法寻找最优的超参数组合)。

 模型评估结果

上述代码运行后得到评估结果如下:

总结

        通过代码实现可以很轻易的发现,使用Python代码实现分类和回归问题时,只要能读懂英文,很容易知道哪一步做了什么,而先不用关注背后的实现细节,这大概也是Python如此火热的原因之一吧。深度学习的道路道阻且长,还有很多细节没有介绍到,后续会尽量补充,坚持日更。 

 

 

 


http://www.mrgr.cn/news/60578.html

相关文章:

  • Flutter升级与降级
  • 最新版的 Git+VS Code同步版本管理实践
  • 已经安装好Ubuntu,10分钟配好Anaconda3
  • Ajax学习笔记
  • 深入理解 Webpack:现代前端开发的模块打包器
  • opencv-rust 系列3: Create_mask
  • 并联 高电压、高电流 放大器实现 2 倍输出电流模块±2A
  • 《学会提问》
  • qt-opensource-windows-x86-5.14.2.rar
  • 聚水潭到畅捷通T+的数据高效集成方案解析
  • OceanBase数据库结合ETLCloud快速实现数据集成
  • GEE 图表:利用CGIAR/SRTM90_V4绘制雷尼尔山登山步道沿途的海拔高度图表
  • DevCon,我们来了|DAOBase 线下活动(曼谷站)
  • python -m pip install --upgrade pip和pip install --upgrade pip有什么区别?
  • python读取CSV文件
  • 算法4之链表
  • C++:字符串
  • Unable to add window -- token null is not valid; is your activity running?
  • 【JIT/极态云】技术文档--函数设计
  • 可重入函数和不可重入函数
  • LVGL移植教程(超详细)——基于GD32F303X系列MCU
  • 量子容错计算
  • 【JVM】——GC垃圾回收机制(图解通俗易懂)
  • PowerShell 提示“系统禁止运行脚本”
  • 【嵌入式软件-STM32】按键控制LED 光敏传感器控制蜂鸣器
  • Shiro会话管理和加密