Python中机器学习神器——sklearn模块

关注
Python中机器学习神器——sklearn模块www.shan-machinery.com参考文章

Python机器学习笔记:sklearn库的学习 ML神器:sklearn的快速使用

机器学习与Sklearn的初识

传统的机器学习任务从开始到建模的一般流程是:获取数据 → 数据预处理 → 训练建模 → 模型评估 → 预测,分类。 在这里插入图片描述

Skikit-learn算法库

在这里插入图片描述 由图中,可以看到库的算法主要有四类:分类,回归,聚类,降维。其中:

常用的回归:线性、决策树、SVM、KNN ;常用的分类:线性、决策树、SVM、KNN,朴素贝叶斯;既可以回归也可以分类的算法:随机森林、Adaboost、GradientBoosting、Bagging、ExtraTrees;常用聚类:k均值(K-means)、层次聚类(Hierarchical clustering)、DBSCAN;常用降维:LinearDiscriminantAnalysis、PCA。

流程图代表:蓝色圆圈是判断条件,绿色方框是可以选择的算法,我们可以根据自己的数据特征和任务目标去找一条自己的操作路线。

sklearn中包含众多数据预处理和特征工程相关的模块,虽然刚接触sklearn时,大家都会为其中包含的各种算法的广度深度所震惊,但其实sklearn六大板块中有两块都是关于数据预处理和特征工程的,两个板块互相交互,为建模之前的全部工程打下基础。 在这里插入图片描述

模块preprocessing:几乎包含数据预处理的所有内容模块Impute:填补缺失值专用模块feature_selection:包含特征选择的各种方法的实践模块decomposition:包含降维算法 sklearn的快速使用

传统的机器学习任务从开始到建模的一般流程是: 获取数据 → 数据预处理 → 训练建模 → 模型评估 → 预测,分类。 本文我们将依据传统机器学习的流程,看看在每一步流程中都有哪些常用的函数以及它们的用法是怎么样的。 下面,我们开始一步步介绍

1. 获取数据 1.1 导入sklearn数据集

sklearn中包含了大量的优质的数据集,在我们学习机器学习的过程中,我们可以使用这些数据集实现出不同的模型,从而提高我们的动手实践能力,同时这个过程也可以加深对理论知识的理解和把握。除了引入数据之外,我们还可以通过**load_sample_images()**来引入图片。 首先,要使用sklearn中的数据集,必须导入datasets模块。

from sklearn import datasets

下面两个图中包含了大部分sklearn中的数据集,调用方式也图中给出, 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 这里我们使用iris的数据来举个例子,表示导出数据集:

iris = datasets.load_iris() # 导入数据集X = iris.data # 获得其特征向量y = iris.target # 获得样本label

注意,在0.18版本后,新增了一个功能:return_X_y=False 这个参数什么意思呢?就是控制输出数据的结构,若选为TRUE,则将因变量和自变量独立导出,我们看例子:

from sklearn.datasets import load_iris X, y = load_iris(return_X_y=True)print(X.shape, y.shape, type(X))data = load_iris(return_X_y=False)print(type(data))

结果:

(150, 4) (150,)

上面的代码可以直接运行,因为sklearn中自带这个数据集。

1.2 创建数据集

我们除了可以使用sklearn自带的数据集,还可以自己去创建训练样本。 在这里插入图片描述

在这里插入图片描述 下面我们拿分类问题的样本生成器举例子:

from sklearn.datasets.samples_generator import make_classificationX, y = make_classification(n_samples=6, n_features=5, n_informative=2, n_redundant=2, n_classes=2, n_clusters_per_class=2, scale=1.0, random_state=20)# n_samples:指定样本数# n_features:指定特征数# n_classes:指定几分类# random_state:随机种子,使得随机状可重

例子:

from sklearn.datasets.samples_generator import make_classificationX, y = make_classification(n_samples=6, n_features=5, n_informative=2, n_redundant=2, n_classes=2, n_clusters_per_class=2, scale=1.0, random_state=20)for x_, y_ in zip(X, y):print(y_, end=': ')print(x_)

结果:

0: [-0.6600737-0.0558978 0.822867931.1003977-0.93493796]1: [ 0.4113583 0.06249216 -0.90760075 -1.412966962.059838]1: [ 1.52452016 -0.018678120.209008991.34422289 -1.61299022]0: [-1.257258590.02347952 -0.28764782 -1.32091378 -0.88549315]0: [-3.283231720.03899168 -0.43251277 -2.86249859 -1.10457948]1: [ 1.688410110.06754955 -1.02805579 -0.831321820.93286635] 1.2.1 用sklearn.datasets.make_blobs来生成数据

scikit中的make_blobs方法常被用来生成聚类算法的测试数据,直观地说,make_blobs会根据用户指定的特征数量,中心点数量,范围等来生成几类数据,这些数据可用于测试聚类算法的效果。

sklearn.datasets.make_blobs(n_samples=100, n_features=2, centers=3,cluster_std=1.0, center_box=(-10.0, 10.0), shuffle=True, random_state=None)[source]

输入:

n_samples表示产生多少个数据n_features表示数据是几维centers表示数据点中心,可以输入int数字,代表有多少个中心,也可以输入几个坐标(fixed center locations)cluster_std表示分布的标准差

返回值:

X,[n_samples, n_features]形状的数组,代表产生的样本y,[n_samples]形状的数组,代表每个点的标签(类别)

例子(生成三类数据用于聚类(100个样本,每个样本2个特征)): 这个包自带这个数据集

from sklearn.datasets import make_blobsimport matplotlib.pyplot as pltdata, label = make_blobs(n_samples=100, n_features=2, centers=5)# 绘制样本显示plt.scatter(data[:, 0], data[:, 1], c=label)plt.show()

结果: 在这里插入图片描述 为每个类别设置不同的方差,只需要在上述代码中加入cluster_std参数即可:

from sklearn.datasets import make_blobsimport matplotlib.pyplot as plt# 每个样本有几个属性或者特征n_features = 2data, target = make_blobs(n_samples=100, n_features=2, centers=3, cluster_std=[1.0, 2.0, 3.0])# 在2D图中绘制样本,每个样本颜色不同plt.scatter(data[:, 0], data[:, 1], c=target)plt.show()

结果: 在这里插入图片描述

1.2.2 用sklearn.datasets.make_classification来生成数据

通常用于分类算法

sklearn.datasets.make_classification(n_samples=100, n_features=20,n_informative=2, n_redundant=2,n_repeated=0, n_classes=2,n_clusters_per_class=2, weights=None,flip_y=0.01, class_sep=1.0, hypercube=True,shift=0.0, scale=1.0, shuffle=True, random_state=None)

输入:

n_features :特征个数= n_informative() + n_redundant + n_repeatedn_informative:多信息特征的个数n_redundant:冗余信息,informative特征的随机线性组合n_repeated :重复信息,随机提取n_informative和n_redundant 特征n_classes:分类类别n_clusters_per_class :某一个类别是由几个cluster构成的 1.2.3 用sklearn.datasets.make_gaussian和make_hastie_10_2来生成数据

利用高斯分位点区分不同数据

sklearn.datasets.make_gaussian_quantiles(mean=None, cov=1.0, n_samples=100, n_features=2, n_classes=3,shuffle=True, random_state=None)

利用Hastie算法,生成二分类数据

sklearn.datasets.make_hastie_10_2(n_samples=12000, random_state=None)

例子:

import matplotlib.pyplot as pltfrom sklearn.datasets import make_classificationfrom sklearn.datasets import make_blobsfrom sklearn.datasets import make_gaussian_quantilesfrom sklearn.datasets import make_hastie_10_2#创建图幅plt.figure(figsize=(8, 8))plt.subplots_adjust(bottom=0.05, top=0.9, left=0.1, right=0.95, wspace=0.15, hspace=0.5)#图1plt.subplot(421)plt.title("One informative feature, one cluster per class", fontsize='small')X1, Y1 = make_classification(n_samples=1000, n_features=2, n_redundant=0, n_informative=1, n_clusters_per_class=1)plt.scatter(X1[:, 0], X1[:, 1], marker='o', c=Y1)#图2plt.subplot(422)plt.title("Two informative features, one cluster per class", fontsize='small')X1, Y1 = make_classification(n_samples=1000, n_features=2, n_redundant=0, n_informative=2, n_clusters_per_class=1)plt.scatter(X1[:, 0], X1[:, 1], marker='o', c=Y1)#图3plt.subplot(423)plt.title("Two informative features, two clusters per class", fontsize='small')X2, Y2 = make_classification(n_samples=1000, n_features=2, n_redundant=0, n_informative=2)plt.scatter(X2[:, 0], X2[:, 1], marker='o', c=Y2)#图4plt.subplot(424)plt.title("Multi-class, two informative features, one cluster",fontsize='small')X1, Y1 = make_classification(n_samples=1000, n_features=2, n_redundant=0, n_informative=2, n_clusters_per_class=1, n_classes=3)plt.scatter(X1[:, 0], X1[:, 1], marker='o', c=Y1)#图5plt.subplot(425)plt.title("Three blobs", fontsize='small')X1, Y1 = make_blobs(n_samples=1000, n_features=2, centers=3)plt.scatter(X1[:, 0], X1[:, 1], marker='o', c=Y1)#图6plt.subplot(426)plt.title("Gaussian divided into four quantiles", fontsize='small')X1, Y1 = make_gaussian_quantiles(n_samples=1000, n_features=2, n_classes=4)plt.scatter(X1[:, 0], X1[:, 1], marker='o', c=Y1)#图7plt.subplot(427)plt.title("hastie data ", fontsize='small')X1, Y1 = make_hastie_10_2(n_samples=1000)plt.scatter(X1[:, 0], X1[:, 1], marker='o', c=Y1)plt.show()

结果: 在这里插入图片描述 调图位置函数: matplotlib.pyplot.subplots_adjust

1.2.4 用sklearn.datasets.make_circles和make_moons来生成数据

生成环线数据

sklearn.datasets.make_circles(n_samples=100, shuffle=True, noise=None, random_state=None, factor=0.8)

factor:外环和内环的尺度因子 n_features取False(默认)C:正则化强度的反映,值越小正则化强度越大n_jobs: 指定线程数random_state:随机数生成器fit_intercept:是否需要常量 4.3 朴素贝叶斯算法NB(Naive Bayes) from sklearn import naive_bayesmodel = naive_bayes.GaussianNB()#高斯贝叶斯model = naive_bayes.MultinomialNB(alpha=1.0, fit_prior=True, class_prior=None)#多项式贝叶斯model = naive_bayes.BernoulliNB(alpha=1.0, binarize=0.0, fit_prior=True, class_prior=None)#伯努利贝叶斯

文本分类问题常用MultinomialNB 参数:

alpha:平滑参数fit_prior:是否要学习类的先验概率;false-使用统一的先验概率class_prior:是否指定类的先验概率;若指定则不能根据参数调整binarize:二值化的阈值,若为None,则假设输入由二进制向量组成 4.4 决策树DT from sklearn import treemodel = tree.DecisionTreeClassifier(criterion='gini', max_depth=None,min_samples_split=2, min_samples_leaf=1,min_weight_fraction_leaf=0.0, max_features=None,random_state=None, max_leaf_nodes=None,min_impurity_decrease=0.0, min_impurity_split=None,class_weight=None, presort=False)

参数:

criterion:特征选择准则gini/entropymax_depth:树的最大深度,None-尽量下分min_samples_split:分裂内部节点,所需要的最小样本树min_samples_leaf:叶子节点所需要的最小样本数max_features:寻找最优分割点时的最大特征数max_leaf_nodes:优先增长到最大叶子节点数min_impurity_decrease:如果这种分离导致杂质的减少大于或等于这个值,则节点将被拆分。 4.5 支持向量机SVM from sklearn.svm import SVCmodel = SVC(C=1.0, kernel='rbf', gamma='auto')

参数:

C:误差项的惩罚参数Cgamma: 核相关系数。浮点数,If gamma is ‘auto’ then 1/n_features will be used instead. 4.6 k近邻算法KNN from sklearn import neighbors#定义kNN分类模型model = neighbors.KNeighborsClassifier(n_neighbors=5, n_jobs=1)# 分类model = neighbors.KNeighborsRegressor(n_neighbors=5, n_jobs=1)# 回归

参数:

n_neighbors: 使用邻居的数目n_jobs:并行任务数 4.7 多层感知器(神经网络) from sklearn.neural_network import MLPClassifier# 定义多层感知机分类算法model = MLPClassifier(activation='relu', solver='adam', alpha=0.0001)

参数:

hidden_layer_sizes: 元祖activation:激活函数solver :优化算法{‘lbfgs’, ‘sgd’, ‘adam’}alpha:L2惩罚(正则化项)参数。 5,模型评估与选择

评价指标针对不同的机器学习任务有不同的指标,同一任务也有不同侧重点的评价指标。以下方法,sklearn中都在sklearn.metrics类下,务必记住哪些指标适合分类,哪些适合回归。 机器学习常用的评估指标请参考博文:Python机器学习笔记:常用评估模型指标的用法

5.1 交叉验证 from sklearn.model_selection import cross_val_scorecross_val_score(model, X, y=None, scoring=None, cv=None, n_jobs=1)

参数:

model:拟合数据的模型cv:k-foldscoring:打分参数—— ‘accuracy’、 ‘f1’、 ‘precision’、 ‘recall’、 ‘roc_auc’、 'neg_log_loss’等等 5.2 检验曲线

使用检验曲线,我们可以更加方便的改变模型参数,获取模型表现。

from sklearn.model_selection import validation_curvetrain_score, test_score = validation_curve(model, X, y, param_name, param_range, cv=None, scoring=None, n_jobs=1)

参数:

model:用于fit和predict的对象X, y:训练集的特征和标签param_name:将被改变的参数的名字param_range: 参数的改变范围cv:k-fold

返回值:

train_score:训练集得分(array)test_score:测试集得分(array) 6,保存模型

最后,我们可以将我们训练好的model保存到本地,或者放到线上供用户使用,那么如何保存训练好的model呢?主要有下面两种方式:

6.1 保存为pickle文件 import pickle# 保存模型with open('model.pickle', 'wb') as f:model = pickle.dump(model, f)# 读取模型with open('model.pickle', 'rb') as f:model = pickle.load(model, f)model.predict(X_test) 6.2 sklearn自带方法joblib from sklearn.externals import joblib# 保存模型model = joblib.dump(model, 'model.pickle')# 载入模型model = joblib.load(model, 'model.pickle') 7,模型评分

1、模型的score方法:最简单的模型评估方法就是调用模型自己的方法:

# 预测y_predict = knnClf.predict(x_test)print("score on the testdata:",knnClf.score(x_test,y_test))

2、sklearn的指标函数:库提供的一些计算方法,常用的有classification_report方法; 3、sklearn也支持自己开发评价方法。

https://www.shan-machinery.com