机器学习任务的一般流程
本文以鸢尾花数据集为例,对机器学习人物的一般步骤进行了梳理
下面是baseline
数据的获取/导入
首先导入有关的库
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
from sklearn import datasets
这里导入iris库
iris = datasets.load_iris()
导入后的数据库是一个字典,其中data类为内容,feature_names为特征名,target为分类
利用内容和特征名构建DataFrame
data = pd.DataFrame(iris.data, columns=iris.feature_names)
可以进行简单的可视化
data.plot()
数据的预处理
一般包括数据标准化,数据归一化,数据二值化,非线性转换,数据特征编码,处理缺失值等
from sklearn import preprocessing
scaler = preprocessing.MinMaxScaler() #将样本特征值缩放到0,1之间
scaler.fit(iris.data) #先fit
data = scaler.transform(iris.data) #再transform,得到输入模型的数据
和前面讲的一样对于这种API都是先fit再transform
被缩放后的数据如图所示
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)
参数指测试集所占比例
模型的训练
导入支持向量机进行分类
from sklearn import svm
clf = svm.SVC(kernel = 'linear',C = 1,probability=True) #导入支持向量机,设定参数
clf.fit(X_train,Y_train)
用这种方法简单地检查一下正确率,为零的就是判断无误的
可以用get_params方法获取模型有关参数
clf.get_params()
也可以获取每一种可能的概率,此时需要导入模型时的probability=True
clf.predict_proba(X_test)
利用cf.score对模型进行评分
clf.score(X_test,Y_test)
#对不同类型的模型有不同的评分算法,由score内部决定
模型的评估
模型的评估和模型的优化相关功能再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))
多折交叉验证
from sklearn.model_selection import cross_val_score
scores = cross_val_score(clf, data, target, cv=5) # cv后的数目是折数
scores
得到一个数组,分别是每次交叉验证的值
所以可得到结论
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)
得到的是一个优化的分类器
clf.predict(data)
可以利用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_
clf.best_score_
模型持久化
对于保存的模型,如果要保存,通常采取以下方式
import pickle
s = pickle.dumps(clf) #保存模型为字符串
clf2 = pickle.loads(s) #从字符串中加载模型
其中s是一个字符串
利用第三方库一般是这种流程,可以用这个过程做一个模板,具体问题进行具体修改