scikit基础与机器学习入门(3)机器学习任务的一般流程——以鸢尾花分类为例

机器学习任务的一般流程

本文以鸢尾花数据集为例,对机器学习人物的一般步骤进行了梳理

下面是baseline

数据的获取/导入

首先导入有关的库

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
from sklearn import datasets

这里导入iris库

iris =  datasets.load_iris()

scikit基础与机器学习入门(3)机器学习任务的一般流程——以鸢尾花分类为例

导入后的数据库是一个字典,其中data类为内容,feature_names为特征名,target为分类

利用内容和特征名构建DataFrame

data = pd.DataFrame(iris.data, columns=iris.feature_names)

scikit基础与机器学习入门(3)机器学习任务的一般流程——以鸢尾花分类为例

可以进行简单的可视化

data.plot()

scikit基础与机器学习入门(3)机器学习任务的一般流程——以鸢尾花分类为例

数据的预处理

一般包括数据标准化,数据归一化,数据二值化,非线性转换,数据特征编码,处理缺失值等

from sklearn import preprocessing
scaler = preprocessing.MinMaxScaler()    #将样本特征值缩放到0,1之间
scaler.fit(iris.data)    #先fit
data = scaler.transform(iris.data)     #再transform,得到输入模型的数据

和前面讲的一样对于这种API都是先fit再transform

被缩放后的数据如图所示

scikit基础与机器学习入门(3)机器学习任务的一般流程——以鸢尾花分类为例

target = iris.target  #作为特征备用

模型的训练

根据问题特点选择适当的估计器estimater模型

  • 分类
  • 回归
  • 聚类
  • 降维

数据集的划分

首先进行数据集的划分

from sklearn.model_selection import train_test_split

划分数据集的方法在model_selection模块中

X_train,X_test,Y_train,Y_test = train_test_split(data,target,test_size=1/3)

参数指测试集所占比例

scikit基础与机器学习入门(3)机器学习任务的一般流程——以鸢尾花分类为例

模型的训练

导入支持向量机进行分类

from sklearn import svm
clf = svm.SVC(kernel = 'linear',C = 1,probability=True)    #导入支持向量机,设定参数
clf.fit(X_train,Y_train)

用这种方法简单地检查一下正确率,为零的就是判断无误的

scikit基础与机器学习入门(3)机器学习任务的一般流程——以鸢尾花分类为例

可以用get_params方法获取模型有关参数

clf.get_params()

scikit基础与机器学习入门(3)机器学习任务的一般流程——以鸢尾花分类为例

也可以获取每一种可能的概率,此时需要导入模型时的probability=True

clf.predict_proba(X_test)

scikit基础与机器学习入门(3)机器学习任务的一般流程——以鸢尾花分类为例

利用cf.score对模型进行评分

clf.score(X_test,Y_test)
#对不同类型的模型有不同的评分算法,由score内部决定

scikit基础与机器学习入门(3)机器学习任务的一般流程——以鸢尾花分类为例

模型的评估

模型的评估和模型的优化相关功能再sklearn.model_selection中 除了使用estimator的score函数简单评估之外,在sklearn.metrics模块提供了各种评估指标并且可以创建用户自定义的评估值

详细的评估方法

from sklearn.metrics import classification_report
print(classification_report(target,clf.predict(data),target_names = iris.target_names))

scikit基础与机器学习入门(3)机器学习任务的一般流程——以鸢尾花分类为例

多折交叉验证

from sklearn.model_selection import cross_val_score
scores = cross_val_score(clf, data, target, cv=5)    # cv后的数目是折数
scores

scikit基础与机器学习入门(3)机器学习任务的一般流程——以鸢尾花分类为例

得到一个数组,分别是每次交叉验证的值

所以可得到结论

print('Accuracy: %0.2f(+/-%0.2f)'%(scores.mean(),scores.std()*2))

假设结果呈正态分布

模型的优化

优化模型的方法包括:网格搜索法,随机搜索法,模型特定交叉验证,信息准则优化

网格搜索法在指定的超参数空间中对每一种可能的情况进行交叉验证评分并选出最好的超参数组合

这里用网格搜索法来搜索最佳参数

from sklearn import svm
from sklearn.model_selection import GridSearchCV
svc = svm.SVC()   #注意,这里没有参数

设置备择参数

param_grid = [{'C':[0.1, 1, 10, 100, 1000],'kernel':['linear']},
             {'C':[0.1, 1, 10, 100, 1000],'gamma':[0.001,0.01],'kernel':['rbf']}]

设置寻优标准

scoring = 'accuracy'

然后进行网格搜索

clf = GridSearchCV(svc, param_grid,scoring = scoring, cv=10)
clf.fit(data,target)

scikit基础与机器学习入门(3)机器学习任务的一般流程——以鸢尾花分类为例

得到的是一个优化的分类器

clf.predict(data)

scikit基础与机器学习入门(3)机器学习任务的一般流程——以鸢尾花分类为例

可以利用get_params()进行参数查询

{'cv': 10,
'error_score': nan,
'estimator__C': 1.0,
'estimator__break_ties': False,
'estimator__cache_size': 200,
'estimator__class_weight': None,
'estimator__coef0': 0.0,
'estimator__decision_function_shape': 'ovr',
'estimator__degree': 3,
'estimator__gamma': 'scale',
'estimator__kernel': 'rbf',
'estimator__max_iter': -1,
'estimator__probability': False,
'estimator__random_state': None,
'estimator__shrinking': True,
'estimator__tol': 0.001,
'estimator__verbose': False,
'estimator': SVC(),
'iid': 'deprecated',
'n_jobs': None,
'param_grid': [{'C': [0.1, 1, 10, 100, 1000], 'kernel': ['linear']},
 {'C': [0.1, 1, 10, 100, 1000], 'gamma': [0.001, 0.01], 'kernel': ['rbf']}],
'pre_dispatch': '2*n_jobs',
'refit': True,
'return_train_score': False,
'scoring': 'accuracy',
'verbose': 0}

利用best_params_和best_score_进行最优参数的搜索

clf.best_params_

scikit基础与机器学习入门(3)机器学习任务的一般流程——以鸢尾花分类为例

clf.best_score_

scikit基础与机器学习入门(3)机器学习任务的一般流程——以鸢尾花分类为例

模型持久化

对于保存的模型,如果要保存,通常采取以下方式

import pickle
s = pickle.dumps(clf) #保存模型为字符串
clf2 = pickle.loads(s) #从字符串中加载模型

其中s是一个字符串

scikit基础与机器学习入门(3)机器学习任务的一般流程——以鸢尾花分类为例

利用第三方库一般是这种流程,可以用这个过程做一个模板,具体问题进行具体修改

上一篇:【机器学习实战】 支持向量机


下一篇:scilit基础和机器学习入门(12) 模型的优化