python 画损失函数曲线图 sklearn 损失函数_Sklearn 损失函数如何应用到


机器学习是一门需要不断实验和试错的科学,拥有大量的实战经验几乎比拥有一个好的算法还要重要,没有一个机器学习模型能够对所有的问题有效。

因此,想要学好机器学习一定要有非常多的项目练习作为支撑,从实践中探寻机器学习的技法。

但一个机器学习项目的实施需要实践者拥有丰富的机器学习理论并具有将理论知识实践的能力,这让很多机器学习小白望而却步。

本文将利用sklearn中自带的数据集(鸢尾花数据集),并通过逻辑回归算法实现对鸢尾花的分类。

从原理到实战应用,摆脱枯燥的公式,由浅入深,为小白快速上手机器学习实例奠定坚实的基础!

本文包含以下内容:1.机器学习库 scikit-learn2.sklearn的使用与安装

  • 如何使用sklearn
  • sklearn安装

3.上手案例—基于逻辑回归的鸢尾花分类

  • 数据获取
  • 数据预处理
  • 训练模型
  • 模型评估与优化
  • 预测结果

- 机器学习库 sklearn -

scikit-learn简称sklearn,是机器学习中一个常用的python第三方模块,对常用的机器学习算法进行了封装。

支持分类,回归,降维和聚类四大机器学习算法,还包括了数据预处理模型评估两大模块。


python 画损失函数曲线图 sklearn 损失函数_sklearn库安装_02


自2007年发布以来,scikit-learn已经成为Python重要的机器学习库了,sklearn拥有着完善的文档,上手容易,具有着丰富的API,在学术界颇受欢迎。

其中封装了大量的机器学习算法,内置了大量数据集,节省了获取和整理数据集的时间。利用这几大模块的优势,大大的提高机器学习的效率。

- sklearn 使用与安装 -

01 如何使用sklearn

如何学习sklearn?其实最好的教程就是官方文档。sklearn官网:http://scikit-learn.org/stable/index.html

但官方文档非常详细,许多人对官方文档的理解和结构上都不能很好地把握,想要学习但不知从何学起。

其实官方文档非常贴心,如果你仔细查看就会发现官方文档给出了明确的学习路径


python 画损失函数曲线图 sklearn 损失函数_sklearn库安装_03


由图中,可以看到库的算法主要有四类:分类,回归,聚类,降维。其中:·常用的回归:线性、决策树、SVM、KNN ;集成回归:随机森林、Adaboost、GradientBoosting、Bagging、ExtraTrees

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

·常用聚类:k均值(K-means)、层次聚类(Hierarchical clustering)、DBSCAN

·常用降维:LinearDiscriminantAnalysis、PCA蓝色圆圈是判断条件,绿色方框是可以选择的算法,我们可以根据自己的数据特征和任务目标去找一条自己的操作路线。

02 sklearn 安装

使用pip直接安装:


pip install scikit-learn


使用Anaconda安装,推荐Anaconda,因为里面已经内置了NumPy,SciPy等常用工具。


conda install scikit-learn


安装完成后可以在python中检查一下版本,import sklearn不报错,则表示安装成功。


import sklearn
sklearn.__version__


python 画损失函数曲线图 sklearn 损失函数_数据集_04


- 上手案例 -

鸢(yuān )尾花分类相当于机器学习中的Helloworld问题,如果这个问题你能解开了那么说明你机器学习已经入门了。

传统的机器学习任务从开始到建模的一般流程就是:获取数据 — 数据预处理 — 训练模型 — 模型评估 — 预测,分类,我们将根据这个步骤一步一步展开,通过鸢尾花的4个属性预测鸢尾花属于3个种类的哪一类。

01 数据获取

机器学习算法往往需要大量的数据,在skleran中获取数据通常采用两种方式,一种是使用自带的数据集,另一种是创建数据集。

sklearn自带了很多数据集,可以用来对算法进行测试分析,免去了自己再去找数据集的烦恼。

sklearn的自带数据集:

鸢尾花数据集:load_iris()

手写数字数据集:load_digitals()

糖尿病数据集:load_diabetes()

乳腺癌数据集:load_breast_cancer()

波士顿房价数据集:load_boston()

体能训练数据集:load_linnerud()

在这里,我们导入sklearn自带的鸢尾花数据集:


#导入sklearn的数据集
import sklearn.datasets as sk_datasets
iris = sk_datasets.load_iris()
iris_X = iris.data #导入数据
iris_y = iris.target #导入标签

如果你想查看数据集对象的属性和方法:


from sklearn.datasets import load_iris
dir(load_iris())


python 画损失函数曲线图 sklearn 损失函数_sklearn库安装_05


查看数据集描述:


from sklearn.datasets import load_iris
print(load_iris().DESCR)


python 画损失函数曲线图 sklearn 损失函数_python 画损失函数曲线图_06


Iris也称鸢尾花卉数据集,是常用的分类实验数据集,由R.A. Fisher于1936年收集整理的。

该数据集一共包含4个特征变量,1个类别变量。共有150个样本,iris是鸢尾植物,这里存储了其萼片和花瓣的长宽,共4个属性,鸢尾植物分三类。如表17.2所示:


python 画损失函数曲线图 sklearn 损失函数_数据集_07


数据集详细介绍:https://archive.ics.uci.edu/ml/datasets/Iris


02数据预处理

在机器学习中有一句名言:数据和特征决定了机器学习的上限,而模型和算法的应用只是让我们逼近这个上限

数据预处理阶段是机器学习中不可缺少的一环,它会使得数据更加有效的被模型或者评估器识别。

这个阶段主要包括数据预处理数据集划分两个部分。

2.1 数据标准化与普通的数据挖掘不同,机器学习的数据还需要进行数据标准化,包括与样本尺度归一化、正则化等;此外还要根据数据特征进行特征二值化、one-hot编码等操作,这些工作简单可复制,经过数据预处理的数据能够更好地帮助我们进行特征处理。当我们拿到一批原始的数据时,需要思考以下问题:·对连续的数值型特征进行标准化,使得均值为0,方差为1。·对类别型的特征进行one-hot编码。·将需要转换成类别型数据的连续型数据进行二值化。·为防止过拟合或者其他原因,选择是否要将数据进行正则化。·检查有没有缺失值,对确实的特征选择恰当方式进行弥补,使数据完整。......

为了使得训练数据的标准化规则与测试数据的标准化规则同步,preprocessing中提供了很多的Scaler。


from sklearn import preprocessing


2.1.1 区间缩放(Min-Max scaling)

区间缩放法是将原始数据中特征的取值区间转换到[0 1]范围。

公式如下:


python 画损失函数曲线图 sklearn 损失函数_数据集_08


使用preproccessing库的MinMaxScaler类对数据进行区间缩放的代码如下:


from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler(feature_range=(0,1))
iris_X = scaler.fit_transform(iris_X)


python 画损失函数曲线图 sklearn 损失函数_sklearn库安装_09


2.1.2 标准化(standardization)

将特征数据的分布调整成标准正太分布,也叫高斯分布,也就是使得数据的均值维0,方差为1。

公式如下:


python 画损失函数曲线图 sklearn 损失函数_python 画损失函数曲线图_10


使用preproccessing库的StandardScaler类对数据进行标准化的代码如下:


from sklearn.preprocessing import StandardScaler
#标准化,返回值为标准化后的数据
StandardScaler().fit_transform(iris.data)


python 画损失函数曲线图 sklearn 损失函数_python 画损失函数曲线图_11


2.1.3 归一化 (Normalizer)

正则化是将样本在向量空间模型上的一个转换,经常被使用在分类与聚类中。其目的在于样本向量在点乘运算或其他核函数计算相似性时,拥有统一的标准。

使用preproccessing库的Normalizer类对数据进行归一化的代码如下:


from sklearn.preprocessing import Normalizer
#归一化,返回值为归一化后的数据
Normalizer().fit_transform(iris.data)


python 画损失函数曲线图 sklearn 损失函数_数据集_12


2.2 特征二值化

特征二值化的方法是将特征的取值转化为0或1。

例如,在房价预测问题中对于“是否为学区房”这一特征,取值为1表示该房是学区房,反之则为0。

在sklearn中可以设置一个阈值,大于阈值的赋值为1,小于等于阈值的赋值为0。

使用preproccessing库的Binarizer类对数据进行二值化的代码如下:


from sklearn.preprocessing import Binarizer
#二值化,阈值设置为3,返回值为二值化后的数据
Binarizer(threshold=3).fit_transform(iris.data)


python 画损失函数曲线图 sklearn 损失函数_数据集_13


2.3 one-hot编码

one-hot编码是一种对离散特征值的编码方式,在LR模型中常用到,用于给线性模型增加非线性能力。

对于离散特征,例如,性别:{男,女},可以采用one-hot编码的方式将特征表示为一个m维向量,其中m为特征的取值个数。

使用preproccessing库的OneHotEncoder类对数据进行one-hot编码的代码如下:


from sklearn.preprocessing import OneHotEncoder
#对IRIS数据集的目标值进行one-hot编码
OneHotEncoder().fit_transform(iris.target.reshape((-1,1)))


2.4 缺失值计算

在实际应用中,我们得到的数据往往不完整,可以用以下方法进行处理:

·删除:删除含缺失值的数据,缺点是可能会导致信息丢失;·补全:通过已有数据计算相应特征的平均数、中位数、众数等来补全缺失值;·预测:建立一个模型来“预测”缺失的数据;·虚拟变量:引入虚拟变量(dummy variable)来表征是否有缺失,是否有补全;

用preproccessing库的Imputer类对数据进行缺失值计算的代码如下:


from numpy import vstack, array, nan
from sklearn.preprocessing import Imputer
#缺失值计算,返回值为计算缺失值后的数据
#参数missing_value为缺失值的表示形式,默认为NaN
#对数据集新增一个样本,4个特征均赋值为NaN,表示数据缺失
#参数strategy为缺失值填充方式,默认为mean(均值)
Imputer().fit_transform(vstack((array([nan, nan, nan, nan]), iris.data)))


python 画损失函数曲线图 sklearn 损失函数_Sklearn 损失函数如何应用到_14


2.5 数据集划分

在预处理阶段,还需要对数据集进行划分,包括用来训练模型的训练集、以及测试时所使用的测试集。sklearn中的model_selection为我们提供了划分数据集的方法。

鸢尾花数据集划分:


import sklearn.model_selection as sk_model_selection
X_train,X_test,y_train,y_test = sk_model_selection.train_test_split(iris_X,iris_y,train_size=1/3,random_state=0)


参数说明: ·arrays:样本数组,包含特征向量和标签

·test_size:   float-获得多大比重的测试样本   int - 获得多少个测试样本

·train_size: 同test_size ·random_state:int - 随机种子(种子固定,实验可复现) ·shuffle - 是否在分割之前对数据进行洗牌

后面我们训练模型使用的数据集都基于此。

03训练模型

如何为我们的分类问题选择合适的机器学习算法呢?如果我们以预测的准确率为指标,那么最佳的方法是测试不同的算法,然后通过交叉验证选择最好的一个。

但是,如果我们是为问题找到一个“合适”的算法,也可以根据数据的特征来进行选择,

比如鸢尾花数据集分类标签划分为3类(0类、1类、2类),很好的适用于逻辑回归模型,因此下面将使用Scikit-learn官网的逻辑回归模型进行分析。

逻辑回归(Logistic regression)是一种广义的线性回归,通过构造回归函数,来实现分类或者预测。

sklearn为所有模型提供了非常相似的接口,我们可以更加快速的熟悉所有模型的用法。

sklearn API:http://#module-sklearn.preprocessing

LogisticRegression回归模型在Sklearn.linear_model子类下,调用sklearn逻辑回归算法步骤比较简单,即:

(1) 导入模型。调用逻辑回归LogisticRegression()函数。 (2) fit()训练。调用fit(x,y)的方法来训练模型,其中x为数据的属性,y为所属类型。 (3) predict()预测。利用训练得到的模型对数据集进行预测,返回预测结果。


#导入模型
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
#fit()训练
lr = LogisticRegression()
lr.fit(X_train,y_train)
#predict
result = lr.predict(X_test)
print('预测的结果',result)
print('实际的结果',y_test)


输出:


python 画损失函数曲线图 sklearn 损失函数_数据_15


对预测结果与实际数值进行效果对比,验证是否选用该模型,接下来进行模型评估:


python 画损失函数曲线图 sklearn 损失函数_数据集_16


04模型评估与优化

模型评估是准确预测的关键。评估指标是把"尺子",用来评判模型优劣水平的算法,不同的机器学习模型有着不同的"尺子"。

模型的评估和模型的优化相关功能在sklearn.model_select中。

除了使用extimator的score函数简单粗略地评估模型之外,在sklearn.metrics针对不同的问题类型提供了各种评估指标并且可以创建用户自定义的评估指标。

4.1 查看默认参数


#默认参数
params=lr.get_params()
print(params)


python 画损失函数曲线图 sklearn 损失函数_数据_17


参数详解:

·C:惩罚参数,默认值是1.0

·class_weight:

·dual:

·fit_intercept=True

·intercept_scaling=1

·max_iter: 最大迭代次数

·multi_class: 负责多分类问题中分类策略制定

·penalty:

·random_state: 随机种子

·tol: 残差收敛条件,默认是0.0001

·solver :solver参数决定了我们对逻辑回归损失函数的优化方法,有liblinear、lbfgs、newton-cg、sag四种算法可以选择。

4.2 查看模型评分


#模型评分 准确率
s1 = lr.score(X_train,y_train)
s2 = lr.score(X_test,y_test)
print('在训练集上的准确度评分',s1)
print('在测试集上的准确度评分',s2)


python 画损失函数曲线图 sklearn 损失函数_数据集_18


可以看到模型在训练集和测试集上的评分都比较高,训练集上的准确度评分略高于测试集,接下来我们通过交叉验证来评估一下模型的泛化能力,是否能使用该模型进行预测。

4.3 交叉验证

过拟合、欠拟合的模型状态判断是模型诊断中至关重要的一步。常见的方法如:交叉验证,绘制学习曲线等。

·过拟合模型过度拟合,在训练集(training set)上表现好,但是在测试集上效果差。

·欠拟合(高偏差)模型拟合不够,在训练集(training set)上表现效果差,没有充分的利用数据,预测的准确度低。

过拟合的基本调优思路是增加训练的数据量,降低模型复杂度。欠拟合的基本调优思路是提高特征数量和质量,增加模型复杂度。

在此实例中我们可以采用交叉验证的方法评估模型的泛化能力,并且能够有效避免过拟合。

交叉选择验证法是从数据集中按一定比例随机选取若干数据集作为训练集用于模型的训练,并将剩下的数据作为测试集;将测试集数据的自变量输入模型,并将模型输出的预测值与对应数据的因变量进行比较,判断并统计准确率的方法。

sklearn中提供了cross_val_score进行交叉验证,而ShuffleSplit则用来划分数据集的。


X=iris_X
y=iris_y
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import ShuffleSplit
cv_split = ShuffleSplit(n_splits=5, train_size=0.7, test_size=0.2)
score_ndarray = cross_val_score(logisticRegression_model, X, y, cv=cv_split)
print(score_ndarray)
score_ndarray.mean()


cross_val_score参数:·estimator:数据对象

·X:数据

·y:预测数据

·soring:调用的方法

·cv:交叉验证生成器或可迭代的次数

·n_jobs:同时工作的cpu个数(-1代表全部)

·verbose:详细程度

·fit_params:传递给估计器的拟合方法的参数

输出:


python 画损失函数曲线图 sklearn 损失函数_sklearn库安装_19


python 画损失函数曲线图 sklearn 损失函数_数据集_20


返回对象是交叉验证的评分组,5组数据的得分分别是100、96.7%、86.7%、90%、90%,综合评分为92.7%,说明模型分类效果比较好,可以使用该模型。

4.4 模型优化

真正考验水平的是根据对算法的理解调节(超)参数,使模型达到最优。

诊断后的模型需要进行进一步调优,调优后的新模型需要重新诊断,这是一个反复迭代不断逼近的过程,需要不断的尝试,进而达到最优的状态。

sklearn的子模块GridSearchCV, 是用来查找最优参数的常用方法,只需要把参数的候选集输入进去,就会自动的帮你进行排列组合,然后选出得分最高的那一组参数的排列。


#模型目标的参数
from sklearn.model_selection import GridSearchCV
penaltys=['l1','l2']#l1 或l2正则化
cs = [1.0,1.1,1.2,1.3,1.4,1.5]
param_grid = {'penalty':penaltys,'C':cs}
#print(param_grid)
gsc = GridSearchCV(LogisticRegression(),param_grid)
#print(x_train)
gsc.fit(X_train,y_train)

print('最佳模型参数的评分:',gsc.best_score_)
print('最优参数')
best_params = gsc.best_estimator_.get_params()
print(best_params)
for param_name in sorted(param_grid.keys()):
print(param_name,':',best_params[param_name])


输出:


python 画损失函数曲线图 sklearn 损失函数_数据_21


最佳的模型参数评分为98%,接近满分,说明预测的准确度非常高了。

05预测结果

经过优化后的模型已经达到最优状态,准确度也很不错,下面就可以直接进行预测:


#预测为某个类型的概率
result = lr.predict_proba(x_test)


一行数据有三个值,对应三种花的概率,概率最大即预测为该类别:


python 画损失函数曲线图 sklearn 损失函数_数据集_22


经过这一个步骤下来就已经完成了一个简单的机器学习入门案例——基于逻辑回归的鸢尾花分类。

除此之外,鸢尾花数据集还可以利用其它方式进行分类预测,如KNN,决策树、k-近邻等,

你可以根据自己的需求进行针对训练,还可以比较不同算法下的预测准确度。

其实机器学习也只是看上去比较可怕而已,当我们将问题拆解,掌握正确的方法,按照明确的目标一步一步的学习下来,庞大的机器学习体系也非常容易上手。