社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  机器学习算法

机器学习库Scikit-learn

图灵人工智能 • 2 年前 • 424 次点击  

点击上方“图灵人工智能”,选择“星标”公众号

您想知道的人工智能干货,第一时间送达

                         

本文目录

  • 3.1 背景知识

  • 3.2 Scikit-learn概述

  • 3.3 Scikit-learn主要用法

    • 3.3.1 基本建模流程

    • 3.3.2 数据预处理

    • 3.3.3 监督学习算法

    • 3.3.4 无监督学习算法

    • 3.3.5 评价指标

    • 3.3.6 交叉验证及超参数调优

  • 3.4 Scikit-learn总结

  • 参考文献

Scikit-learn是基于NumPy、SciPy和Matplotlib的开源Python机器学习包,它封装了一系列数据预处理、机器学习算法、模型选择等工具,是数据分析师首选的机器学习工具包。

自2007年发布以来,Scikit-learn已经成为Python重要的机器学习库了,Scikit-learn简称sklearn,支持包括分类、回归、降维和聚类四大机器学习算法,还包括了特征提取、数据处理和模型评估三大模块。

3.1 背景知识

机器学习的编程语言没有限制,同学们可选用自己熟悉的语言对算法进行实现。本书的代码基于Python编写。回顾一下本书需要掌握的Python相关知识,限于篇幅,本文不再对Python的使用进行详细讲解,仅列出使用Python进行机器学习算法所需要掌握的知识点:

(1) Python环境的安装:包括安装Anaconda、Jupyter和Pycharm。

(2) Python数据结构:列表、元组、集合、字典。

① 列表用来存储一连串元素的容器,用[ ]来表示,其他元素类型可不相同。

② 元组与列表类似,元组中的元素也可进行索引计算,用( )来表示。二者的区别是列表里面的元素值可以修改,而元组中的元素值不可以修改,只能读取。

③ 集合有两个功能,一是进行集合操作,二是消除重复元素。集合的格式是:set( ),其中( )内可以是列表、字典或者字符串。

④ 字典(dict)也称作关联数组,用{ }表示,使用键-值存储。

(3) Python控制流:顺序结构、分支结构、循环结构。

(4) Python函数:调用函数、定义函数、高阶函数。

(5) Python主要模块:NumPy、Pandas、SciPy、Matplotlib、Scikit-learn。

(6) NumPy:是一个用Python实现的科学计算扩展程序库。

(7) Pandas:是基于NumPy的一种工具,为解决数据分析任务而创建。

(8) SciPy:是一款为科学和工程设计的工具包,包括统计、优化、线性代数、傅里叶变化等。

(9) Matplotlib:是一款2D绘图库,以各种硬拷贝格式和跨平台的交互式环境生成绘图、直方图、功率谱、条形图等。

(10) Scikit-learn:Python重要的机器学习库。

3.2 Scikit-learn概述

Scikit-Learn (简称 Sklearn) 是基于 Python 语言的机器学习工具。它建立在 NumPy、SciPy、Pandas和 Matplotlib 之上,里面的 API 的设计非常好,所有对象的接口简单,很适合新手上路。

Scikit-Learn库的算法主要有四类:分类、回归、聚类、降维。其中:

  1. 常用的回归:线性回归、决策树回归、SVM回归、KNN回归;集成回归:随机森林、Adaboost、GradientBoosting、Bagging、ExtraTrees。

  2. 常用的分类:线性分类、决策树、SVM、KNN,朴素贝叶斯;集成分类:随机森林、Adaboost、GradientBoosting、Bagging、ExtraTrees。

  3. 常用聚类:K均值(K-means)、层次聚类(Hierarchical clustering)、DBSCAN。

  4. 常用降维:LinearDiscriminantAnalysis、PCA。

图3-1 Scikit-Learn算法选择路径图

图3-1代表了Scikit-Learn算法选择的一个简单路径,这个路径图代表:蓝色圆圈是判断条件,绿色方框是可以选择的算法,我们可以根据自己的数据特征和任务目标去找一条自己的操作路线。

Scikit-Learn中包含众多数据预处理和特征工程相关的模块,但其实Sklearn六大板块中有两块都是关于数据预处理和特征工程的,两个板块互相交互,为建模之前的全部工程打下基础。

3.3 Scikit-learn主要用法

3.3.1 基本建模流程

基本建模的符号标记见表3-1:

表3-1 符号标记

符号代表含义符号代表含义
X_train训练数据y_train训练集标签
X_test测试数据y_test测试集标签
X完整数据y数据标签


y_pred预测标签

1.导入工具包

导入工具包的方法如下(这里使用伪代码):

from sklearn import 包名称
from sklearn.库名称 import 包名称

代码示例:

from sklearn import datasets, preprocessing  
#导入数据集,数据预处理库  
from sklearn.model_selection import train_test_split    
#从模型选择库导入数据切分包  
from sklearn.linear_model import LinearRegression    
#从线性模型库导入线性回归包  
from sklearn.metrics import r2_score  
#从评价指标库导入R2评价指标  

2.导入数据

导入数据的方法如下:

from sklearn.datasets import 数据名称

Scikit-learn支持以NumPy的arrays对象、Pandas对象、SciPy的稀疏矩阵及其他可转换为数值型arrays的数据结构作为其输入,前提是数据必须是数值型的。

sklearn.datasets模块提供了一系列加载和获取著名数据集如鸢尾花、波士顿房价、Olivetti人脸、MNIST数据集等的工具,也包括了一些toy data如S型数据等的生成工具。

Scikit-learn内置了很多可以用于机器学习的数据,可以用两行代码就可以使用这些数据。内置数据分为可以直接使用的数据集、需下载的数据集以及生成数据集。

(1) 可以直接使用的自带数据集

此类数据集可以直接导入使用数据,数据集和描述见表3-2:

表3-2可以直接使用的自带数据集

数据集名称描述类型维度
load_bostonBoston房屋价格回归506*13
fetch_california_housing加州住房回归20640*9
load_diabetes糖尿病回归442*10
load_digits手写字分类1797*64
load_breast_cancer乳腺癌分类、聚类(357+212)*30
load_iris鸢尾花分类、聚类(50*3)*4
load_wine葡萄酒分类(59+71+48)*13
load_linnerud体能训练多分类20

(2) 需要下载的自带数据集

此类数据集第一次使用,需要联网下载数据,数据集和描述见表3-3:

表3-3需要下载的自带数据集

数据集名称描述
fetch_20newsgroups用于文本分类、文本挖据和信息检索研究的国际标准数据集之一。数据集收集了大约20,000左右的新闻组文档,均匀分为20个不同主题的新闻组集合。返回一个可以提取文本特征的提取器
fetch_20newsgroups_vectorized这是上面这个文本数据的向量化后的数据,返回一个已提取特征的文本序列,即不需要使用特征提取器
fetch_california_housing加利福尼亚的房价数据,总计20640个样本,每个样本8个属性表示,以及房价作为target,所有属性值均为number,详情可调用。如:fetch_california_housing( )['DESCR'],了解每个属性的具体含义;
fetch_covtype森林植被类型,总计581012个样本,每个样本由54个维度表示(12个属性,其中2个分别是onehot4维和onehot40维),以及target表示植被类型1-7,所有属性值均为number,详情可调用fetch_covtype( )['DESCR']了解每个属性的具体含义
fetch_kddcup99KDD竞赛在1999年举行时采用的数据集,KDD99数据集仍然是网络入侵检测领域的事实Benckmark,为基于计算智能的网络入侵检测研究奠定基础,包含41项特征
fetch_lfw_pairs该任务称为人脸验证:给定一对两张图片,二分类器必须预测这两个图片是否来自同一个人。
fetch_lfw_people打好标签的人脸数据集
fetch_mldata从 mldata.org 中下载数据集
fetch_olivetti_facesOlivetti 脸部图片数据集
fetch_rcv1路透社新闻语聊数据集
fetch_species_distributions物种分布数据集

(3) 生成数据集

此类数据集可以用来分类任务,可以用来回归任务,可以用来聚类任务,用于流形学习的,用于因子分解任务的,用于分类任务和聚类任务的:这些函数产生样本特征向量矩阵以及对应的类别标签集合,数据集和描述见表3-4:

表3-4生成数据集

数据集名称描述
make_blobs多类单标签数据集,为每个类分配一个或多个正态分布的点集
make_classification多类单标签数据集,为每个类分配一个或多个正态分布的点集,提供了为数据添加噪声的方式,包括维度相关性,无效特征以及冗余特征等
make_gaussian-quantiles将一个单高斯分布的点集划分为两个数量均等的点集,作为两类
make_hastie-10-2产生一个相似的二元分类数据集,有10个维度
make_circle和make_moons产生二维二元分类数据集来测试某些算法的性能,可以为数据集添加噪声,可以为二元分类器产生一些球形判决界面的数据

代码示例:

#导入内置的鸢尾花数据  
from sklearn.datasets import load_iris    
iris = load_iris( )  
#定义数据、标签  
X = iris.data  
y = iris.target 

3.3.2 数据预处理

1.数据划分

机器学习的数据,可以划分为训练集、验证集和测试集,也可以划分为训练集和测试集(图3-2)。

图3-2数据集划分

代码示例:

from sklearn.model_selection import train_test_split    
X_train, X_test, y_train, y_test =  train_test_split(X, y, random_state=12, stratify=y,  test_size=0.3)  
#将完整数据集的70%作为训练集,30%作为测试集,并使得测试集和训练集中各类别数据的比例与原始数据集比例一致(stratify分层策略),另外可通过设置shuffle=True 提前打乱数据。 

2.数据变换操作

sklearn.preprocessing模块包含了数据变换的主要操作(表3-5),数据变换的方法如下:

from sklearn.preprocessing import库名称

表3-5使用Scikit-learn进⾏数据变换

预处理操作库名称
标准化StandardScaler
最小最大标准化MinMaxScaler
One-Hot编码OneHotEncoder
归一化Normalizer
二值化(单个特征转换)Binarizer
标签编码LabelEncoder
缺失值填补Imputer
多项式特征生成PolynomialFeatures

代码示例:

#使⽤Scikit-learn进⾏数据标准化  
from sklearn.preprocessing import StandardScaler  
#构建转换器实例  
scaler = StandardScaler( )  
#拟合及转换  
scaler.fit_transform(X_train)  

3.特征选择

特征选择的方法如下:

1. #导入特征选择库  
2. from sklearn import feature_selection as fs  
  • 过滤式(Filter)
1. #保留得分排名前k的特征(top k方式)  
2. fs.SelectKBest(score_func, k)   
3. #交叉验证特征选择  
4. fs.RFECV(estimator, scoring=“r2”)  
  • 封装式(Wrapper),结合交叉验证的递归特征消除法,自动选择最优特征个数:
fs.SelectFromModel(estimator)  
  • 嵌入式(Embedded),从模型中自动选择特征,任何具有coef_或者feature_importances_的基模型都可以作为estimator参数传入。

3.3.3 监督学习算法

1.监督学习算法-回归

表3-6常见的回归模型

回归模型名称库名称
线性回归LinearRegression
岭回归Ridge
LASSO回归Lasso
ElasticNet回归ElasticNet
决策树回归tree.DecisionTreeRegressor

代码示例:

#从线性模型库导入线性回归模型  
from sklearn.linear_model import LinearRegression  
# 构建模型实例  
lr = LinearRegression(normalize=True)  
#训练模型  
lr.fit(X_train, y_train)  
#作出预测  
y_pred = lr.predict(X_test)   

2.监督学习算法-分类

表3-7常见的分类模型

模型名称库名称
逻辑回归linear model.LogisticRearession
支持向量机svm.SVC
朴素贝叶斯naive_bayes.GaussianNB
KNNneighbors.NearestNeighbors
随机森林ensemble.RandomForestClassifier
GBDTensemble.GradientBoostingClassifier

代码示例:

#从树模型库导入决策树  
from sklearn.tree import DecisionTreeClassifier    
#定义模型  
clf = DecisionTreeClassifier(max_depth=5)    
#训练模型  
clf.fit(X_train, y_train)  
#使用决策树分类算法解决二分类问题,得到的是类别  
y_pred = clf.predict(X_test)    
#y_prob 为每个样本预测为“0”和“1”类的概率  
y_prob = clf.predict_proba(X_test)  

3.3.4 无监督学习算法

1.聚类算法

sklearn.cluster模块包含了一系列无监督聚类算法,聚类使用的方法如下:

from sklearn.cluster import库名称

表3-8常见的聚类模型

模型名称库名称
K-meansKMeans
DBSCANDBSCAN
层次聚类AgglomerativeClustering
谱聚类SpectralClustering

代码示例:

#从聚类模型库导入kmeans  
from sklearn.cluster import kmeans  
#构建聚类实例  
kmeans = KMeans(n_clusters=3, random_state=0)  
#拟合  
kmeans.fit(X_train)  
#预测  
kmeans.predict(X_test)  

2.降维算法

Scikit-learn中降维算法都被包括在模块decomposition中,sklearn.decomposition模块本质是一个矩阵分解模块。最常见的降维方法是PCA(主成分分析)。

降维的使用的方法如下:

from sklearn.decomposition import库名称

代码示例:

#导入PCA库  
from sklearn.decomposition import PCA  
#设置主成分数量为3,n_components代表主成分数量  
pca = PCA(n_components=3)  
#训练模型  
pca.fit(X)  
#投影后各个特征维度的方差比例(这里是三个主成分)  
print(pca.explained_variance_ratio_)  
#投影后的特征维度的方差  
print(pca.explained_variance_) 

3.3.5 评价指标

sklearn.metrics模块包含了一系列用于评价模型的评分函数、损失函数以及成对数据的距离度量函数。评价指标主要分为分类评价指标、回归评价指标等等,表3-8列举了常见的几种评价指标。

评价指标使用的方法如下:

from sklearn.metrics import库名称

表3-8常见评价指标

评价指标库名称使用范围
准确率accuracy_score分类
精确率precision_score分类
F1 值f1_score分类
对数损失log_loss分类
混淆矩阵confusion_matrix分类
含多种评价的分类报告classification_report分类
均方误差MSEmean_squared_error回归
平均绝对误差MAEmean_absolute_error回归
决定系数R2r2_score回归

代码示例:

#从评价指标库导入准确率  
from sklearn.metrics import accuracy_score    
#计算样本的准确率  
accuracy_score(y_test, y_pred)  
#对于测试集而言,大部分函数都必须包含真实值y_test和预测值y_pred

3.3.6 交叉验证及超参数调优

1.交叉验证

交叉验证的方法如图3-3,具体原理将在第7章“机器学习实践”中讲解,本章仅讲解使用方法。

图3-3 交叉验证示意图

代码示例:

#从模型选择库导入交叉验证分数  
from sklearn.model_selection import cross_val_score    
clf = DecisionTreeClassifier(max_depth=5)  
#使用5折交叉验证对决策树模型进行评估,使用的评分函数为F1值  
scores = cross_val_score(clf, X_train, y_train,cv=5, scoring=’f1_weighted’) 

此外,Scikit-learn提供了部分带交叉验证功能的模型类如LogisticRegressionCVLassoCV、等,这些类包含CV参数。

2.超参数调优

在机器学习中,超参数是指无法从数据中学习而需要在训练前提供的参数。机器学习模型的性能在很大程度上依赖于寻找最佳超参数集。

超参数调整一般是指调整模型的超参数,这基本上是一个非常耗时的过程。目前主要有 3 种最流行的超参数调整技术:网格搜索、随机搜索和贝叶斯搜索,其中Scikit-learn内置了网格搜索、随机搜索,本章进行简单讲解,其余调参方法如贝叶斯搜索,本章不进行讨论。

(1) 超参数调优⸺网格搜索

代码示例:

#从模型选择库导入网格搜索  
from sklearn.model_selection import GridSearchCV    
from sklearn import svm  
svc = svm.SVC()  
#把超参数集合作为字典  
params = {‘kernel’:[‘linear’, ‘rbf’], ‘C’:[1, 10]}    
#进行网格搜索,使用了支持向量机分类器,并进行五折交叉验证  
grid_search = GridSearchCV(svc, params, cv=5)    
#模型训练  
grid_search.fit(X_train, y_train)    
#获取模型最优超参数组合  
grid_search.best_params_  

在参数网格上进行穷举搜索,方法简单但是搜索速度慢(超参数较多时),且不容易找到参数空间中的局部最优。

(2) 超参数调优⸺随机搜索

代码示例:

#从模型选择库导入随机搜索  
from sklearn.model_selection import RandomizedSearchCV    
from scipy.stats import randint  
svc = svm.SVC()  
#把超参数组合作为字典  
param_dist = {‘kernel’:[‘linear’, ‘rbf’], ‘C’:randint(1, 20)}    
#进行随机搜索  
random_search = RandomizedSearchCV(svc, param_dist, n_iter=10)    
#模型训练  
random_search.fit(X_train, y_train)    
#获取最优超参数组合  
random_search.best_params_  

在参数子空间中进行随机搜索,选取空间中的100个点进行建模(可从scipy.stats常见分布如正态分布norm、均匀分布uniform中随机采样得到),时间耗费较少,更容易找到局部最优。

3.4 Scikit-learn总结

Scikit-learn是基于 Python 语言的机器学习工具,它建立在 NumPy、SciPy、Pandas 和 Matplotlib 之上,被广泛地用于统计分析和机器学习建模等数据科学领域,其主要优点包括:

(1) 建模方便:用户通过Scikit-learn能够实现各种监督和非监督学习的模型,仅仅需要几行代码就可以实现。

(2) 功能多样:使用Scikit-learn还能够进行数据的预处理、特征工程、数据集切分、模型评估等工作。

(3) 数据丰富:内置丰富的数据集,比如:泰坦尼克、鸢尾花等,还可以生成数据,非常方便。

参考文献

[1] PEDREGOSA F, VAROQUAUX G, GRAMFORT A, et al. Scikit-learn: Machine Learning in Python[J]. Journal of Machine Learning Research, 2011, 12: 2825–2830.

本文为黄海广老师的机器学习入门基础的第三章原文。

购书连接:

教师可以向黄海广老师申请教学ppt原版(邮件:haiguang2000@wzu.edu.cn)

代码地址:https://github.com/fengdu78/WZU-machine-learning-course

版权声明

版权属于原作者,仅用于学术分享

文章精选:

  1. 图灵是如何设计出图灵机的,背后的故事和对我们的启发是什么,估计99%的人不知

  2. ChatGPT的工作原理,这篇文章说清楚了

  3. “AI教父”Geoffrey Hinton:智能进化的下一个阶段

  4. 图灵奖得主杨立昆最新访谈:AI威胁论是蒙昧主义,控制欲只有人才有

  5. John Carmack:通向通用人工智能的“少有人走的路”

  6. 不可计算数——数学中的幽灵,揭示了一个深层次的数学哲学问题

  7. 图灵奖得主LeCun:ChatGPT局限巨大,自回归模型寿命不超5年

  8. 信息的本质——随机性,它不是上帝的骰子,而是我们无知的表现

  9. 一个程序员的遗憾:在大学里忽略了数学

  10. AI教父最新MIT万字访谈: 人类可能只是AI演化过程中的一个过渡阶段




Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/155745