目录
4.1 k 近邻算法(k - Nearest Neighbors,kNN)
一、机器学习初相识
在科技飞速发展的今天,机器学习就像一位神奇的魔法师,悄然改变着我们生活的方方面面,在众多领域中都发挥着不可或缺的关键作用。
在医疗领域,机器学习宛如医生的得力助手。以往医生诊断疾病,主要依靠自身经验和传统检查手段,面对复杂病症时,诊断难度较大。如今,借助机器学习,医生能更高效准确地判断病情。例如在医学图像分析中,机器学习算法可以快速识别 X 光、CT、MRI 等影像中的异常,帮助医生更早发现疾病迹象。像在乳腺癌诊断中,通过对大量乳腺 X 光图像的学习,机器学习模型能够精准检测出潜在的癌细胞,大大提高早期诊断的准确率,为患者争取宝贵的治疗时间 。在疾病预测方面,机器学习通过分析患者的病历、基因数据、生活习惯等多维度信息,预测疾病发生的可能性,提前制定预防措施。
金融领域同样离不开机器学习。在信用评估环节,传统方法主要依据客户的基本信息和有限的信用记录来判断信用状况,存在一定局限性。而机器学习通过综合分析客户的交易记录、消费习惯、社交媒体行为等海量数据,构建更精准的信用评分模型,帮助金融机构更准确地评估客户信用风险,降低不良贷款率 。在投资领域,机器学习助力投资者做出更明智的决策。通过对市场数据、行业动态、企业财务报表等信息的实时分析,机器学习模型可以预测股票价格走势、资产价格波动等,为投资策略的制定提供有力支持。比如量化投资策略,利用机器学习算法对大量历史数据进行回测和优化,寻找最优投资组合,提高投资回报率。
出行方面,机器学习为我们带来了更加智能便捷的体验。以自动驾驶技术为例,通过对摄像头、雷达等传感器收集的数据进行实时分析,机器学习模型可以识别道路标志、交通信号灯、车辆和行人等,实现车辆的自动行驶和智能决策。这不仅提高了出行的安全性,还能有效缓解交通拥堵 。在交通流量预测中,机器学习通过分析历史交通数据、实时路况、天气信息等,预测未来交通流量,帮助交通管理部门提前制定疏导方案,优化交通信号灯配时,减少拥堵,让我们的出行更加顺畅。
二、实战前的准备
2.1 明确问题
在开启机器学习实战之旅前,首要任务是明确我们面临的机器学习任务类型 。这就如同航海时确定目的地,只有明确方向,才能选择合适的航线。机器学习任务大致可分为分类、回归、聚类等。
分类任务旨在将数据划分到不同的类别中,每个样本都被赋予一个离散的类别标签。比如在图像识别中,判断一张图片是猫还是狗;在文本分类中,区分一篇新闻报道属于体育、娱乐、科技等哪个类别 。以电商领域为例,预测用户是否会购买某商品,这就是一个典型的二分类问题,类别标签只有 “购买” 和 “不购买” 两种。
回归任务则是预测一个连续的数值。在房价预测中,根据房屋的面积、房龄、周边配套等特征,预测房屋的价格;在股票价格预测中,通过分析历史股价、成交量、宏观经济数据等,预测未来股票的价格走势 。这些预测的结果都是具体的数值,而非离散的类别。
聚类任务与前两者不同,它没有预先定义的类别标签,而是将数据集中相似的数据点聚集在一起,形成不同的簇。比如在客户细分中,根据客户的消费行为、偏好、地理位置等信息,将客户分为不同的群体,以便企业制定个性化的营销策略 。
明确任务类型后,结合实际业务场景确定目标至关重要。在电商领域,除了预测用户购买行为,还可以根据用户的浏览历史、购买记录等数据,预测用户可能感兴趣的商品,实现精准推荐,提高用户的购买转化率和满意度 。在医疗领域,通过分析患者的病历数据、基因数据等,预测疾病的发生风险,提前进行干预和预防。
2.2 数据收集
巧妇难为无米之炊,数据就是机器学习的 “米”。获取数据的方式多种多样,常见的有 SQL 查询数据库、调用 API 接口、网络爬虫技术等。
SQL 查询是从关系型数据库中获取数据的常用方法。企业的业务数据通常存储在 MySQL、Oracle 等关系型数据库中,通过编写 SQL 语句,我们可以根据特定的条件筛选出所需的数据 。比如从电商平台的数据库中查询用户的订单信息、商品信息、用户评价等数据,用于分析用户的购买行为和商品的受欢迎程度。
调用 API 接口是获取外部数据的重要途径。许多互联网公司提供了丰富的 API 接口,如百度地图 API、微博 API 等,通过调用这些接口,我们可以获取地图数据、社交媒体数据等 。以获取社交媒体数据为例,通过调用微博 API,我们可以获取用户的微博内容、粉丝数量、关注列表等信息,用于分析用户的兴趣爱好和社交关系。
网络爬虫技术则可以从网页上抓取数据。当我们需要获取网页上的文本、图片、视频等数据时,可以使用 Python 的爬虫框架,如 Scrapy、BeautifulSoup 等,编写爬虫程序,按照一定的规则从网页中提取所需的数据 。但在使用网络爬虫时,需要注意遵守网站的 robots 协议,尊重网站的版权和隐私政策。
此外,还有许多公开数据集平台可供使用,如 Kaggle、UCI 等。Kaggle 是全球最大的机器学习和数据科学社区,拥有丰富的数据集,涵盖了计算机科学、生物学、社会科学等多个领域 。在 Kaggle 上,我们可以找到各种有趣的数据集,如泰坦尼克号乘客生存预测数据集、鸢尾花数据集等,用于机器学习的练习和实践。UCI 机器学习库也是一个著名的公开数据集平台,提供了大量经典的机器学习数据集,为研究人员和开发者提供了便利 。
2.3 工具与环境搭建
Python 因其简洁的语法、丰富的库和强大的功能,成为机器学习实战的首选编程语言。在 Python 中,有许多优秀的库可以帮助我们进行机器学习,如 NumPy、pandas、scikit - learn、TensorFlow 或 PyTorch 等。
NumPy 是 Python 的核心数值计算支持库,提供了快速、灵活、明确的数组对象,以及用于处理数组的函数,能够高效地进行数值计算,为机器学习中的数学运算提供了基础 。pandas 是用于数据处理和分析的库,它提供了快速、灵活、明确的数据结构,旨在简单、直观地处理关系型、标记型数据,能够方便地进行数据的读取、清洗、预处理等操作 。
scikit - learn 是一个用于机器学习的常用库,它提供了丰富的机器学习算法和工具,包括分类、回归、聚类、降维等算法,以及数据预处理、模型评估等功能,易于使用和扩展 。在使用 scikit - learn 进行分类任务时,可以轻松调用逻辑回归、决策树、支持向量机等算法,快速搭建模型并进行训练和预测。
TensorFlow 和 PyTorch 则是深度学习框架,它们提供了强大的计算图和自动求导功能,能够方便地构建和训练深度神经网络,在图像识别、语音识别、自然语言处理等领域发挥着重要作用 。在图像识别任务中,使用 TensorFlow 或 PyTorch 可以构建卷积神经网络(CNN),对图像进行特征提取和分类,实现高精度的图像识别。
安装和配置这些工具和库也并不复杂。首先需要安装 Python,可以从 Python 官网下载对应操作系统的安装包进行安装 。安装完成后,可以使用 pip 工具来安装各种库。pip 是 Python 的包管理工具,通过简单的命令即可完成库的安装。例如,要安装 NumPy 库,只需在命令行中输入 “pip install numpy” 即可 。对于一些复杂的库,如 TensorFlow 和 PyTorch,可能需要根据官方文档进行详细的配置,包括安装相应的依赖项、设置环境变量等 。
三、数据预处理实战
3.1 处理缺失值
在现实世界的数据中,缺失值就像隐藏在暗处的 “小怪兽”,常常悄悄出现,给我们的机器学习之旅带来挑战。比如在医疗数据中,患者的某些检查指标可能因为各种原因缺失;在电商数据中,部分用户的购买时间、购买地点等信息也可能不完整 。这些缺失值如果不加以处理,可能会影响模型的准确性和稳定性 。
处理缺失值的方法有很多种,每种方法都有其适用的场景和优缺点 。
删除缺失数据的记录是一种简单直接的方法。当缺失值在数据集中所占比例较小,且删除这些记录不会对整体数据的代表性造成太大影响时,这种方法是可行的 。假设我们有一个包含 1000 条记录的数据集,其中只有 5 条记录存在缺失值,那么删除这 5 条记录对数据集的整体特征影响不大 。但如果缺失值较多,比如达到了 20%,那么删除这些记录可能会导致数据量大幅减少,丢失重要信息,使模型的训练效果变差 。
使用均值、中位数或众数填补缺失值是一种常用的方法 。对于数值型数据,如果数据分布较为均匀,没有明显的异常值,使用均值填补是一个不错的选择 。在一个班级学生的成绩数据中,某学生的数学成绩缺失,我们可以计算其他学生数学成绩的均值,用这个均值来填补缺失值 。但如果数据中存在异常值,均值可能会受到这些异常值的影响,导致填补结果不准确 。此时,使用中位数填补更为合适 。中位数是将数据按照大小顺序排列后,位于中间位置的数值,它不受极端值的影响 。在房价数据中,可能存在一些高价的豪宅,这些豪宅的价格会拉高房价的均值,如果用均值填补缺失的房价数据,可能会使填补结果偏高 。而众数则适用于分类数据,比如在一个关于水果的数据集里,有 “苹果”“香蕉”“橙子” 等类别,当某个样本的水果类别缺失时,我们可以用出现次数最多的水果类别(众数)来填补 。
插值法也是一种有效的填补缺失值的方法 ,它基于数据的分布规律来估计缺失值 。线性插值是根据相邻两个已知数据点的线性关系来计算缺失值 。假设有一组时间序列数据,记录了每天的销售额,其中某一天的销售额缺失,我们可以根据前后两天的销售额,通过线性插值的方法来估计缺失的销售额 。除了线性插值,还有样条插值、拉格朗日插值等方法,它们在处理复杂数据分布时具有更好的效果 。
在 Python 中,我们可以使用 pandas 和 scikit - learn 库来实现这些方法 。以下是使用均值填补缺失值的代码示例:
import pandas as pd
from sklearn.impute import SimpleImputer
# 创建一个包含缺失值的DataFrame
data = {'A': [1, 2, np.nan, 4],
'B': [5, np.nan, 7, 8]}
df = pd.DataFrame(data)
# 使用均值填补缺失值
imputer = SimpleImputer(strategy='mean')
df[['A', 'B']] = imputer.fit_transform(df[['A', 'B']])
print(df)
在这段代码中,我们首先导入了 pandas 和 SimpleImputer 类 。然后创建了一个包含缺失值的 DataFrame 。接着,我们实例化了 SimpleImputer 类,并将其策略设置为 'mean',表示使用均值填补缺失值 。最后,我们使用 fit_transform 方法对 DataFrame 中的数据进行处理,将处理后的结果重新赋值给原 DataFrame 。