Sklearn工具包
一、Sklearn工具包介绍
scikit-learn,又写作sklearn,是一个开源的基于python语言的机器学习工具包。它通过NumPy, SciPy和Matplotlib等python数值计算的库实现高效的算法应用,并且涵盖了几乎所有主流机器学习算法。
官网:https://scikit-learn.org/stable/index.html
1、常用模块
Sklearn中常用模块:分类(Classification)、回归(Regression)、聚类(Clustering)、降维(Dimensionality reduction)、模型选择(Model selection)、数据预处理(Preprocessing)。
分类:识别某个对象属于哪个类别,常用的算法有:SVM(支持向量机)、nearest neighbors(最近邻)、random forest(随机森林),常见的应用有:垃圾邮件识别、图像识别。
回归:预测与对象相关联的连续值属性,常见的算法有:SVR(支持向量机)、 ridge regression(岭回归)、Lasso,常见的应用有:药物反应,预测股价。
聚类:将相似对象自动分组,常用的算法有:k-Means、 spectral clustering、mean-shift,常见的应用有:客户细分,分组实验结果。
降维:减少要考虑的随机变量的数量,常见的算法有:PCA(主成分分析)、feature selection(特征选择)、non-negative matrix factorization(非负矩阵分解),常见的应用有:可视化,提高效率。
模型选择:比较,验证,选择参数和模型,常用的模块有:grid search(网格搜索)、cross validation(交叉验证)、 metrics(度量)。它的目标是通过参数调整提高精度。
预处理:特征提取和归一化,常用的模块有:preprocessing,feature extraction,常见的应用有:把输入数据(如文本)转换为机器学习算法可用的数据。
二、SciKit-Learn数据集
sklearn.datasets 模块 包含加载数据集的实用程序,包括加载和获取流行引用数据集的方法。它还具有一些人工数据生成器。
更多细节查看: Dataset loading utilities
1、加载数据集
数据科学的第一步通常是加载数据,首先需要学会如何使用SciKit-Learn来加载数据集。
数据集的来源通常是自己准备或第三方处获取。非研究人员,通常是从第三方获取数据。可以下载获取数据集的网站:
SciKit-Learn库中,也有自带一些数据集可以尝试加载。
datasets
模块中也包含了获取其他流行数据集的方法,例如datasets.fetch_openml
可以从openml存储库获取数据集。
在sklearn的0.2版本中,fetch_mldata函数已经被fetch_openml函数取代,例如加载MNIST数据集。
def get_data(): """ Get MNIST data ready to learn with. :return: """ # 在sklearn的0.2版本中,fetch_mldata函数已经被fetch_openml函数取代 from sklearn.datasets import fetch_openml # 通过名称或数据集ID从openml获取数据集 # 查询到我电脑上的scikit data home目录 from sklearn.datasets.base import get_data_home print(get_data_home()) # C:\Users\hqs\scikit_learn_data # Mnist 数据是图像数据:(28,28,1)的灰度图 mnist = fetch_openml('mnist_784') # print(mnist) X, y = mnist["data"], mnist["target"] X.shape # (70000, 784) y.shape # (70000,)
2、数据集切分
将数据集切分为训练集、测试集。
def get_data(): """ Get MNIST data ready to learn with. :return: """ # 在sklearn的0.2版本中,fetch_mldata函数已经被fetch_openml函数取代 from sklearn.datasets import fetch_openml # 通过名称或数据集ID从openml获取数据集 # 查询到我电脑上的scikit data home目录 from sklearn.datasets.base import get_data_home print(get_data_home()) # C:\Users\hqs\scikit_learn_data # Mnist 数据是图像数据:(28,28,1)的灰度图 mnist = fetch_openml('mnist_784') # print(mnist) X, y = mnist["data"], mnist["target"] X.shape # (70000, 784) y.shape # (70000,) # 切分为训练集和测试集 X_train, X_test, y_train, y_test = X[:60000], X[60000:], y[:60000], y[60000:] # 洗牌操作,打乱当前数据集顺序 shuffle_index = np.random.permutation(60000) X_train, y_train = X_train[shuffle_index], y_train[shuffle_index] # 索引值回传相当于洗牌操作 print(X_train, y_train) """ [[0. 0. 0. ... 0. 0. 0.] [0. 0. 0. ... 0. 0. 0.] [0. 0. 0. ... 0. 0. 0.] ... [0. 0. 0. ... 0. 0. 0.] [0. 0. 0. ... 0. 0. 0.] [0. 0. 0. ... 0. 0. 0.]] ['7' '3' '8' ... '0' '0' '4'] """
三、交叉验证(cross validation)
1、交叉验证定义
交叉验证是用来验证分类器的性能一种统计分析方法,基本思想是把在某种意义下将原始数据(data set)进行分组,一部分做为训练集(training set),另一部分做为测试集(validation set),首先用训练集对分类器进行训练,在利用测试集来测试训练得到的模型(model),以此来做为评价分类器的性能指标。
2、三种实现方法
(1)留出法(holdout cross validation)
将原始数据集分为三部分:训练集、验证集和测试集。训练集用于训练模型,验证集用于模型的参数选择配置,测试集对于模型来说是未知数据,用于评估模型的泛化能力。
优点:操作简单
缺点:样本数比例,模型对数据划分敏感,分成三部分使得训练数据变少。
(2)k折交叉验证(k-fold cross validation)
将数据集无替换的随机分为k份,k-1份用来训练模型,剩下一份用来模型性能评估。重复k次,得到k个模型和性能评估结果。得到k个性能评估后,取平均求出最终性能评估。即:
第一步:不重复抽样将原始数据随机分为k份。
第二步:每一次挑选其中 1 份作为测试集,剩余k-1份作为训练集用于模型训练。
第三步:重复第二步k次,每个子集都有一次作为测试集,其余子集作为训练集。在每个训练集上训练后得到一个模型,用这个模型在相应测试集上测试,计算并保存模型的评估指标。
第四步:计算k组测试结果的平均值作为模型精度的估计,并作为当前k折交叉验证下模型的性能指标。
优点:分组后取平均减少方差,使得模型对数据划分不敏感。
缺点:k取值需要尝试。
分成五份,示例如下所示:
(3)留一法(leave one out cross validation)
当k折交叉验证法的k=m,m为样本总数时,称为留一法,即每次的测试集都只有一个样本,要进行m次训练和预测。
优点:适合数据缺乏时使用
缺点:计算繁琐,训练复杂度增加。
3、模型评估: 量化预测的质量
有 3 种不同的 API 用于评估模型预测的质量:
-
Estimator score method(估计器得分的方法): Estimators(估计器)有一个
score(得分)
方法,为其解决的问题提供了默认的 evaluation criterion (评估标准)。 在这个页面上没有相关讨论,但是在每个 estimator (估计器)的文档中会有相关的讨论。 -
Scoring parameter(评分参数): Model-evaluation tools (模型评估工具)使用 cross-validation (如
model_selection.cross_val_score
和model_selection.GridSearchCV
) 依靠 internal scoring strategy (内部 scoring(得分) 策略)。这在 scoring 参数: 定义模型评估规则 部分讨论。 -
Metric functions(指标函数):
metrics
模块实现了针对特定目的评估预测误差的函数。这些指标在以下部分部分详细介绍 分类指标, 多标签排名指标, 回归指标 和 聚类指标 。
(1)cross_val_score函数
使用交叉检验最简单的方法是在估计器上调用cross_val_score函数。该函数可返回交叉验证每次运行的评分数组。
def cross_val_score(estimator, X, y=None, *, groups=None, scoring=None, cv=None, n_jobs=None, verbose=0, fit_params=None, pre_dispatch='2*n_jobs', error_score=np.nan):
参数:
- estimator:数据对象
- X:数据
- y:预测数据
- scoring:定义模型评估规则
- cv:交叉验证生成器或可迭代的次数
- n_jobs:同时工作的cpu个数(-1代表全部)
- verbose:详细程度
- fit_params:传递给估计器的拟合方法的参数
- pre_dispatch:控制并行执行期间调度的作业数量。减少这个数量对于避免在CPU发送更多作业时CPU内存消耗的扩大是有用的。该参数可以是:
- 没有,在这种情况下,所有的工作立即创建并产生。将其用于轻量级和快速运行的作业,以避免由于按需产生作业而导致延迟
- 一个int,给出所产生的总工作的确切数量
- 一个字符串,给出一个表达式作为n_jobs的函数,如'2 * n_jobs'
参数介绍详见:https://blog.****.net/marsjhao/article/details/78678276
3、SciKit-learn代码实现