1. scikit-learn概述
在工程应用中,用python手写代码来从头实现一个算法的可能性非常低,这样不仅耗时耗力,还不一定能够写出构架清晰,稳定性强的模型。更多情况下,是分析采集到的数据,根据数据特征选择适合的算法,在工具包中调用算法,调整算法的参数,获取需要的信息,从而实现算法效率和效果之间的平衡。而sklearn,正是这样一个可以帮助我们高效实现算法应用的工具包。
1.1 技巧介绍
# 技巧1: 缩放处理 from sklearn import preprocessing # feature_range: 设置缩放范围 scaler = preprocessing.MinMaxScaler(feature_range=(-1, 1)) scaler.fit(iris.data) iris.data[:5] """ 输出: array([[5.1, 3.5, 1.4, 0.2], [4.9, 3. , 1.4, 0.2], [4.7, 3.2, 1.3, 0.2], [4.6, 3.1, 1.5, 0.2], [5. , 3.6, 1.4, 0.2]]) """ data = scaler.transform(iris.data) data[:5] """ 输出: array([[-0.55555556, 0.25 , -0.86440678, -0.91666667], [-0.66666667, -0.16666667, -0.86440678, -0.91666667], [-0.77777778, 0. , -0.89830508, -0.91666667], [-0.83333333, -0.08333333, -0.83050847, -0.91666667], [-0.61111111, 0.33333333, -0.86440678, -0.91666667]]) """ # 技巧2:分类模型评分报告 from sklearn.metrics import classification_report # 分类模型评分报告 report = classification_report(target, clf.predict(data), target_names = iris.target_names) print(report) # 输出: """ precision recall f1-score support setosa 1.00 1.00 1.00 50 versicolor 0.92 0.98 0.95 50 virginica 0.98 0.92 0.95 50 accuracy 0.97 150 macro avg 0.97 0.97 0.97 150 weighted avg 0.97 0.97 0.97 150 """ # 技巧3:交叉验证 from sklearn.model_selection import cross_val_score # 采用5折交叉验证 scores = cross_val_score(clf, data, target,c v=5)
1.2 模型保存
# 方法1:使用pickle import pickle model_saved = pickle.dumps(model) # 保存模型成字符串 model_loaded = pickle.loads(model_saved) # 从字符串加载模型 model_loaded.predict(data) # 方法2:使用joblib import joblib joblib.dump(model, 'model_saved_joblib.pkl') # 保存模型到文件 model_loaded = joblib.load('model_saved_joblib.pkl') # 加载模型 model_loaded.predict(data)
1.3 模型优化
优化模型的方法包括: 网格搜索法,随机搜索法,模型特定交叉验证,信息准则优化
1)网格搜索法 GridSearchCV
所谓网格:就是预先通过网格的方式给定每个超参数的可能数值,各种超参数可能的数值,组成了二维网格。网格搜索法在指定的超参数空间中对每一种可能的情况进行交叉验证评分并选出最好的超参数组合。使用网格搜索法或随机搜索法可以对Pipeline进行参数优化,也可以指定多个评估指标。
2)随机搜索法 (RandomizedSearchCV)
随机搜索法和网格搜索法作用类似,但是只在超参数空间中进行指定次数的不同采样。采样次数通过n_iter参数指定,通过调整其大小可以在效率和性能方面取得平衡。其采样方法调用ParameterSampler函数,采样空间必须用字典进行指定。网格搜索法只能在有限的超参数空间进行暴力搜索,但随机搜索法可以在无限的超参数空间进行随机搜索。
2. scikit-learn涵盖内容
四大问题以及算法分类 — 算法工程
分类问题相关算法:把输入数据集,按照指定的类型进行分类。
聚类问题相关算法:把输入数据集,让机器自动发现数据的类型,并进行分类。
回归问题相关算法:用一个特定的曲线拟合数据集中的数据特征。
降维问题相关算法:降低输入数据集的维度,使得复杂问题简化。
算法模型选择:对于特定的现实问题,选择合适的模型
模型初选:针对特定的数据集和要解决的问题,从Scikit-learn支持的众多的模型中初步选择一个模型。
模型训练:用输入数据对模型进行训练
模型评估:对训练后的模型进行评估
模型优化:对训练后的模型进行超参数优化
模型终选:比较各种模型和优化结果,选择最终的模型
数据的预处理 — 特征工程
在把数据送入到模型中进行训练前,需要对数据进行预处理
数据的获取:通过Scikit-learn提供的工具,从外部读取数据到内存,并按照期望的方式组织数据
数据预处理:对于读取的数据进行预处理,如过滤无效数据、对强化、变形等等
特征的提取:从数据中提取特征数据,这些特征数据作为模型的输入(而不是原始的数据)
特征的选择:在众多提取的特征中,根据需要选择一定的特征数据,用于最终模型的训练。
3. scikit-learn数据集获取
- scikit-learn自带数据集介绍:
自带的小数据集:安装后,这些数据集一并安装,xxx.load_xxx()
在线下载的数据集:下载远程数据集
计算机生成的数据集:通过某种数学算法,生成数据集
svmlight/svm格式的数据集: 从文件冲去数据集
mldata.org: 在线下载由mldata.org提供的大型数据集
- 计算机自动生成数据集:
make_blobs 可用于聚类和分类
make_classification 可用于分类
make_circles 可用于分类
make_moons 可用于分类
make_multilabel_classification 可用于多标签分类
make_regression 可用于回归
3.1 生成聚类数据:make_blobs
# 案例1:生成聚类数据:make_blobs from sklearn.datasets import make_blobs # 生成数据 make_blobs # 生成数据集 # n_samples:样本总数 # centers:中心点坐标,与分类数一致 # n_features:分类数 # cluster_std:正态分布的标准方差 # random_state:随机种子,确保每次运行,生成的随机数是一样的 X, labels=make_blobs(n_samples=200,centers=[[1,1],[-1,-1],[1,-1]], n_features=2, cluster_std=0.3, random_state = 0) # 可视化方法1: # 通过pandas可视化数据,np.c_[X,labels]将特征数据与label结合成为一个表格 df = pd.DataFrame(np.c_[X,labels],columns = ['feature1','feature2','labels']) # 生成DataFrame式的表格 # x = df['feature1'] # y = df['feature2'] # s: 设置透明度 # c: 设置每个样本的颜色,类别相同颜色相同 # alpha: 设置透明度 df.plot.scatter('feature1','feature2', s = 100, c = list(df['labels']), cmap = 'rainbow',colorbar = False, alpha = 0.8,title = 'dataset by make_blobs') # 可视化方法2: X, labels=make_blobs(n_samples=200,centers=[[1,1],[-1,-1],[1,-1]], n_features=2, cluster_std=0.3, random_state=42) plt.scatter(X[:,0], X[:,1], c=labels, s=50, alpha=0.9) # 直接生成散点图,比较简单但是样式少
3.2 生成分类数据:make_classification
# 案例2:生成分类数据:make_classification from sklearn.datasets import make_classification # n_samples:样本数 # n_features:特征数目 # n_classes:分类数目 # n_redundant:冗余数 X,labels=make_classification(n_samples=300, n_features=2, n_classes = 2, n_redundant=0, n_informative=2, random_state=0, n_clusters_per_class=2) # 通过np.c_[X,labels]将特征数据与label结合成为一个表格 df = pd.DataFrame(np.c_[X, labels],columns = ['feature1','feature2','labels']) # 将label从浮点型转化为整形,以下两行都可以 # df['labels'].astype(int) df['labels'] = df['labels'].astype('i2') # 可视化展示 df.plot.scatter('feature1','feature2', s = 100, c = list(df['labels']),cmap = 'rainbow',colorbar = False, alpha = 0.8,title = 'dataset by make_classification')
3.3 生成环形数据:make_circles
# 案例3:生成环形数据:make_circles from sklearn.datasets import make_circles # noise: 表示数据的交互程度,数值越到表示两个数据融合得比较充分 # factor: 数据向外的扩张系数,数值越高表示越发散 X,labels=make_circles(n_samples=200,noise=0.05,factor=0.3,random_state=42) # 通过np.c_[X,labels]将特征数据与label结合成为一个表格 df = pd.DataFrame(np.c_[X,labels],columns = ['feature1','feature2','labels']) df.plot.scatter('feature1','feature2', s = 100, c = list(df['labels']),cmap = 'rainbow',colorbar = False, alpha = 0.8,title = 'dataset by make_circles')
3.4 生成回归数据:make_regression
# 案例4: 生成回归数据:make_regression from sklearn.datasets import make_regression # 生成数据集 # n_samples:样本个数 # n_features:输入数据的维度,这里是1维x轴 # n_targets:输出数据的维度,这里是1为y轴 # bias:数据偏置大小 # noise:叠加的噪声大小 # random_state:随机种子 X,Y,coef = make_regression(n_samples=100, n_features=1, n_informative=1, n_targets=1, bias=5, effective_rank=None, tail_strength= 0, noise= 10, shuffle=True, coef=True, random_state=42) # 通过np.c_[X,labels]将特征数据与label结合成为一个表格 df = pd.DataFrame(np.c_[X ,Y],columns = ['X','y']) # 通过xlim与ylim来设置表格的范围 df.plot.scatter('X','y', s = 100, c = "blue", cmap = 'rainbow',colorbar = False, alpha = 0.8,title = 'dataset by make_regression', xlim=(-3, 3), ylim=(-150, 150))
3.5 导入外部的数据集
import numpy as np import pandas as pd # 外部文件名,可以是excel、csv文件,可以是txt文件 df_demo = pd.read_csv('demo.xlsx', encoding='utf-8', names=[['feature1', 'feature2']]) df_demo = pd.read_excel('demo.xlsx', sheet_name=1) # 无需指定编码格式,全部都能读取
参考资料:
博主“文火冰糖的硅基工坊”的专栏——机器学习与scikit-learn