一、机器学习介绍与定义
1.1 机器学习定义
机器学习(Machine Learning)是让计算机从数据中自动学习规律,并依据这些规律对未来数据进行预测的技术。它涵盖聚类、分类、决策树、贝叶斯、神经网络、深度学习(Deep Learning)等多种算法 ,基本思路是模拟人类学习行为,通过经验归纳总结规律来预测未来。
1.2 机器学习的发展历史
机器学习的发展历程丰富且具有标志性:
- 萌芽发展期(20 世纪 50 年代):图灵测试提出,塞缪尔开发西洋跳棋程序,标志着机器学习进入发展阶段。
- 发展停滞期(20 世纪 60 - 70 年代):发展几乎停滞。
- 复兴时期(20 世纪 80 年代):神经网络反向传播(BP)算法训练的多参数线性规划(MLP)理念提出,使机器学习复兴。
- 数据驱动转变期(20 世纪 90 年代):“决策树”(ID3 算法)和支持向量机(SVM)算法出现,机器学习从知识驱动转变为数据驱动。
- 蓬勃发展期(21 世纪初至今):Hinton 提出深度学习,随着算力提升和海量训练样本支持,深度学习成为研究热点并广泛应用。
1.3 机器学习分类
机器学习按学习模式可分为以下几类:
- 监督学习(Supervised Learning):从有标签的训练数据中学习模型,用于预测新数据标签,主要用于回归和分类。如预测房价(回归)和判断邮件是否为垃圾邮件(分类)。常见算法包括线性回归、朴素贝叶斯等。
- 半监督学习(Semi - Supervised Learning):利用少量标注数据和大量无标注数据学习,侧重于在有监督分类算法中加入无标记样本实现半监督分类。例如在图像分类中,利用少量标注图像和大量未标注图像训练模型。常见算法有 Pseudo - Label、Π - Model 等。
- 无监督学习(Unsupervised Learning):从未标注数据中寻找隐含结构,主要用于关联分析、聚类和降维。比如对客户进行聚类分析,找出不同客户群体特征。常见算法有稀疏自编码、主成分分析等。
- 强化学习(Reinforcement Learning):通过不断试错学习,有智能体和环境两个交互对象,以及策略、回报函数、价值函数和环境模型(可选)四个核心要素。常用于机器人避障、棋牌类游戏等。如 AlphaGo 通过强化学习在围棋领域取得卓越成绩。
1.4 机器学习需要具备的基础的知识,如何学习机器学习
学习机器学习需具备线性代数、微积分、概率和统计等数学知识,以及编程基础。学习建议如下:
- 数学基础:掌握线性代数、概率论和统计学概念,理解算法原理。
- 编程语言:熟练掌握 Python 或 R 语言,它们有丰富的机器学习库和工具。
- 机器学习算法:了解常见算法原理、应用和优缺点。
- 机器学习工具和框架:熟悉 scikit - learn、TensorFlow、PyTorch 等工具和框架。
- 实践项目:通过小型项目提升实践能力,如利用鸢尾花数据集进行分类预测。
- 学习资源:利用 Coursera、Kaggle、GitHub 等平台的学习资源。
- 参与机器学习社区:与他人交流经验,参加线下活动。
- 持续学习和实践:机器学习不断发展,需持续关注研究成果,参与竞赛和项目。
1.5 机器学习的应用场合
机器学习应用广泛,涵盖多个行业领域:
- 自然语言处理(NLP):实现语音识别、文本分析、情感分析等,用于智能客服、聊天机器人等。如智能音箱通过语音识别和自然语言处理理解用户指令。
- 医疗诊断与影像分析:分析医疗图像、预测疾病、辅助药物发现。例如利用深度学习模型诊断医学影像中的疾病。
- 金融风险管理:分析金融数据,预测市场波动性、信用风险等。银行利用机器学习模型评估客户信用风险。
- 预测与推荐系统:进行销售预测、个性化推荐。电商平台根据用户购买历史推荐商品。
- 制造业和物联网:处理传感器数据,实现设备预测性维护和质量控制。工厂利用机器学习预测设备故障,提前维护。
- 能源管理与环境保护:优化能源管理,提高能源利用效率。通过分析能源数据,制定节能策略。
- 决策支持与智能分析:分析大量数据,辅助决策制定。企业利用机器学习分析市场数据,制定营销策略。
- 图像识别与计算机视觉:实现图像分类、目标检测等。安防系统利用图像识别技术识别人员身份。
1.6 机器学习趋势分析
机器学习热点研究包括深度神经网络、强化学习、卷积神经网络、循环神经网络等。以深度神经网络、强化学习为代表的深度学习技术研究热度持续上升,是当前研究热点。
1.7 机器学习项目开发步骤
机器学习项目开发通常包含以下 5 个基本步骤:
- 收集数据:收集原始数据,数据种类、密度和数量越多,学习效果越好。如收集电商用户购买数据。
- 准备数据:确定数据质量,处理缺失数据和异常值,进行探索性分析。例如对收集的用户购买数据进行清洗和预处理。
- 训练模型:选择合适算法和数据表示形式,将清理后的数据分为训练集和测试集,用训练集开发模型。以房价预测为例,选择线性回归算法,用部分数据训练模型。
- 评估模型:使用测试集评估模型准确性,查看模型在未使用数据上的性能。如用测试集数据评估房价预测模型的准确性。
- 提高性能:选择不同模型或引入更多变量提高效率。若房价预测模型准确性不高,尝试其他算法或增加更多特征。
二、scikit - learn 工具介绍
2.1 Python 语言机器学习工具
scikit - learn 是 Python 语言的机器学习工具,包含许多智能的机器学习算法实现,文档完善,上手容易,拥有丰富的 API 接口函数。
2.2 官网及文档
- 官网:https://scikit - learn.org/stable/#
- 中文文档:sklearn
- 中文社区:https://scikit - learn.org.cn/
2.3 scikit - learn 安装
使用 pip 安装:
收起
bash
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple scikit - learn
2.4 Scikit - learn 包含的内容
scikit - learn 包含分类、回归、聚类、降维、模型选择、预处理等内容,为机器学习提供全面支持。
三、数据集(重点)
3.1 sklearn 玩具数据集介绍
数据量小,存储在 sklearn 库本地,安装 sklearn 后无需联网即可获取,如鸢尾花数据集。
3.2 sklearn 现实世界数据集介绍
数据量大,需通过网络获取,如 20 分类新闻数据集。
3.3 sklearn 加载玩具数据集
以鸢尾花数据集为例:
收起
python
from sklearn.datasets import load_iris
iris = load_iris() # 加载鸢尾花数据集
鸢尾花数据集特征包括花萼长、花萼宽、花瓣长、花瓣宽,为三分类数据集(0 - Setosa 山鸢尾 、1 - versicolor 变色鸢尾 、2 - Virginica 维吉尼亚鸢尾)。iris 对象重要属性有:
收起
python
# data 特征
# feature_names 特征描述
# target 目标
# target_names 目标描述
# DESCR 数据集的描述
# filename 下载到本地保存后的文件名
使用 pandas 展示特征和目标:
收起
python
import pandas as pd
import numpy as np
from sklearn.datasets import load_iris
iris = load_iris()
feature = iris.data
target = iris.target
target.shape = (len(target), 1)
data = np.hstack([feature, target])
cols = iris.feature_names
cols.append("target")
pd.DataFrame(data, columns=cols)
3.4 sklearn 获取现实世界数据集
以获取 20 分类新闻数据为例:
收起
python
from sklearn.datasets import fetch_20newsgroups
news = fetch_20newsgroups(data_home=None, subset='all')
- 参数说明:
- data_home:默认 None,下载路径为 “C:/Users/ADMIN/scikit_learn_data/20news - bydate_py3.pkz”;也可自定义路径。
- subset:“train” 只下载训练集,“test” 只下载测试集,“all” 下载训练集和测试集。
- return_X_y:默认 False;为 True 时,返回值为元组,包含特征数据集和目标数据集。
- 返回值说明:
- return_X_y 为 False 时:返回 Bunch 对象,包含 data(特征数据集)、target(目标数据集)、target_names(目标描述)、filenames(新闻数据位置路径)。
- return_X_y 为 True 时:返回元组,包含特征数据集和目标数据集。
3.5 本地 csv 数据
3.5.1 创建 csv 文件
- 方式 1:使用记事本编写数据,数据间用英文逗号分隔,保存后将后缀名改为 csv。
- 方式 2:创建 excel 文件填写数据,以 csv 为后缀保存。
3.5.2 pandas 加载 csv
收起
python
import pandas as pd
pd.read_csv("./src/ss.csv")
3.6 数据集的划分(重点)
3.6.1 函数
收起
python
sklearn.model_selection.train_test_split(*arrays,**options)
- 参数:
- *array:接收 1 到多个 “列表、numpy 数组、稀疏矩阵或 padas 中的 DataFrame”。
- **options:
- test_size:0.0 到 1.0 的小数,表示划分后测试集占比。
- random_state:任意整数,作为随机种子,相同随机种子对相同数据集多次划分结果相同。
- stratify:分层划分,填写 y。
- 返回值说明:返回列表,长度与形参 array 接收的参数数量相关,对应划分出的两部分数据类型与 array 接收的类型相同。
3.6.2 示例
- 列表数据集划分:
收起
python
from sklearn.model_selection import train_test_split
data1 = [1, 2, 3, 4, 5]
data2 = ["1a", "2a", "3a", "4a", "5a"]
a, b = train_test_split(data1, test_size=0.4, random_state=22)
print(a, b)
a, b = train_test_split(data2, test_size=0.4, random_state=22)
print(a, b)
a, b, c, d = train_test_split(data1, data2, test_size=0.4, random_state=22)
print(a, b, c, d)
- ndarray 数据集划分:
收起
python
from sklearn.model_selection import train_test_split
import numpy as np
data1 = [1, 2, 3, 4, 5]
data2 = np.array(["1a", "2a", "3a", "4a", "5a"])
a, b, c, d = train_test_split(data1, data2, test_size=0.4, random_state=22)
print(a, b, c, d)
print(type(a), type(b), type(c), type(d))
- 二维数组数据集划分:
收起
python
from sklearn.model_selection import train_test_split
import numpy as np
data1 = np.arange(1, 16, 1)
data1.shape = (5, 3)
print(data1)
a, b = train_test_split(data1, test_size=0.4, random_state=22)
print("a=\n", a)
print("b=\n", b)
- DataFrame 数据集划分:
收起
python
from sklearn.model_selection import train_test_split
import numpy as np
import pandas as pd
data1 = np.arange(1, 16, 1)
data1.shape = (5, 3)
data1 = pd.DataFrame(data1, index=[1, 2, 3, 4, 5], columns=["one", "two", "three"])
print(data1)
a, b = train_test_split(data1, test_size=0.4, random_state=22)
print("\n", a)
print("\n", b)
- 字典数据集划分:
收起
python
from sklearn.feature_extraction import DictVectorizer
from sklearn.model_selection import train_test_split
data = [{'city': '成都', 'age': 30, 'temperature': 20},
{'city': '重庆', 'age': 33, 'temperature': 60},
{'city': '北京', 'age': 42, 'temperature': 80},
{'city': '上海', 'age': 22, 'temperature': 70},
{'city': '成都', 'age': 72, 'temperature': 40},
]
transfer = DictVectorizer(sparse=True)
data_new = transfer.fit_transform(data)
a, b = train_test_split(data_new, test_size=0.4, random_state=22)
print(a)
print("\n", b)
- 鸢尾花数据集划分:
收起
python
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
iris = load_iris()
list = train_test_split(iris.data, iris.target, test_size=0.2, random_state=22)
x_train, x_test, y_train, y_test = list
print(x_train.shape, x_test.shape, y_train.shape, y_test.shape)
- 现实世界数据集划分:
收起
python
from sklearn.datasets import fetch_20newsgroups
from sklearn.model_selection import train_test_split
news = fetch_20newsgroups(data_home=None, subset='all')
list = train_test_split(news.data, news.target, test_size=0.2, random_state=22)
x_train, x_test, y_train, y_test = list
print(len(x_train), len(x_test), y_train.shape, y_test.shape)