原文链接:https://xiets.blog.csdn.net/article/details/130957394
版权声明:原创文章禁止转载
专栏目录:scikit-learn 专栏(总目录)
scikit-learn 官方相关网站:
- 官网: https://scikit-learn.org/
- 用户指南 (实例教程): https://scikit-learn.org/stable/user_guide.html
- API (各模块、模型类): https://scikit-learn.org/stable/modules/classes.html
- 案例: https://scikit-learn.org/stable/auto_examples/index.html
- 入门: https://scikit-learn.org/stable/getting_started.html
- 教程: https://scikit-learn.org/stable/tutorial/index.html
- GitHub 仓库: https://github.com/scikit-learn/scikit-learn
其他网站(中文):https://scikit-learn.org.cn/
参考书籍:
scikit-learn 安装:详情:
$ pip3 install -U scikit-learn
1. scikit-learn 简介
scikit-learn 是基于 Python 语言的用于预测数据分析的简单高效机器学习库。它提供了用于机器学习的算法,包括 分类、回归、降维 和 聚类。它也提供了用于数据预处理、提取特征、优化超参数和评估模型的模块。
scikit-learn 基于 NumPy、SciPy 和 matplotlib 构建。开源,商业可用 - BSD 许可证。
2. 监督学习
从 输入-输出 对中进行学习的机器学习算法叫做 监督学习算法 (Supervised Learning)。在这种监督学习的算法中,用户将成对的输入和预期的输出提供给算法学习,算法会找到一种可以泛化到其他前所未见的数据中的方法,根据给定新的输入给出预测的输出。
监督学习问题主要有两种:分类(Classification) 和 回归(Regression)。
分类问题是跟进输入特征预测类别标签,输出的取值是固定的枚举值(而不是一个连续范围),表示的是定性属性(而不是数量)。例如,根据身高和体重等特征预测一个人的性别,性别只能是男性或女性,所以这是一个分类问题。
回归问题是跟进输入特征预测一个连续值,输出的取值是一个连续的浮点数范围。例如,根据性别和体重等特征预测一个人的身,身高在一个范围内可以连续取值,所以这是一个回归问题。
许多监督学习算法都能同时处理分类和回归问题,常用的监督学习算法有:最近邻、线型模型、朴素贝叶斯分类器、决策树、随机森林、梯度提升决策树、支持向量机、神经网络。
2.1 训练数据与测试数据
当拿到一组输入-输出对数据用于监督学习构建模型时,需要把数据的一部分用于训练模型,其余数据用于测试训练好的模型性能(预测新数据的准确度)。用于训练模型的数据叫做 训练数据(Training Data) 或 训练集(Training Set)。用于测试模型的数据叫做 测试数据(Test Data) 或 测试集(Test Set)。
训练集和测试集数据不能重复,不能拿训练集中出现过的数据去测试/评估模型,这样测试出的结果可能模型只是简单地记住了训练集数据,而不能泛化到新数据。
scikit-learn 中的 model_selection.train_test_split(*arrays[, ...])
函数可以随机打乱一个矩阵数据集并进行拆分。这个函数默认将 75% 的数据及对应的标签作为训练集,剩下 25% 的数据及标签作为训练集,可以通过传递参数调整比例和打乱顺序的随机数种子。训练集与测试集的分配比例可以是随意的,但使用 25% 的数据作为测试集是很好的经验法则。
train_test_split()
函数说明:
sklearn.model_selection.train_test_split(*arrays,
test_size=None,
train_size=None,
random_state=None,
shuffle=True,
stratify=None)
# 参数说明:
# *arrays 具有相同 长度或shape[0] 的可索引序列, 一般是包括 输入 和 输出 两组数据。
# 允许的输入是 列表、NumPy数组、scipy-sparse矩阵 或 pandas dataframes。
# 输入数据 一般是 NumPy 二维矩阵数组。
# 输出数据 一般是 一维数组(列表/NumPy一维数组)。
#
# test_size float 或 int 或 None。测试集数据大小。
# 如果是float, 则应介于 0.0 和 1.0 之间, 表示要包含在拆分后测试集样本数量的比例。
# 如果是int, 表示测试集样本的绝对数量。
# 如果是 None, 则将该值设置为 train_size 的补集, 如果 train_size 也是 None, 它将被设置为 0.25。
#
# train_size float 或 int 或 None。训练集数据大小, 和 test_size 含义相似。
# 如果为 None, 则将该值设置为 test_size 的补集。
#
# random_state int 或 RandomState 或 None。应用拆分之前用于打乱数据的随机数种子。
# 如果使用固定值, 可以确保每次打乱后的结果都一样 (一般用于可复现调试模型)。
#
# shuffle bool, 拆分数据集前是否打乱顺序。
#
# stratify 数组, 如果不是 None, 则以分层方式拆分数据, 将其用作类标签。
#
# return: 返回拆分后的 训练集 和 测试集 数据。类型为: list, length=2 * len(arrays)
代码示例:
>>> import numpy as np
>>> from sklearn import model_selection
>>>
>>> X = np.random.randint(0, 10, size=(5, 3)) # 输入数据, 根据习惯, 输入数据一般用大写 X 表示
>>> y = list(range(5)) # 输出数据, 根据习惯, 输出数据一般用小写 y 表示
>>>
>>> X # 输入数据, 一个二维矩阵数组, 每一行表示一个样本数据,
array([[5, 5, 4], # 一个样本可以有多个特征, 所以用一个数组(多列)来表示一个样本数据。
[0, 9, 2],
[3, 5, 1],
[2, 4, 4],
[6, 7, 6]])
>>> y # 输入数据对应输出数据, 一个样本(输入数据的每一行)对应一个输出,
[0, 1, 2, 3, 4] # 一般情况下输出只有一个 (也有多个的情况), 所以以一维数组的形式表示。
>>>
>>> # 拆分训练和测试数据集, 返回一个列表, 元素分别为: 训练集输入, 测试集输入, 训练集输出, 测试集输出
>>> X_train, X_test, y_train, y_test = model_selection.train_test_split(X, y, random_state=0)
>>>
>>> X_train
array([[0, 9, 2],
[2, 4, 4],
[6, 7, 6]])
>>> y_train
[1, 3, 4]
>>>
>>> X_test
array([[3, 5, 1],
[5, 5, 4]])
>>> y_test
[2, 0]
2.1 泛化、过拟合、欠拟合
在监督学习中,使用训练数据构建模型,然后训练好的模型能够对没见过的新数据(新数据与训练集中的数据具有相同的特性)做出准确预测,我们就说模型能够从 训练集 泛化(generalize) 到 测试集。监督学习的目标是要构建一个泛化精度尽可能高的模型。
如果模型在训练集上精准度很高,但在测试集上表现却很差(无法泛化到测试集),这被称为 过拟合(overfitting)。
如果模型经过训练集训练后,在训练集上评估测试表现都很差(无法拟合训练集),这被称为 欠拟合(overfitting)。
3. 无监督学习
数据只有输入特征,没有对应的预期输出,算法从这些只有输入特征的数据中提取知识,这种算法叫做 无监督学习算法 (Unsupervised Learning)。
无监督学习问题有 降维 和 聚类 等。比如根据数据的若干输入特征(没有输出),对数据进行分类(手动指定目标组数),这就是一个无监督学习的聚类问题。