skleran-处理流程

获取数据

以用sklearn的内置数据集, 先导入datasets模块.

最经典的iris数据集作为例子.

  1. from sklearn import datasets
  2. iris = datasets.load_iris() # 导入数据集, json格式
  3. X = iris.data # 获取特征向量
  4. y = iris.target # 获取样本标签
  5. print('特征向量:', X[:3])
  6. print("样本标签:", y[40:60])
  1. 特征向量: [[5.1 3.5 1.4 0.2]
  2. [4.9 3. 1.4 0.2]
  3. [4.7 3.2 1.3 0.2]]
  4. 样本标签: [0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1]

手写数字数据集 (load_digits)

包含1797个0-9的手写数字数据, 每个数据由8 x 8大小的矩阵构成, 矩阵中值的范围是0-16, 代表颜色的深度.

  1. digits = datasets.load_digits()
  2. print('特征向量shape:', digits.data.shape)
  3. print('目标值shape:', digits.target.shape)
  4. print('图片形状:', digits.images.shape)
  1. 特征向量shape: (1797, 64)
  2. 目标值shape: (1797,)
  3. 图片形状: (1797, 8, 8)
  1. # 显示如下
  2. import matplotlib.pyplot as plt
  3. from sklearn.datasets import load_digits
  4. digits = load_digits()
  5. # plt.matshow(digits.images[1]) # 下标索引
  6. # plt.show()

创建数据集

除了用sklearn自带的数据集外, 也可以自己创建训练样本.

参考: https://scikit-learn.org/stable/datasets/

  1. # eg. 用分类问题的样本生成器举例
  2. from sklearn.datasets.samples_generator import make_classification
  3. # n_samples: 样本数
  4. # n_features: 特征数
  5. # n_classes: 几分类
  6. # random_state: 随机种子, 使得随机状态可重复
  7. X, y = make_classification(
  8. n_samples=6,
  9. n_features=5,
  10. n_informative=2,
  11. n_redundant=2,
  12. n_classes=2,
  13. n_clusters_per_class=2,
  14. scale=1.0,
  15. random_state=20
  16. )
  17. # test
  18. for x, y in zip(X, y):
  19. print(y, end=': ')
  20. print(x)
  1. 0: [-0.6600737 -0.0558978 0.82286793 1.1003977 -0.93493796]
  2. 1: [ 0.4113583 0.06249216 -0.90760075 -1.41296696 2.059838 ]
  3. 1: [ 1.52452016 -0.01867812 0.20900899 1.34422289 -1.61299022]
  4. 0: [-1.25725859 0.02347952 -0.28764782 -1.32091378 -0.88549315]
  5. 0: [-3.28323172 0.03899168 -0.43251277 -2.86249859 -1.10457948]
  6. 1: [ 1.68841011 0.06754955 -1.02805579 -0.83132182 0.93286635]

用sklearn.datasets.make_blobs生成聚类测试数据

make_blobs()会根据用户指定的特征数量, 中心点数, 范围等来生成基类数据.

输入:

  • n_samples: 样本量(row)
  • n_features: 数据的维数(columns)
  • centers: 数据中心点(int, 个数) or 坐标值
  • cluster_std: 分布的标准差

输出

  • X, [n-samples, n_features]形状的样本矩阵
  • y, [n_samples]形状的数据, 表示每个点(row)的标签(类别)
  1. from sklearn.datasets import make_blobs
  2. from matplotlib import pyplot as plt
  3. # 生成一个100x2, center=5的样本, 2维是为方便可视化
  4. # cluster_std: 为每个类别设置不同方差
  5. data, lable = make_blobs(n_samples=100, n_features=2, centers=5, cluster_std=[0,1,2,1,3])
  6. # 可视化这100个2维的点
  7. # ndarray: [row, column], 下标从0开始
  8. # plt.scatter(data[:, 0], data[:,1], c=lable)

用sklearn.datasets.make_classification生成分类数据

输入:

  • n_features
  • n_infomative: 多信息特征个数
  • n_redundant: 容易信息
  • n_repeated: 重复信息
  • n_classes: 分类类别
  • n_cluster_per_class: 某一个类别是有几个cluster组成的

用make_gaussian和make_hastie_10_2生成数据

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

  1. # from matplotlib import pyplot as plt
  2. # from sklearn.datasets import make_classification
  3. # from sklearn.datasets import make_gaussian_quantiles # 高斯分布
  4. # from sklearn.datasets import make_blobs, make_hastie_10_2
  5. # plt.figure(figsize=(9,9))
  6. # plt.subplots_adjust(bottom=0.05, top=0.8, left=0.05, right=0.95)
  7. # plt.subplot(111)
  8. # plt.title("One informative feature, one cluster per class", fontsize='small')
  9. # X1, Y1 = make_classification(n_samples=1000,n_features=2, n_redundant=0, n_informative=1,
  10. # n_clusters_per_class=1)
  11. # plt.scatter(X1[:, 0], X1[:, 1], marker='o', c=Y1)
  12. # plt.subplot(222)
  13. # plt.title("Two informative features, one cluster per class", fontsize='small')
  14. # X1, Y1 = make_classification(n_samples=1000,n_features=2, n_redundant=0, n_informative=2,
  15. # n_clusters_per_class=1, n_classes=3)
  16. # plt.scatter(X1[:, 0], X1[:, 1], marker='o', c=Y1)
  17. # 不画了, 画图其实没多大意思还麻烦
  18. # plt.show()

数据预处理 preprocessing

其实就是为了消除数值数据的量纲, 即通常说的归一化, 标准化等

from sklearn import preprocessing

  • StandardScaler -> scale()
  • MaxAbsScaler -> maxabs_scale()
  • MinMaxScaler -> minmax_sclale()
  • RobusSclaler -> robust_scale()
  • Normalizer -> normaizer()

sklearn.preprocessing.scale(X)

标准化

\[X' = \frac{X-\mu}{\sigma}
\]

即用特征值减去均值, 除以标准差

fit

用来计算训练数据的均值和方差等.

fit_transform

基于fit再进一步来转换训练数据, 从而将数据转换为标准的正态分布

transform

只是对训练数据进行转换.通常是先fit, 再transform

  1. from sklearn import preprocessing
  2. data = [[1,2],[2,1],[1,1],[0,0]]
  3. scaler = preprocessing.StandardScaler()
  4. scaler.fit(data)
  5. scaler.transform(data)
  1. StandardScaler(copy=True, with_mean=True, with_std=True)
  1. array([[ 0. , 1.41421356],
  2. [ 1.41421356, 0. ],
  3. [ 0. , 0. ],
  4. [-1.41421356, -1.41421356]])

最小-最大规范化

对原始数据进行线性变换,变换到[0,1]区间

\[X' = \frac{X-X_{min}}{X_{max} - X_{min}}
\]

  1. scaler = preprocessing.MinMaxScaler()
  2. # 对训练数据 fit+transform, 对测试数据只transform
  3. # scaler.fit(train_data)
  4. scaler.transform(train_data)
  5. scaler.transform(test_data)

规范化(normalize)

就是向量的标准化嘛, 先求出样本的p范数, 然后用每个点都的值除以该范数. 即将不同变化范围的值映射到相同的固定范围, 最常见的是[0,1]

  1. X = [
  2. [1,2,3],
  3. [4,5,6],
  4. [7,8,9]
  5. ]
  6. preprocessing.normalize(X)
  1. array([[0.26726124, 0.53452248, 0.80178373],
  2. [0.45584231, 0.56980288, 0.68376346],
  3. [0.50257071, 0.57436653, 0.64616234]])

one-hot 编码

是对离散特征值的编码方式, 这个对于文本, 简直太重要了

  1. data = [['a', 'b', 'c'], ['c', 'd', 'f']]
  2. encoder = preprocessing.OneHotEncoder().fit(data)
  3. encoder.transform(data).toarray()
  1. array([[1., 0., 1., 0., 1., 0.],
  2. [0., 1., 0., 1., 0., 1.]])

标签编码

  1. x = ['今晚', '月色', '真美', '真美']
  2. lable = preprocessing.LabelEncoder().fit(x)
  3. lable.transform(x)
  1. array([0, 1, 2, 2], dtype=int64)

数据集拆分

将数据集拆分为4部分: X_train, X_test, y_train, y_test

  1. from sklearn.model_selection import train_test_split
  2. x_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=20)

训练模型(API)

说到调api, 兄嘚, 这是我的强项呀, 工作也是, 工作任务上尽可能不造轮子, 直接调api或C,V. 真的发现自己, 从不生产代码, 只想做代码的搬运工.

咋搬运呢? Python一切皆对象吗,这些封装不就是在一个个的类里面嘛, 即实例化一个类对象, 然后就用方法呀,这对我太熟悉了.

  1. # 0. 特征工程
  2. # 1. 实例化一个模型对象
  3. model = ModelClassName()
  4. # 2. 训练模型
  5. model.fit(X_train, y_train)
  6. # 3. 模型预测
  7. model.predict(X_test)
  8. # 4. 模型评分
  9. model.score(X_test, y_test)
  10. # 5. 查看模型参数
  11. model.get_params()
  12. # 6. 模型优化(超参数, 重写特征工程)
  13. # 7. 反复调参....
  14. # 8. 保存模型

常用模型api

线性回归

  1. from sklearn.linear_model import LinearRegression
  2. model = LinearRegression()
  3. # 参数
  4. # fit_intercept: 是否计算截距, default True
  5. # normalize: 归一化
  6. # n_jobs: 指定线程数

逻辑回归LR

  1. from sklearn.linear_model import LogisticRegression
  2. model = LogisticRegression()
  3. # 参数
  4. # penalty: 默认L2正则化
  5. # dual: n_samples > n_features 取False
  6. # C: 该值与正则化强度呈反比
  7. # random_state: 随机数生成器(保留相同采样值次数)
  8. # fit_intercept: 是否需要常量

朴素贝叶斯(Naive Bayes)

  1. from sklearn import naive_bayes
  2. m1 = naive_bayes.MultinomialNB() # 用于文本分类
  3. m2 = naive_bayes.GaussianNB() # 高斯贝叶斯
  4. m3 = naive_bayes.BernoulliNB() # 伯努利概型
  5. # 参数
  6. # alpha: 平滑参数, 不让分母为0, 服从拉普拉斯分布
  7. # fit_prior: 使用学习类的先验概率, false: 使用同一的先验概率
  8. # class_prior: 指定类的先验概率
  9. # binarize: 二值化阀值,若为None, 则假设输入有二进制向量组成

决策树DT

  1. from sklearn import tree
  2. model = tree.DecisionTreeClassifier()
  3. # 参数
  4. # criterion: 算法选择, 如ID3, CART4, 基尼...
  5. # max_depth: 数的最大深度, None-尽量下分
  6. # min_samples_split: 分裂内部节点,所需最小样本数
  7. # .....

支持向量机SVM

  1. from sklearn.svm import SVC
  2. model = SVC(C=1.0, kernel='rbf', gamma='auto')
  3. # C: 误差项惩罚数c
  4. # gamma: 核相关系数

K近邻算法KNN

  1. from sklearn import neighbors
  2. m1 = neighbors.KNeighborsClassifier() # 分类
  3. m2 = neighbors.KNeighborsRegressor() # 回归
  4. # 参数
  5. # n_neighbors: 使用邻居的数目...

多层感知机(神经网络)

  1. from sklearn.neural_network import MLPClassifier
  2. m1 = MLPClassifier(activation='relu', solver='adam')
  3. # 参数
  4. # hidden_layer_sizes: (n,m)元组, n个隐藏单元, m个隐藏层
  5. # activation: 激活函数
  6. # solver: 优化算法(lbfgs, sgd, adam)
  7. # alpha: L2惩罚参数

交叉验证

什么5折交叉验证, 网格搜索的, 这部分, 就是调参的过程, 就不展开了, 总之, 耐心和恒心, 总会获得收获的.


保存模型

保存为pickle文件

  1. import pickle
  2. # 保存模型
  3. with open('model.pickle', 'wb') as f:
  4. pickle.dump(model, f)
  5. # 读取模型
  6. with open('model.pickle', 'rb') as f:
  7. model = pickle.load(f)
  8. # call
  9. model.predict(X_test)

sklean 自带方法 joblib

  1. from sklearn.externals import joblib
  2. # 保存模型
  3. joblib.dump(model, 'model.pickle')
  4. # 载入模型
  5. model = joblib.load('model.picle')
  6. # call
  7. model.predict(X_test)

模型评分

  1. 模型的score方法: 调用自己模型
  1. print(model.score(X_test, y_test))
  1. sklearn指标函数, 如常用的classification_report方法
  2. 支持自定义开发的评价方法

集中交叉验证的方式比较

train_test_split

  1. from sklearn.datasets import load_breast_cancer
  2. from sklearn.model_selection import train_test_split
  3. from sklearn.linear_model import LogisticRegression
  4. import matplotlib.pyplot as plt
  5. import warnings
  6. warnings.filterwarnings('ignore') # 忽略警告信息
  7. # 获取数据
  8. cancer = load_breast_cancer()
  9. X_train, X_test, y_train, y_test = train_test_split(
  10. cancer.data, cancer.target, test_size=0.30)
  11. # 训练模型
  12. logstic = LogisticRegression().fit(X_train, y_train)
  13. # score
  14. print('score:', round(logstic.score(X_test, y_test),3))
  1. score: 0.947

k-fold cross validation

  1. from sklearn.datasets import load_iris
  2. from sklearn.model_selection import StratifiedKFold, cross_val_score
  3. from sklearn.linear_model import LogisticRegression
  4. import warnings
  5. warnings.filterwarnings('ignore')
  6. iris = load_iris()
  7. lg = LogisticRegression()
  8. k_fold = StratifiedKFold(n_splits=3, shuffle=False)
  9. scores = cross_val_score(lg, iris.data, iris.target, cv=k_fold)
  10. print('scores:', scores)
  11. print('mean_scores:', round(scores.mean()))
  1. scores: [0.96078431 0.92156863 0.95833333]
  2. mean_scores: 1.0

复盘一篇讲sklearn库的文章(下)的更多相关文章

  1. 复盘一篇讲sklearn库学习文章(上)

    认识 sklearn 官网地址: https://scikit-learn.gor/stable/ 从2007年发布以来, scikit-learn已成为重要的Python机器学习库, 简称sklea ...

  2. 复盘一篇浅谈KNN的文章

    认识-什么是KNN KNN 即 K-nearest neighbors, 是一个hello world级别, 但被广泛使用的机器学习算法, 中文叫K近邻算法, 是一种基本的分类和回归方法. KNN既可 ...

  3. ESP8266开发之旅 网络篇⑨ HttpClient——ESP8266HTTPClient库的使用

    授人以鱼不如授人以渔,目的不是为了教会你具体项目开发,而是学会学习的能力.希望大家分享给你周边需要的朋友或者同学,说不定大神成长之路有博哥的奠基石... QQ技术互动交流群:ESP8266&3 ...

  4. ESP8266开发之旅 网络篇⑪ WebServer——ESP8266WebServer库的使用

    授人以鱼不如授人以渔,目的不是为了教会你具体项目开发,而是学会学习的能力.希望大家分享给你周边需要的朋友或者同学,说不定大神成长之路有博哥的奠基石... QQ技术互动交流群:ESP8266&3 ...

  5. ESP8266开发之旅 网络篇⑫ 域名服务——ESP8266mDNS库

    1. 前言     前面的博文中,无论是作为client端还是server端,它们之间的通信都是通过具体的IP地址来寻址.通过IP地址来寻址,本身就是一个弊端,用户怎么会去记住这些魔法数字呢?那么有没 ...

  6. 前两篇转载别人的精彩文章,自己也总结一下python split的用法吧!

    前言:前两篇转载别人的精彩文章,自己也总结一下吧! 最近又开始用起py,是为什么呢? 自己要做一个文本相似度匹配程序,大致思路就是两个文档,一个是试题,一个是材料,我将试题按每题分割出来,再将每题的内 ...

  7. 一篇关于PHP性能的文章

    一篇关于PHP性能的文章 昨晚清理浏览器收藏夹网址时,发现了http://www.phpbench.com/,想起来应该是2015年发现的一个比较性能的文章,我就点进去看了看,发现还是全英文耶,刚好最 ...

  8. 2.sklearn库中的标准数据集与基本功能

    sklearn库中的标准数据集与基本功能 下面我们详细介绍几个有代表性的数据集: 当然同学们也可以用sklearn机器学习函数来挖掘这些数据,看看可不可以捕捉到一些有趣的想象或者是发现: 波士顿房价数 ...

  9. 1.sklearn库的安装

    sklearn库 sklearn是scikit-learn的简称,是一个基于Python的第三方模块.sklearn库集成了一些常用的机器学习方法,在进行机器学习任务时,并不需要实现算法,只需要简单的 ...

随机推荐

  1. 关于System.InvalidOperationException异常

    什么是InvalidOperationException 操作无效异常.当方法调用对对象的当前状态无效时引发的异常. 继承 Object Exception SystemException Inval ...

  2. ML学习笔记(1)

    2019/03/09 16:16 归一化方法: 简单放缩(线性归一化):这种归一化方法比较适用在数值比较集中的情况.这种方法有个缺陷,如果max和min不稳定,很容易使得归一化结果不稳定,使得后续使用 ...

  3. Ajax运用与分页

    目录 django与ajax的分页处理 ajax + sweetAlert 实现再次确认: 批量数据插入 分页: django与ajax的分页处理 ajax + sweetAlert 实现再次确认: ...

  4. wordpress nginx详细环境配置安装命令和相关问题解决

    很详细的有关WordPress和nginx的环境配置安装操作步骤 指南,适合新手一步步按照命令操作安装WordPress并运行在生产环境中. 操作步骤转载自: Heap Stack blog(ping ...

  5. Qt QThread两种方式的使用:1-继承QThread重写run函数; 2- 继承QObject并moveToThread && 消息和槽在线程和依附线程间的传递

    2019年08月18日起笔 方式一:继承QThread重写run函数 MyThread.h ----------------------------------- ... class MyThread ...

  6. 记一次Mysql事务隔离级别的坑

    最近在写代码调试时,遇到了一个问题. 遇到问题 具体操作如下: 1.调用方法A,并且方法A加上了@Transactional事务注解. 2.在方法A内部,查询并更新某个字段F的值. 3.处理其他逻辑. ...

  7. Certification information不能过大

    /* If certification information is too big this event can't be transmitted as it would cause failure ...

  8. Linux系统查看是32位还是64位

    uname -a 如果是64位机器,会输出x86_64

  9. 【Activiti学习之八】Spring整合Activiti

    环境 JDK 1.8 MySQL 5.6 Tomcat 8 idea activiti 5.22 activiti-explorer是官方提供的一个演示项目,可以使用页面管理Activiti流程.ac ...

  10. JavaScript如何实现日期的前一天后一天转变

    1.生成时间 var data =new Date(); 2.获得时间戳     什么是时间戳? 时间戳是指格林威治时间自1970年1月1日(00:00:00 GTM)至当前时间的总秒数.它也被称为U ...